Проблема с поиском веб-элемента управления внутри Gridview TemplateField

Хорошо, у меня возникают проблемы с получением значения DropDownList внутри TemplateField при обновлении моего GridView. Первоначально я использовал событие RowCommand для проверки имени команды, а затем выполнял соответствующую задачу (обновление / удаление), но у меня были проблемы с запуском события дважды, поэтому я отключил его для отдельных событий (RowUpdating, RowDeleting). После этого FindControl каждый раз возвращает null. К вашему сведению, gridview находится внутри UpdatePanel, у которого есть AsyncPostBackTriggers для событий RowEditing, RowUpdating и RowDeleting.

Вот мой TemplateField внутри 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>

Вот код, который я использую внутри

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

Я также пробовал использовать рекурсивную функцию, чтобы найти элемент управления (см. Ниже), но он все равно возвращает значение null.

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

person Brian    schedule 17.08.2009    source источник
comment
На самом деле я мог использовать вместо этого событие RowCommand, но было бы неплохо узнать, как это сделать. :)   -  person Brian    schedule 17.08.2009


Ответы (1)


Если вы просто хотите узнать, какое новое значение раскрывающегося списка, оно уже предоставлено вам в свойстве NewValues объекта GridViewUpdateEventArgs, переданного обработчику событий.

В вашем примере e.NewValues["medtype"] должно быть обновленным значением.

Вы уже указали <%# Bind(...) %> в раскрывающемся списке, поэтому ASP.NET выполнит работу по поиску элементов управления и получению новых значений за вас - вам не нужно самостоятельно подключать иерархию элементов управления.

person Sam    schedule 19.08.2009