Modifica della riga di Gridview: associazione dynamic a DropDownList

Sto cercando di ottenere un GridView di ASP.NET 3.5 per mostrare un valore selezionato come stringa quando viene visualizzato e per mostrare un DropDownList per permettermi di scegliere un valore da un determinato elenco di opzioni durante la modifica. Sembra abbastanza semplice?

Il mio gridview appare così (semplificato):

    <asp:Label ID="lblPbxTypeCaption" runat="server" Text='' />       

La griglia viene visualizzata in modo OK quando non si trova in modalità di modifica: il tipo di PBX selezionato mostra il suo valore nell’asp: controllo Label. Nessuna sorpresa lì.

Carico l’elenco di valori per DropDownList in un membro locale chiamato _pbxTypes nell’evento OnLoad del modulo. Ho verificato questo: funziona, i valori ci sono.

Ora la mia sfida è: quando la griglia entra in modalità di modifica per una particolare riga, ho bisogno di bind la lista dei PBX memorizzati in _pbxTypes .

Abbastanza semplice, pensavo: basta prendere l’object elenco a RowEditing nell’evento RowEditing e albind l’elenco:

 protected void grvSecondaryLocations_RowEditing(object sender, GridViewEditEventArgs e) { grvSecondaryLocations.EditIndex = e.NewEditIndex; GridViewRow editingRow = grvSecondaryLocations.Rows[e.NewEditIndex]; DropDownList ddlPbx = (editingRow.FindControl("ddlPBXTypeNS") as DropDownList); if (ddlPbx != null) { ddlPbx.DataSource = _pbxTypes; ddlPbx.DataBind(); } .... (more stuff) } 

Il problema è che non ho mai ricevuto nulla dalla chiamata FindControl , sembra che ddlPBXTypeNS non esista (o non possa essere trovato).

Cosa mi manca ?? Deve essere qualcosa di veramente stupido … ma finora, tutto il mio googling, la lettura dei controlli di GridView e la richiesta di amici non hanno aiutato.

Chi può individuare il link mancante? 😉

Abbastanza facile … Stai sbagliando, perché con quell’evento il controllo non è lì:

 protected void gv_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow && (e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit) { // Here you will get the Control you need like: DropDownList dl = (DropDownList)e.Row.FindControl("ddlPBXTypeNS"); } } 

Vale a dire, sarà valido solo per un DataRow (la riga effettiva con i dati) e se è in modalità Modifica … perché si modifica solo una riga alla volta. e.Row.FindControl("ddlPBXTypeNS") troverà solo il controllo che desideri.

Sto usando un ListView invece di un GridView in 3.5. Quando l’utente desidera modificare, ho impostato l’elemento selezionato del menu a discesa sul valore esistente di quella colonna per il record. Sono in grado di accedere al menu a discesa nell’evento ItemDataBound. Ecco il codice:

 protected void listViewABC_ItemDataBound(object sender, ListViewItemEventArgs e) { // This stmt is used to execute the code only in case of edit if (((ListView)(sender)).EditIndex != -1 && ((ListViewDataItem)(e.Item)).DisplayIndex == ((ListView)(sender)).EditIndex) { ((DropDownList)(e.Item.FindControl("ddlXType"))).SelectedValue = ((MyClass)((ListViewDataItem)e.Item).DataItem).XTypeId.ToString(); ((DropDownList)(e.Item.FindControl("ddlIType"))).SelectedValue = ((MyClass)((ListViewDataItem)e.Item).DataItem).ITypeId.ToString(); } } 
 protected void grvSecondaryLocations_RowEditing(object sender, GridViewEditEventArgs e) { grvSecondaryLocations.EditIndex = e.NewEditIndex; DropDownList ddlPbx = (DropDownList)(grvSecondaryLocations.Rows[grvSecondaryLocations.EditIndex].FindControl("ddlPBXTypeNS")); if (ddlPbx != null) { ddlPbx.DataSource = _pbxTypes; ddlPbx.DataBind(); } .... (more stuff) } 

La risposta verificata da Balexandre funziona alla grande. Ma creerà un problema se adattato ad altre situazioni.

L’ho usato per cambiare il valore di due controlli etichetta – lblEditModifiedBy e lblEditModifiedOn – quando stavo modificando una riga, in modo che ModifiedBy e ModifiedOn corretti venissero salvati nel db su ‘Aggiorna’.

Quando ho fatto clic sul pulsante “Aggiorna”, nell’evento RowUpdating sono stati visualizzati i nuovi valori inseriti nell’elenco OldValues . Avevo bisogno dei veri “vecchi valori” come valori Original_ durante l’aggiornamento del database. (C’è un ObjectDataSource collegato a GridView .)

La correzione a ciò sta usando il codice di balexandre, ma in una forma modificata nell’evento gv_DataBound :

 protected void gv_DataBound(object sender, EventArgs e) { foreach (GridViewRow gvr in gv.Rows) { if (gvr.RowType == DataControlRowType.DataRow && (gvr.RowState & DataControlRowState.Edit) == DataControlRowState.Edit) { // Here you will get the Control you need like: ((Label)gvr.FindControl("lblEditModifiedBy")).Text = Page.User.Identity.Name; ((Label)gvr.FindControl("lblEditModifiedOn")).Text = DateTime.Now.ToString(); } } } 

Puoi usare SelectedValue:

     
           <%# Container .DataItemIndex+1 %>.&nbsp     <%----%>      <%----%>       <%-- --%>      <%-- --%>       <%--  --%>