163 messaggi dal 09 aprile 2009
Ciao a tutti,
mi sono incartato su un problema, spero tanto che qualcuno riesca a darmi una mano per farmi capire come procedere :)
In pratica sto realizzato un'applicazione a 3 livelli: nel BAL dell'applicazione ho un metodo che si chiama getAllTipologie()
public tipologiaVALUE getAllTipologie()
{

tipologiaVALUE tipoVA = new tipologiaVALUE();
DataTable t = new DataTable();
t = _tipologiaDAO.SelectAllTipologie();

foreach (DataRow r in t.Rows)
{
tipoVA._IDTipologia = Int32.Parse(r["id"].ToString());
tipoVA.Tipologia = r["tipologia"].ToString();
}
return tipoVA;

}

Il problema nasce quando vado a fare il bind dell'oggetto nel gridview:(utilizzo il metodo row_created)
private void LoadTipologie()
{
tipovalue = new tipologiaVALUE();
tipovalue = tipobal.getAllTipologie();


gridTipologie.DataSource = tipovalue;
gridTipologie.DataBind();

}
protected void gridTipologie_RowCreated(object sender, GridViewRowEventArgs e)
{
if ((((e.Row.RowState == DataControlRowState.Normal) || (e.Row.RowState == DataControlRowState.Alternate)) && (e.Row.RowType == DataControlRowType.DataRow)))
{
DataRowView r = (DataRowView)e.Row.DataItem;
if (r != null)
{

Label tipologia = (Label)e.Row.FindControl("lbTipologia");
tipologia.Text = tipovalue.Tipologia;

ImageButton lkb = (ImageButton)e.Row.FindControl("ImageButton1");
lkb.ToolTip = "elimina";
lkb.Attributes.Add("onclick", "return confirm('Sei sicuro di voler eliminare la tipologia: " + tipovalue.Tipologia + "?'" + ");");

}

}
}
L'errore è: l tipo dell'origine dati non è valido. Deve essere IListSource, IEnumerable o IDataSource.
Come me la sbrigo?

grazie

Saluti
The Seventh Seal
383 messaggi dal 23 aprile 2007
dal tuo codice, direi che il problema sta nel fatto che il metodo getAllTipologie non restituisce una collezione di oggetti ma un singolo oggetto (da cui l'errore).

Per eseguire il databind ad una griglia ti serve una collezione.
Modificato da historyX il 28 marzo 2013 17.31 -
163 messaggi dal 09 aprile 2009
Quindi come dovrei impostare la cosa, non mi sono mai cimentato nelle collezioni

grazie

Saluti
The Seventh Seal
383 messaggi dal 23 aprile 2007
allora, anzitutto dovresti spiegarmi perchè fai il databind di un singolo item, cioè: se c'è un motivo o meno.

Un modo per modificare il metodo è il seguente:
public List<tipologiaVALUE> getAllTipologie()
{


DataTable t = new DataTable();
t = _tipologiaDAO.SelectAllTipologie();

List<tipologiaVALUE> list = new List<tipologiaVALUE>();

foreach (DataRow r in t.Rows)
{
tipologiaVALUE tipoVA = new tipologiaVALUE();
tipoVA._IDTipologia = Int32.Parse(r["id"].ToString());
tipoVA.Tipologia = r["tipologia"].ToString();

list.add(tipoVa)
}
return list;

}

Considera che ho scritto il codice qui su aspitalia, per cui il case potrebbe essere errato ma il succo è lo stesso.

Per le List credo tu debba importare il namespace:
System.collection.Generics.

Sergio
163 messaggi dal 09 aprile 2009
Ci sono riuscito :
public List<tipologiaVALUE> GetEmpList()
{
tipologiaVALUE tipoVA = new tipologiaVALUE();
DataTable t = new DataTable();
t = _tipologiaDAO.SelectAllTipologie();

List<tipologiaVALUE> empList = new List<tipologiaVALUE>();
foreach (DataRow r in t.Rows)
empList.Add(new tipologiaVALUE(Convert.ToInt32(r["id"]),r["tipologia"].ToString()));

return empList;

E nel gridView
private void LoadTipologie()
{
tipovalue = new tipologiaVALUE();

gridTipologie.DataSource = tipobal.GetEmpList();
gridTipologie.DataBind();

}
Modificato da seventh_seal il 28 marzo 2013 17.09 -

Saluti
The Seventh Seal
163 messaggi dal 09 aprile 2009
Ti chiedo ancora una cosa, e cioè con questo tipo di approccio non è possibile gestire gli eventi della griglia tipo:

if ((e.Row.RowState == (DataControlRowState.Edit | DataControlRowState.Alternate)) | (e.Row.RowState == (DataControlRowState.Edit | DataControlRowState.Normal)))
{
DataRowView r1 = (DataRowView)e.Row.DataItem;
if (r1 != null)

ecc.....

giusto?

quindi qual'è il modo per avere il controllo sulla griglia a runtime?
Modificato da seventh_seal il 28 marzo 2013 17.11 -

Saluti
The Seventh Seal
383 messaggi dal 23 aprile 2007
sfrutta l'evento RowDataBound del gridview. Viene generato appena eseguito un binding sulla singola riga(ricorda che la prima riga è l'header).

qui trovi un esempio:
http://stackoverflow.com/questions/9666844/gridview-rowdatabound
163 messaggi dal 09 aprile 2009
Ciao,
ho un problema con il delete di una riga del gridview.
<ItemTemplate>
<asp:LinkButton ID="btnDelete" runat="server" CommandArgument='<%#Eval("_IDTipologia")%>' OnCommand="lnkDelete" Text="ELIMINA">
</asp:LinkButton>
</ItemTemplate>

Nel codebehind il metodo del delete è:
protected void lnkDelete(Object sender, EventArgs e)
{
LinkButton btn = (LinkButton)sender;
GridViewRow row = (GridViewRow)btn.NamingContainer;


int key = Convert.ToInt32(gridTipologie.DataKeys[row.RowIndex].Value);
tipologiaBAL tipo = new tipologiaBAL();
tipo.DeleteTipologia(key);
LoadTipologie();

}
Quando clicco sul delete l'applicazione và in errore ( Riferimento a un oggetto non impostato su un'istanza di oggetto) evidenziando l'ultima riga dell'itemcreated:
protected void gridTipologie_RowCreated(object sender, GridViewRowEventArgs e)
{
tipovalue = new tipologiaVALUE();
if (e.Row.RowType == DataControlRowType.DataRow)
{
tipovalue = e.Row.DataItem as tipologiaVALUE;
LinkButton lkb = (LinkButton)e.Row.FindControl("btnDelete");
lkb.ToolTip = "elimina";
lkb.Attributes.Add("onclick", "return confirm('Sei sicuro di voler eliminare la tipologia: " + tipovalue.Tipologia + "?'" + ");");
}
}

Saluti
The Seventh Seal

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.