【问题标题】:Reference specific checkbox in gridview在gridview中引用特定复选框
【发布时间】:2013-10-03 17:52:13
【问题描述】:

我有一个显示从数据库检索的数据的 GridView。我已使用此代码将 TemplateField (CheckBox) 设置为 GridView:

<asp:GridView ID="dbRecordsContent" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" OnSelectedIndexChanged="dbRecordsContent_SelectedIndexChanged">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:CheckBox ID="myCheckBox" runat="server" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="title" HeaderText="title" SortExpression="title" />
        <asp:BoundField DataField="url" HeaderText="url" SortExpression="url" />
        <asp:BoundField DataField="category" HeaderText="category" SortExpression="category" />
        <asp:BoundField DataField="isChecked" HeaderText="isChecked" SortExpression="isChecked" />
    </Columns>
</asp:GridView>

我的网格视图如下所示:

我的问题是:我如何知道选中了哪个复选框 ID?例如:

当我按下“删除”按钮时,我想删除第二行。当然我会检查第二个复选框,但是我怎么知道要删除哪条记录呢?如何在代码中引用第二个复选框?

【问题讨论】:

    标签: c# asp.net gridview checkbox


    【解决方案1】:

    试试这个,

    <asp:TemplateField>
            <ItemTemplate>
                <asp:CheckBox ID="myCheckBox" runat="server" AutoPostBack="true"
                           oncheckedchanged="CheckBox1_CheckedChanged" />
            </ItemTemplate>
    </asp:TemplateField>
    

    代码方面,

    protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
    {
        GridViewRow row = ((GridViewRow)((CheckBox)sender).NamingContainer);
        int index = row.RowIndex;
        CheckBox cb1 = (CheckBox)Gridview.Rows[index].FindControl("myCheckBox");
        string checkboxstatus;
        if (cb1.Checked)
        {
          //write your code
        }        
        else
        {
          //write your code
        }
    }
    

    【讨论】:

      【解决方案2】:

      在删除按钮的单击事件处理程序中,您需要遍历网格中的所有行,如果选中了复选框,则需要执行删除逻辑,如下所示:

      protected void DeleteButton_Click(object sender, EventArgs e)
      {
          foreach(GridViewRow row in dbRecordsContent.Rows)
          {
              // Only look for check boxes in data rows, ignoring header 
              // and footer rows
              if (row.RowType == DataControlRowType.DataRow)
              {
                  if (((CheckBox)row.FindControl("myCheckBox")).Checked)
                  {
                      // Do delete logic here
                  }
              }
          }
      }
      

      更新:

      要获取行号,请使用GridViewRow.RowIndex 属性,如下所示:

      int rowNumber = row.RowIndex;
      

      阅读GridViewRow.RowIndex Property了解更多信息。

      【讨论】:

      • 完美运行。还有一个问题。如何获得检查的行号?
      • @rootpanthera - 请参阅UPDATE: 的回答。
      • 嗯,实际上我发现它不能正常工作。它仅在选中一行中的最后一个复选框时才有效(上面的真实声明)。即使选中了任何其他复选框,也会始终执行 Else 语句。知道为什么吗?
      • 什么else 声明,我发布的代码中没有else 声明?
      • 是的,这是我的错。我混淆了一些东西。你的代码很完美。我会接受你的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 2020-10-31
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多