我有一个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
?我想将其设置为更新参数。
答案 0 :(得分: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事件已经处理完毕。在这种情况下,当时下拉列表中没有项目来设置选择。因此这个问题。