Problemi a trovare controllo web all'interno di GridView TemplateField
-
18-09-2019 - |
Domanda
Ok, sto avendo problemi di ottenere il valore di una DropDownList che è dentro di un TemplateField durante l'aggiornamento il mio GridView. Originariamente Stavo usando l'evento RowCommand per controllare il nome del comando e quindi eseguire l'attività appropriata (update / delete), ma ho avuto problemi con l'evento sparare due volte, quindi sono passato fuori per eventi separati (RowUpdating, RowDeleting). Dopo aver fatto questo, FindControl sta tornando nullo ogni volta. Cordiali saluti, il GridView è all'interno di un UpdatePanel che ha un AsyncPostBackTriggers per eventi RowEditing, RowUpdating e RowDeleting.
Ecco la mia TemplateField all'interno del GridView:
<asp:TemplateField HeaderText="Type">
<ItemTemplate>
<asp:Label
ID="lblMedTypeEdit"
Text='<%# Bind("medDesc") %>'
runat="server">
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList
ID="ddlMedTypeEdit"
DataSourceID="srcMedTypes"
SelectedValue='<%# Bind("medtype") %>'
runat="server"
DataTextField="medDesc"
DataValueField="medCode">
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>
Ecco il codice che sto utilizzando all'interno di
Protected Sub gvCurrentMeds_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles gvCurrentMeds.RowUpdating
Dim intRowIndex As Integer = e.RowIndex
Dim ddlMedType As DropDownList = CType(Me.gvCurrentMeds.Rows(intRowIndex).Cells(1).FindControl("ddlMedTypeEdit"),DropDownList)
End Sub
Ho anche provato ad utilizzare una funzione ricorsiva per trovare il controllo (in basso), ma è ancora Tornando indietro nulla.
Public Function FindControlRecursive(ByVal root As Control, ByVal id As String) As Control
If root.ID = id Then
Return root
End If
For Each c As Control In root.Controls
Dim t As Control = FindControlRecursive(c, id)
If Not t Is Nothing Then
Return t
End If
Next
Return Nothing
End Function
Soluzione
Se si vuole solo sapere qual è il nuovo valore della discesa è, questo è già previsto per voi nella proprietà NewValues
dell'oggetto GridViewUpdateEventArgs
passato al gestore di eventi.
Nel tuo esempio, e.NewValues["medtype"]
dovrebbe essere il valore aggiornato.
Hai già specificato <%# Bind(...) %>
sul menu a discesa, in modo da ASP.NET farà il lavoro di trovare i controlli e ottenere i nuovi valori per te -. Non c'è bisogno di scandagliare la gerarchia di controllo da soli