【问题标题】:Finding a Checkbox within Gridview在 Gridview 中查找复选框
【发布时间】:2018-06-12 20:55:19
【问题描述】:

我希望有人能够帮助我解决我的 WebForms 问题。

我有一个使用Gridview 显示在网页上的列表,网格视图中的一列有一个复选框。向 gridview 添加复选框不是我所做的问题,我的问题是我无法读取复选框是否被选中。当逐行遍历网格时,我指定带有复选框的单元格,它返回的只是 

这是我用来插入复选框的代码示例。

 CheckBox chk = new CheckBox();
                chk.EnableViewState = true;
                chk.Enabled = true;
                chk.Checked = true;
                chk.ID = "chkb";

                e.Row.Cells[DATA_TABLE_GRID_VIEW_COLUMN_CLOSE].Controls.Add(chk);

这是在网格的_RowDataBound 方法中完成的(如果有区别的话)。

我尝试了几种不同的方法来获取价值,但都没有为我提供我正在寻找的结果。

foreach (GridViewRow row in theGrid.Rows)
{
    var val = (CheckBox)row.FindControl("ctl00_ctl00_MainContentPlaceHolder_ContentPlaceHolder1_GridViewMeter_ctl03_chkb");
}

在本例中,出于测试目的,我硬编码了一个 ID,我首先检查了该 ID 是否存在于页面上。 这是为网格视图生成的 HTML 示例。

<td>
<span>
    <input id="ctl00_ctl00_MainContentPlaceHolder_ContentPlaceHolder1_GridViewMeter_ctl03_chkb" type="checkbox" name="ctl00$ctl00$MainContentPlaceHolder$ContentPlaceHolder1$GridViewMeter$ctl03$chkb" checked="checked">
</span>

我也尝试过直接检查单元格中的控件,但它什么也没返回

row.Cells[36].Controls.Count

还有什么我可以尝试或做的事情来获取复选框的值。

【问题讨论】:

  • 你不应该使用生成的Id。使用您在代码“chkb”中添加的那个。但是奇怪的是你在Cell上面找不到它,你确定它是正确的cell吗?
  • 感谢您的回复,我不完全理解网格视图,但它为行中的每个单元格提供了一个唯一的 ID,并将我设置的 ID 附加到末尾。我还检查并仔细检查了它是正确的单元格。

标签: c# asp.net webforms


【解决方案1】:

我刚刚尝试了您需要的,这是一个可能的解决方案。

protected void Page_Load(object sender, EventArgs e)
    {
        List<Student> lista = new List<Student>();
        lista.Add(new Student() { Id = 1, Name = "Nesta" });
        lista.Add(new Student() { Id = 2, Name = "Pirlo" });
        lista.Add(new Student() { Id = 3, Name = "Maldini" });

        GridTest.DataSource = lista;
        GridTest.DataBind();
    }

    protected void GridTest_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        CheckBox chk = new CheckBox();
        chk.EnableViewState = true;
        chk.Enabled = true;
        chk.Checked = true;
        chk.Text = "Test";
        chk.ID = "chkb";

        e.Row.Cells[0].Controls.Add(chk);
    }

    protected void ClickIt_Click(object sender, EventArgs e)
    {
        foreach (GridViewRow row in GridTest.Rows)
        {
            var val = (CheckBox)row.FindControl("chkb");
            var name = val.Text;
            var boolvalue = val.Checked;
        }
    }

而且 HTML 方面很简单:

<asp:GridView ID="GridTest" runat="server" OnRowDataBound="GridTest_RowDataBound" >
<Columns>
</Columns></asp:GridView><asp:Button ID="ClickIt" runat="server" Text="Press" OnClick="ClickIt_Click" />

希望对你有所帮助。

【讨论】:

  • 这看起来很棒,而且看着它,它应该可以工作,但是无论出于何种原因,这不适用于我正在使用的代码:(
  • @Richard 那么请您添加更多代码。可能有什么东西在加载时会覆盖它。在哪种情况下是你的 foreach
【解决方案2】:

我找到了解决问题的方法。

最初我是在使用_RowDataBound 创建网格后将复选框添加到gridview 中,但由于某种原因,复选框未被检测为控件,因此.FindControl() 不起作用。

因此,在创建 GridView 而不是 .Columns.Add("ColumnName") 时,我将列设置为 type bool .Columns.Add(new DataColumn("Closed", typeof(bool)));

然后处理_RowDataBound中的复选框属性

这样做我现在可以找到 Checkbox 控件使用.FindControl()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-26
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2013-12-09
    • 1970-01-01
    • 2012-04-10
    相关资源
    最近更新 更多