Formview con objectdatasource - problema in update di checkbox

sabato 06 gennaio 2007 - 11.02

Pao Profilo | Newbie

Ho un formview agganciato ad un objectdatasource.
Funziona tutto bene, ma ho un problema su una checkbox: quando sono in edit mode e clicco su update, non viene aggiornato il campo checkbox (nessun errore viene visualizzato).
Il campo di MySql agganciato al checkbox è un campo stringa di tipo ENUM('True','False') default 'False'.

Ecco la formview:

<asp:FormView ID="fwAgente" runat="server"
AllowPaging="True"
DataKeyNames="ID"
DataSourceID="AgenteDataSource">
<ItemTemplate>
<table>
<tr><td align="right"><b>ID:</b></td> <td><%# Eval("ID") %></td></tr>

<tr><td align="left" style="height: 21px"><b>Nome:</b></td><td style="width: 5px; height: 21px"><%# Eval("Nome") %></td></tr>
<tr><td align="left"><b>Cognome:</b></td> <td style="width: 5px"><%# Eval("Cognome") %></td></tr>
<tr><td align="left"><b>Telefono:</b></td> <td style="width: 5px"><%# Eval("Telefono") %></td></tr>
<tr>
<td style="width:7%">Annullato: </td>
<td style="width:6%">
<asp:CheckBox ID="chkAnnAg" runat="server" Enabled="false"
Checked ='<%# Convert.ToBoolean(Eval("annullato")) %>' />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="EditButton"
Text="Edit"
CommandName="Edit"
RunAt="server"/>
&nbsp;
<asp:LinkButton ID="NewButton"
Text="New"
CommandName="New"
RunAt="server"/>
&nbsp;
<asp:LinkButton ID="DeleteButton"
Text="Delete"
CommandName="Delete"
RunAt="server"/>
</td>
</tr>
</table>
</ItemTemplate>

<EditItemTemplate>
<table>
<tr><td align="right"><b>ID:</b></td>
<td><asp:TextBox ID="EditIDTextBox" Enabled="false"
Text='<%# Bind("ID") %>'
RunAt="Server" /></td></tr>

<tr><td align="right"><b>Nome:</b></td>
<td><asp:TextBox ID="EditNomeTextBox"
Text='<%# Bind("Nome") %>'
RunAt="Server" /></td></tr>
<tr><td align="right"><b>Cognome:</b></td>
<td><asp:TextBox ID="EditCognomeTextBox"
Text='<%# Bind("Cognome") %>'
RunAt="Server" /></td></tr>
<tr><td align="right"><b>Telefono:</b></td>
<td><asp:TextBox ID="EditTelefonoTextBox"
Text='<%# Bind("Telefono") %>'
RunAt="Server" /></td></tr>

<tr><td align="right"><b>Annullato:</b></td>
<td style="width:6%">
<asp:CheckBox ID="chkAnnAg" runat="server" Enabled="true"
Checked ='<%# Convert.ToBoolean(Eval("annullato")) %>' />
</td>
</tr>

<tr>
<td colspan="2">
<asp:LinkButton ID="UpdateButton"
Text="Update"
CommandName="Update"
RunAt="server"/>
&nbsp;
<asp:LinkButton ID="CancelUpdateButton"
Text="Cancel"
CommandName="Cancel"
RunAt="server"/>
</td>
</tr>
</table>
</EditItemTemplate>
<InsertItemTemplate>
<table>
<tr><td align="right"><b>Login:</b></td>
<td><asp:TextBox ID="InsertLoginTextBox"
Text='<%# Bind("Login") %>'
RunAt="Server" /></td></tr>

<tr><td align="right"><b>Nome:</b></td>
<td><asp:TextBox ID="InsertNomeTextBox"
Text='<%# Bind("Nome") %>'
RunAt="Server" /></td></tr>

<tr><td align="right"><b>Cognome:</b></td>
<td><asp:TextBox ID="InsertCognomeTextBox"
Text='<%# Bind("Cognome") %>'
RunAt="Server" /></td></tr>

<tr><td align="right"><b>Telefono:</b></td>
<td><asp:TextBox ID="InsertTelefonoTextBox"
Text='<%# Bind("Telefono") %>'
RunAt="Server" /></td></tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton"
Text="Insert"
CommandName="Insert"
RunAt="server"/>
&nbsp;
<asp:LinkButton ID="CancelInsertButton"
Text="Cancel"
CommandName="Cancel"
RunAt="server"/>
</td>
</tr>
</table>
</InsertItemTemplate>
</asp:FormView>


Ecco l'objectdatasource:


