LinkButton in GridView

giovedì 15 gennaio 2009 - 14.04

hexstudy Profilo | Newbie

Salve a tutti

Io ho una gridview dove aggiungo dinamicamente le colonne, questo avviene nel Page_Init.

L'ultima colonna di questa Grid contiene 2 LinkButton uno per entrare in edit e uno per cancellare

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Se effettuo un postback tramite il tasto aggiorna tutto funziona alla perfezione, ma se premo uno di questi link la grid non viene ricreata correttamente inserendo tutti i campi vuoti come se non effettuasse il DataBind e di conseguenza non mi genera l'evento del link.

Qualcuno sa come posso fare?

Grazie mille.

rossimarko Profilo | Guru

Ciao,

hai impostato correttamente i command name dei pulsanti (http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.buttonfield.commandname.aspx) ?

Per far fare la delete alla griglia ad esempio il commandName deve essere "Delete"

Come hai impostato il DataSource? Con un datasourceID o impostando da codice la proprietà e richiamando il DataBind() ?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

hexstudy Profilo | Newbie

Il datasource lo setto da codice e poi richiamo il DataBind() anche in caso di postback

Il comando è settato con CommandName = "Contacts.Edit" e "Contacts.Delete" e poi il controllo ha una funzione Page_Command dove riceve l'evento che viene gestito.

rossimarko Profilo | Guru

Il command name allora non è corretto. Nel link che ti ho mandato ci sono i nomi corretti. "Delete", "Edit" ecc.

Poi dovrai intercettare l'evento scatenato dal command e rieseguire il databind per modificare il comportamento della griglia
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

hexstudy Profilo | Newbie


1062x147 21Kb


Ho fatto come hai detto ma fa sempre la stessa cosa (vedi immagine)

Tag code:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Codice C#
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); m_sMODULE = "Contacts"; // 11/26/2005 Paul. Add fields early so that sort events will get called. grdMain.DynamicColumns("Accounts.Contacts"); grdMain.RowCommand += new GridViewCommandEventHandler(grdMain_RowCommand); } void grdMain_RowCommand(object sender, GridViewCommandEventArgs e) { throw new NotImplementedException(); }

rossimarko Profilo | Guru

Devi implementare anche gli eventi.. Altrimenti la griglia non modifica il suo comportamento. Di solito lo fa in automatico solo se imposti un datasourceID, altrimenti devi gestire tutto te.

Ti giro un esempio molto semplice per l'edit:

ASPX:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Codice:
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { grid.DataSource = GetDataSource(); grid.DataBind(); } } protected void grid_RowEditing(object sender, GridViewEditEventArgs e) { grid.EditIndex = e.NewEditIndex; grid.DataSource = GetDataSource(); grid.DataBind(); } private DataTable GetDataSource() { DataTable dt = new DataTable(); dt.Columns.Add("Colonna1"); dt.Columns.Add("Colonna2"); dt.Rows.Add(new object[] { "a", "a" }); dt.Rows.Add(new object[] { "b", "b" }); dt.Rows.Add(new object[] { "c", "c" }); dt.Rows.Add(new object[] { "d", "d" }); return dt; }
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

hexstudy Profilo | Newbie

Grazie per l'esempio.

Purtroppo io non devo far fare l'edit del record direttamente nella griglia.

Ma il link edit mi devi rimandare ad una pagina e il cancella deve richiamare un storeprocedure per cancellare il record.

Quello che era scritto era basato sull'uso del DataGrid ma ora non funziona più e non riesco a capire il perchè.

rossimarko Profilo | Guru

Allora nell'evento rowediting dovrai inserire il codice che manda alla nuova pagina...

Hai provato ad intercettare l'evento? Viene scatenato correttamente?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

hexstudy Profilo | Newbie

Ho provato ma nulla

Ho notato questa cosa, io ho dinamicamente inserito delle colonne con delle classi ITemplate.

Come sai queste classi hanno una funzione InstantiateIn questa funzione non viene richiamata dopo il DataBind quando premo Edita.

Questo ovviamente non fa creare i controlli che non possono scatenare l'evento.


MODOFICATO 09:46

Ho eliminato la generazione delle colonne dinamiche e mi genera sempre la colonna con i comandi e funziona tutto!!!

Quindi il problema è perchè la DataBind non richiama InstantiateIn!!!

MODIFICATO 10:11

Trovato!!! Avevo impostato EnableViewState = true quindi il mio databind non ricreava tutti i campi ora tutto funziona correttamente!!!
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5