Хорошо, у меня возникают проблемы с получением значения 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