【问题标题】:how to get dynamic check box status an asp in a gridview in asp webform?如何在asp webform中的gridview中获取asp的动态复选框状态?
【发布时间】:2016-02-14 11:18:58
【问题描述】:

我在 asp.net webform 中有一个 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 无法获取复选框的真假!似乎让我得到了复选框内容下的原始字段。

问候。

【问题讨论】:

    标签: c# asp.net gridview webforms


    【解决方案1】:

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

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

    【讨论】:

    • 代码的第二部分不起作用!我的意思是列表是空的。我跟踪了代码,但条件永远不会为真!
    • @user3125076:很遗憾听到它不起作用;代码有问题,因为 id 列不可见。我已经通过添加隐藏字段并更新了答案来解决这个问题。我还添加了更多细节,希望这有助于将代码集成到您的解决方案中。
    猜你喜欢
    • 2013-10-05
    • 2012-10-25
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多