好的,所以我在更新GridView時遇到了TemplateField內部的DropDownList的值問題。最初我使用RowCommand事件來檢查命令名,然後執行相應的任務(更新/刪除),但是我遇到了兩次事件觸發問題,所以我將它切換爲單獨的事件(RowUpdating,RowDeleting)。完成後,FindControl每次都返回null。只是FYI,gridview是在一個UpdatePanel裏面,它有一個用於RowEditing,RowUpdating和RowDeleting事件的AsyncPostBackTriggers。在Gridview 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 2009-08-17 18:33:18