ASP.NET-使用RowCommand时获取当前行的DropDownList SelectedValue

本文关键字:DropDownList SelectedValue 获取 NET- 使用 RowCommand ASP | 更新日期: 2023-09-27 18:15:00

  • 当我从网格视图行上的按钮运行行命令事件时可以从事件行上的任何字段中检测到正确的值。

  • 作为唯一标识符的hidID对于每一行正确地报告为预期。

  • ddlVal总是报告列表中的第一个项目,而不是当前选择的值。

  • 有人能解释为什么一个下线者不会使用命令事件时检测当前选择的值?


ASP。NET

  <asp:GridView ID="gv" runat="Server" AutoGenerateColumns="False" OnRowCommand="gv_RowCommand" EnableModelValidation="False">
    <Columns>
      <asp:TemplateField HeaderText="Reason Missed" ItemStyle-CssClass="Inline" HeaderStyle-CssClass="NoSort" Visible="false">
        <ItemTemplate>
          <asp:DropDownList ID="ddl" runat="server" DataSourceID="sqldatasource" DataValueField="ID" DataTextField="Text" AppendDataBoundItems="true">
            <asp:ListItem Text="Select ..." Value="0"/>
          </asp:DropDownList>
        </ItemTemplate>
      </asp:TemplateField>
    </Columns>
  </asp:GridView>
<asp:SqlDataSource ID="sqldatasource" runat="Server" SelectCommand="sp" SelectCommandType="StoredProcedure"/>

VB

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
  Dim constring = ConfigurationManager.ConnectionStrings("Con").ConnectionString
  sqldatasource.ConnectionString = constring
  Bind_gv()
End Sub
Protected Sub gv_RowCommand(sender As Object, e As GridViewCommandEventArgs)
  Dim rowIndex As Integer = Convert.ToInt32(e.CommandArgument)
  Dim row As GridViewRow = gv.Rows(rowIndex)
  Dim ddlVal As Integer = DirectCast(row.FindControl("ddl"), DropDownList).SelectedValue
  Dim hidID As Integer = DirectCast(row.FindControl("hidID"), HiddenField).Value
  'ETC ...
End Sub

ASP.NET-使用RowCommand时获取当前行的DropDownList SelectedValue

经过进一步诊断,我发现:

  • row命令事件首先重新加载页面
  • 这会触发页面的生命周期
  • RowCommand事件是在Page_Load事件之后触发的
  • RowCommand事件在PreRender事件之前触发

这样做的后果是,如果在Page_Load事件中绑定数据,则该数据在触发RowCommand之前被绑定/反弹。

如果像我的情况一样,在Page_Load事件中绑定dropdownlist,或者在Page_Load中绑定gridview和sqldatasource,那么在触发RowCommand之前,任何客户端更改都将丢失,因为它们将重置为初始值。

答案

RowCommand触发后的任何事件中绑定网格视图,例如OnPreRenderComplete。这样,在触发RowCommand事件之前,客户端更改仍然可用。