【问题标题】:pass ID value to OnCheckedChange event in code behind在后面的代码中将 ID 值传递给 OnCheckedChange 事件
【发布时间】:2014-10-11 10:41:12
【问题描述】:

我有一个gridview,每行数据都有一个复选框。

当复选框被选中或取消选中时,我需要在我的数据库中更新一个位标志。

我正在尝试使用 OnCheckedChanged 事件。

它确实会触发,但是我收到一个与 ID 有关的空错误。

我的问题是,我不太确定如何将所需的 ID 获取到 OnCheckedChanged 事件代码。

我需要此 ID 来更新数据库中的相应行。

我在 StackOverflow 上发现了一些相关问题,但提供的答案都没有真正帮助我。

谢谢!

我的gridview代码:

<asp:GridView ID="gvlisting" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:TemplateField HeaderText="Item Is Ready">
        <ItemTemplate>
            <asp:CheckBox ID="isReady" runat="server" AutoPostBack="true" OnCheckedChanged="isReady_CheckedChanged" Checked='<%#isReady(CInt(Eval("isReady")))%>'/>
        </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Item Name">
            <ItemTemplate>
                <asp:Label ID="itemName" runat="server" Text='<%#cleanString(Eval("itemName").ToString())%>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

后面的代码:

Public Sub isReady_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)

    Dim box As CheckBox = DirectCast(sender, CheckBox)
    If box.Checked = True Then
        'custom code for executing an SQL UPDATE statement
        db.ExecuteNonQuery(AddIsreadyFlag, New SqlParameter("@itemID", Me.ID))
    Else
        db.ExecuteNonQuery(RemoveIsreadyFlag, New SqlParameter("@itemID", Me.ID))
    End If

End Sub

【问题讨论】:

  • 您是否尝试过使用数据键名??
  • 你需要获取当前行的DataItem
  • @Robert 我同意,您需要获取保存您 ID 的 DataItem/Row,然后将其设置为某种变量。
  • @Robert:DataItem 在回发时为空/无。

标签: asp.net vb.net gridview


【解决方案1】:

Me.IDPageID,因为Me 是当前页面实例。

您可以添加另一个带有 ID 的模板字段:

<asp:TemplateField HeaderText="Item-ID" Visible="false">
    <ItemTemplate>
        <asp:Label ID="itemID" runat="server" Text='<%# Eval("itemID") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

现在您可以使用NamingContainer 获取行,使用FindControl 获取标签:

Public Sub isReady_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)

    Dim box As CheckBox = DirectCast(sender, CheckBox)
    Dim row = DirectCast(box.NamingContainer, GridViewRow)
    Dim itemID = DirectCast(row.FindControl("itemID"), Label).Text
    If box.Checked = True Then
        'custom code for executing an SQL UPDATE statement
        db.ExecuteNonQuery(AddIsreadyFlag, New SqlParameter("@itemID", itemID))
    Else
        db.ExecuteNonQuery(RemoveIsreadyFlag, New SqlParameter("@itemID", itemID))
    End If

End Sub

【讨论】:

    【解决方案2】:

    将 ID 列添加到网格中,然后根据需要将其可见属性设置为 false。

    您可以获取 Gridview 的选定行,然后获取单元格 ID 列的值(该列不需要可见,但它需要存在于网格中)。

     var someVar  = gvlisting.SelectedRow.Cells[0].Text; //change 0 to correct column
    

    http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.selectedrow(v=vs.110).aspx

    您可能需要在 SelectedIndexChanged 中执行此操作,但我怀疑,如果是这种情况,您可以使用上述方法轻松地从单元格中获取数据或 findcontrol 之类的...How to find control in TemplateField of GridView?

    【讨论】:

      【解决方案3】:

      您也可以尝试在 OnDataBinding 事件中添加自定义属性,并在 de CheckChanged 事件中检索值。

          protected void chkEnabled_DataBinding(object sender, EventArgs e)
          {
              CheckBox chk = (CheckBox)sender;
              string id = Eval("Id").ToString();
              chk.Attributes.Add("data-id", id);
          }
      
          protected void chkEnabled_CheckedChanged(object sender, EventArgs e)
          {
              CheckBox chk = (CheckBox)sender;
              string id = chk.Attributes["data-id"];
          } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-06
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多