1

さて、GridViewを更新するときにTemplateField内にあるDropDownListの値を取得する際に問題が発生します。元々、RowCommandイベントを使用してコマンド名を確認し、適切なタスク(更新/削除)を実行していましたが、イベントの発生が2回発生する問題があったため、別のイベント(RowUpdating、RowDeleting)に切り替えました。これを行った後、FindControlは毎回nullを返します。参考までに、gridviewは、RowEditing、RowUpdating、およびRowDeletingイベント用のAsyncPostBackTriggersを持つUpdatePanel内にあります。

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
4

1 に答える 1

1

ドロップダウンの新しい値を知りたいだけの場合は、イベント ハンドラーに渡されたオブジェクトのNewValuesプロパティで既に提供されています。GridViewUpdateEventArgs

あなたの例でe.NewValues["medtype"]は、更新された値である必要があります。

ドロップダウンで既に指定<%# Bind(...) %>しているため、ASP.NET がコントロールを見つけて新しい値を取得する作業を行います。コントロール階層を自分で構築する必要はありません。

于 2009-08-19T07:43:30.537 に答える