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
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top