0

我有一个RowDataBound看起来像这样的事件处理程序:

Public Sub CustomersGridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles GVHistoricNames.RowDataBound 'RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim hyperlinkUSNHyperlink As HyperLink = CType(e.Row.FindControl("USNHyperlink"), HyperLink)
        Dim ddl As DropDownList = CType(e.Row.FindControl("ddlUsercode"), DropDownList)
        If ddl.SelectedValue = "" Then 'labLastUserCode.Text = "" Then
            hyperlinkUSNHyperlink.NavigateUrl = ""
        End If
    End If
 End Sub

...以及RowCreated如下所示的事件处理程序:

Public Sub CustomersGridView_RowCreated(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles GVHistoricNames.RowCreated 'RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim ddl As DropDownList = CType(e.Row.FindControl("ddlUsercode"), DropDownList)
        ddl.Items.Add("")
        ddl.Items.Add(strUserName)
    End If
End Sub

...以及RowUpdating如下所示的事件处理程序:

Protected Sub GVHistoricNames_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GVClearcoreHistoricNames.RowUpdating
    Try
        Dim ddl As DropDownList = CType(GVHistoricNames.Rows(e.RowIndex).FindControl("ddlUsercode"), DropDownList)
        SQLHistoricNames.UpdateParameters("UserCode").DefaultValue = ddl.SelectedValue

    Catch ex As Exception

    Finally

    End Try
End Sub

请参阅RowUpdating事件处理程序的第三行。该SelectedValue属性的值永远不会正确,因为RowDataBound事件处理程序是在事件处理程序之后调用的RowUpdating。我如何访问SelectedValue?我想将其设置为更新参数。

4

1 回答 1

1

一种方法可能是查看实际的请求数据。例如,在GVHistoricNames_RowUpdating代码中,使用

Dim ddl As DropDownList = CType(GVHistoricNames.Rows(e.RowIndex).FindControl("ddlUsercode"), DropDownList)
SQLHistoricNames.UpdateParameters("UserCode").DefaultValue = Request(ddl.UiniqueID)

当在将发布数据加载到控件之前需要控件值时(或者在以后的事件中动态添加/绑定控件时),我经常使用这种变通方法。

编辑

ASP.NET 使用Control.UniqueId来表示相应 html 元素的 name 属性。它(以及 ClientID)通常是通过将控件的 id 附加到父级(命名容器的父级)的唯一 id 来构造的,因此您会为网格中的多个下拉列表获得不同的唯一 id(和客户端 id)(因为每一行充当命名容器)

就您的问题而言,您可能正在设计时模板中创建下拉列表,同时您正在创建的行中加载列表项。然而,在行创建事件被触发之前,下拉列表已经被添加到页面控制树并且它的 POST 事件已经被处理。在这种情况下,此时下拉列表中将没有项目来设置选择。因此问题。

于 2012-11-27T12:16:00.023 回答