GridViewの更新時にTemplateFieldのDropDownListの値を取得する際に問題が発生しました。当初はRowCommandイベントを使用してコマンド名を確認してから、適切なタスク(更新/削除)を実行していましたが、イベントの2回発生に問題があったため、別のイベント(RowUpdating、RowDeleting)この後、FindControlは毎回nullを返します。ちょうどFYI、Gridviewは、RowEditing、RowUpdatingおよびRowDeletingイベント用のAsyncPostBackTriggersを持つUpdatePanelの内部にあります。GridViewの内部でWebコントロールを検索できない問題TemplateField
ここでのGridViewの内側に私のTemplateFieldです:ここで
<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
実際には、代わりにRowCommandイベントを使用することができましたが、これを行う方法を知っていればなおさらです。 :) – Brian