如何在 asp 网络表单的 gridview 中获取动态复选框状态 asp?

how to get dynamic check box status an asp in a gridview in asp webform?

我在 asp.net 网络表单中有一个 gridview,我将它添加到这样的复选框列(dataTable 第一列 (0) 在 sql 数据源中是空的,我添加了复选框在列单元格上):

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (rowNum != 0)//except first row
            {
                CheckBox cb = new CheckBox();
                cb.Enabled = true;
                e.Row.Cells[0].Controls.Add(cb);//row[0]=first clmn-and this event happend for all rows

            }
            rowNum++;
        }

现在我有一个动态复选框列!并且用户应该检查其中的一些并单击提交然后我需要选中的复选框的行号。 我怎样才能做到这一点? 我之前试过这个:

DataTable editTable = new DataTable();
editTable.Rows.Add(GridView1.Rows[0]);
var x = editTable.Rows[0][0]; 

但是x无法获取复选框的真假!似乎让我得到了复选框内容下的原始字段。

问候。

您可以在一个或多个模板列中添加复选框,而不是动态创建控件(这在大多数情况下会导致很多麻烦)。以下示例显示了如何在模板列中添加复选框以及之后如何检索值:

<asp:GridView ID="gridView" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:CheckBox ID="chb" runat="server" />
                <asp:HiddenField ID="hiddenId" runat="server" 
                    Value='<%# DataBinder.Eval(Container.DataItem, "Id") %>' />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Text" />
    </Columns>
</asp:GridView>

在我的示例中,我将一些数据绑定到 GridView:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        var dt = GetData();
        gridView.DataSource = dt;
        gridView.DataBind();
    }
}

private DataTable GetData()
{
    var dt = new DataTable();
    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Text", typeof(string));
    for (int i = 0; i < 10; i++)
        dt.Rows.Add(new object[] { i, "Test text " + i.ToString() });
    return dt;
}

如果需要设置值,可以在RowDatabound事件中设置。以下代码显示如何检索复选框控件的值:

protected void btn_Click(object sender, EventArgs e)
{
    List<int> checkedIds = new List<int>();
    foreach(GridViewRow row in gridView.Rows.OfType<GridViewRow>()
        .Where(x => x.RowType == DataControlRowType.DataRow))
    {
        var hiddenId = (HiddenField)row.Cells[0].FindControl("hiddenId");
        var checkBox = (CheckBox) row.Cells[0].FindControl("chb");
        if (checkBox.Checked)
            checkedIds.Add(int.Parse(hiddenId.Value));
    }
}