2009-08-17 82 views
1

好的,所以我在更新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 
+0

我實際上能夠使用RowCommand事件,但它仍然很好,知道如何做到這一點。 :) – Brian 2009-08-17 18:33:18

回答

1

如果你只是想知道什麼下拉的新值,這已經傳遞給事件處理程序GridViewUpdateEventArgs對象的NewValues酒店提供給你。

在你的例子中,e.NewValues["medtype"]應該是更新的值。

您已經在下拉列表中指定了<%# Bind(...) %>,因此ASP.NET將爲您找到控件併爲您獲取新值 - 您無需自己調整控件層次結構。