如何在asp webform的gridview中获取动态复选框状态?

时间:2016-02-14 11:18:58

标签: c# asp.net gridview webforms

我在asp.net webform中有一个gridview,我添加了一个像这样的复选框列(在SQL数据源中dataTable第一列(0)为空,我在列单元格上添加复选框):

 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无法获取复选框true或false!它似乎让我在复选框内容下的原始字段。

问候。

1 个答案:

答案 0 :(得分:1)

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

<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事件中执行此操作。以下代码显示了如何检索Checkbox控件的值:

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));
    }
}