<asp:ObjectDataSource ID="AgenteDataSource" runat="server"
DataObjectTypeName="Reminder.Agente"
TypeName="Reminder.Agente"
DeleteMethod="Delete"
InsertMethod="Insert"
SelectMethod="GetDataTable"
UpdateMethod="Update" OldValuesParameterFormatString="original_{0}"
OnUpdated="AgenteDataSource_Updated"
OnObjectCreated = "genteDataSource_ObjectCreated"

OnInserted="AgenteDataSource_Updated"
OnDeleted="AgenteDataSource_Updated"
>
<SelectParameters>
<asp:Parameter Name="vId" Type="String" />
<asp:Parameter Name="vAnn" Type="String" />
</SelectParameters>
</asp:ObjectDataSource>


Ecco la dichiarazione dell'oggetto:


public class Agente
{
private MySqlConnection cnn = new MySqlConnection();
protected int _id;
protected string _login;
protected string _nome;
protected string _cognome;
protected string _telefono;
protected string _annullato;
protected string _loginmod;

//public Agente(string login, string nome, string cognome, string telefono)
public Agente()
{}

public int ID
{
get { return _id; }
set { _id = value; }
}
public string Login
{
get { return _login; }
set { _login = value; }
}
public string Nome
{
get {return _nome;}
set { _nome = value; }
}
public string Cognome
{
get { return _cognome; }
set { _cognome = value; }
}
public string Telefono
{
get { return _telefono; }
set { _telefono = value; }
}
public string Annullato
{
get { return _annullato; }
set { _annullato = value.ToString(); }
}


Ecco il metodo Update dell'oggetto Agente:


public void Update(Agente _A)
{
Agente AgNow = new Agente(); //AgNow=dati presenti adesso da aggiornare
AgNow.AutoLoadByID(_A.ID);

//aggiorno i dati di AgNow con quelli dell'update se presenti
//if (_A.ID != null) AgNow.ID = _A.ID;
if (_A.Login != null) AgNow.Login = _A.Login;
if (_A.Nome != null) AgNow.Nome = _A.Nome;
if (_A.Cognome != null) AgNow.Cognome = _A.Cognome;
if (_A.Telefono != null) AgNow.Telefono = _A.Telefono;
if (_A._annullato != null) AgNow.Annullato = _A.Annullato;

MySqlCommand cmd = new MySqlCommand();
if (cnn.ConnectionString == string.Empty)
cnn.ConnectionString = ConfigurationManager.ConnectionStrings["reminder_local"].ToString();
cmd.Connection = cnn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new MySqlParameter("P_ID", AgNow.ID));
cmd.Parameters.Add(new MySqlParameter("P_login", AgNow.Login));
cmd.Parameters.Add(new MySqlParameter("P_nome", AgNow.Nome));
cmd.Parameters.Add(new MySqlParameter("P_cognome", AgNow.Cognome));
cmd.Parameters.Add(new MySqlParameter("P_telefono", AgNow.Telefono));
cmd.Parameters.Add(new MySqlParameter("P_annullato", AgNow.Annullato));
cmd.Parameters.Add(new MySqlParameter("P_loginmod", Glob.vLogin));
cmd.CommandText = "spUpdateAgente";

try
{
if (cnn.State == ConnectionState.Closed)
cnn.Open();
cmd.ExecuteNonQuery();
cnn.Close();
}
catch (MySqlException Exception)
{ throw (Exception); }
}

freeteo Profilo | Guru

ciao,
l'errore sta nel fatto che nell'editTemplate di quel campo non hai messo che il campo "Annullato" sia in "bind" ma solo in "eval".
La differenza sta nel fatto che Eval è in sola lettura diciamo, ovvero visualizza il valore bindato, mentre il "bind" è bidirezionale, quindi quello che è presente viene poi salvato sul database...prova a mettere il Bind nell'edit template quindi, altrimenti non verra' mai passato all'objectdataSource per essere aggiornato sul db...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Pao Profilo | Newbie

ciao Matteo grazie dell'interessamento

avevo provato anch'io col Bind (Checked ='<%# Bind("annullato") %>'), ma mi dava errore di cast non valido in quanto gli arriva una stringa e la deve convertire in boolean

alla fine ho risolto mantenendo l'Eval col Convert.ToBoolean e modificando la proprietà "Annullato" nell'evento OnUpdating del FormView:

protected void AgenteDataSource_OnUpdating(object sender, ObjectDataSourceMethodEventArgs e)
{
Agente _a = (Agente)e.InputParameters[0];
CheckBox _c = (CheckBox)fwAgente.FindControl("chkAnnAg");

if (_c.Checked)
_a.Annullato = "True";
else
_a.Annullato = "False";
}


in questo modo modifico la proprietà prima di darla in pasto al metodo di update.

E' un po' macchinoso ma funziona, se trovi una soluzione + semplice fammelo sapere!!
ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5