【问题标题】:adding check box dynamically to gridview将复选框动态添加到gridview
【发布时间】:2013-09-07 02:45:11
【问题描述】:
<asp:GridView ID="SearchGrid" runat="server" GridLines="Both" AutoGenerateColumns="false">
                        <Columns>
                            <asp:BoundField DataField="Q" HeaderText="Q" />
                            <asp:TemplateField HeaderText="C">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CCheckbox" runat="server" AutoPostBack="true" OnCheckedChanged="CCheckbox_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                             <asp:TemplateField HeaderText="R">
                                <ItemTemplate>
                                    <asp:CheckBox ID="RCheckbox" runat="server" AutoPostBack="true" OnCheckedChanged="RCheckbox_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                             <asp:TemplateField HeaderText="E">
                                <ItemTemplate>
                                    <asp:CheckBox ID="ECheckbox" runat="server" AutoPostBack="true" OnCheckedChanged="ECheckbox_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView>

这是我的 GridView 的 Aspx 代码

if (ViewState["SearchGrid"] == null)
            {
                SearchTable.Columns.Add(new DataColumn("Q", typeof(string)));
                SearchTable.Columns.Add(new DataColumn("C", typeof(bool)));
                SearchTable.Columns.Add(new DataColumn("R", typeof(bool)));
                SearchTable.Columns.Add(new DataColumn("E", typeof(bool)));
                ViewState["SearchGrid"] = SearchTable;
            }
            SearchTable =(DataTable) ViewState["SearchGrid"];
            DataRow dr = null;
            dr = SearchTable.NewRow();
            dr["Q"] = MySearchTextBox.Text;
            switch (SearchType)
            {
                case "Contains": dr["C"] =true;
                    break;
                case "Related": dr["R"] = true;
                    break;
                case "Exact": dr["E"] = true;
                    break;
            }

还有我的代码。

在添加行时,我必须选中一个特定的复选框。 我一直试图通过将其值设为 true 来检查复选框,但它似乎不起作用。有人可以告诉我我在这里做错了什么吗?

【问题讨论】:

  • 您是将CheckBox 设置为true 还是将CheckBox.Checked 设置为true?
  • @garrison 我怎样才能把 checkBox.checked = true?因为控件还没有添加到表中,所以我可以找到控件并检查它?
  • 处理 GridView 的 OnRowDataBound 事件。找到 CheckBox,根据您的算法设置其 Checked 值。
  • 你在哪里调用你的 c# 代码?在 CheckedChanged 事件处理程序中?
  • 嗨,加里森,是的,我这样做了,问题得到了解决,但我的另一个问题是添加另一行后,前一行复选框未被选中,我启用了复选框的视图状态,但仍然是可渗透的行复选框未选中。这个问题有什么解决办法吗?

标签: c# asp.net gridview


【解决方案1】:

您可以在标记中绑定到值:Checked=''

<asp:GridView ID="SearchGrid" runat="server" GridLines="Both" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="Q" HeaderText="Q" />
        <asp:TemplateField HeaderText="C">
            <ItemTemplate>
                <asp:CheckBox ID="CCheckbox" runat="server" AutoPostBack="true" OnCheckedChanged="CCheckbox_CheckedChanged" Checked='<%# Eval("C") %>' />
            </ItemTemplate>
        </asp:TemplateField>
            <asp:TemplateField HeaderText="R">
            <ItemTemplate>
                <asp:CheckBox ID="RCheckbox" runat="server" AutoPostBack="true" OnCheckedChanged="RCheckbox_CheckedChanged" Checked='<%# Eval("E") %>' />
            </ItemTemplate>
        </asp:TemplateField>
            <asp:TemplateField HeaderText="E">
            <ItemTemplate>
                <asp:CheckBox ID="ECheckbox" runat="server" AutoPostBack="true" OnCheckedChanged="ECheckbox_CheckedChanged" Checked='<%# Eval("R") %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

或者你可以使用 rowdatabound 事件:OnRowDataBound="SearchGrid_RowDataBound"

标记更改:

<asp:GridView ID="SearchGrid" runat="server" GridLines="Both" AutoGenerateColumns="false" OnRowDataBound="SearchGrid_RowDataBound">

代码隐藏:注意我使用的是列表对象而不是数据表。

public class TestObject
{
    public string Q { get; set; }
    public bool C { get; set; }
    public bool R { get; set; }
    public bool E { get; set; }
}
public partial class Default : System.Web.UI.Page
{
    public List<TestObject> Values { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            //NEED SOME DATA TO TEST THE RESULT
            Values = new List<TestObject>();

            Values.Add(new TestObject() { Q = "test 1", C = true, E = true, R = true });
            Values.Add(new TestObject() { Q = "test 1", C = true, E = false, R = true });
            Values.Add(new TestObject() { Q = "test 1", C = true, E = true, R = false });
            Values.Add(new TestObject() { Q = "test 1", C = false, E = true, R = true });
            //BIND TO THE GRID
            SearchGrid.DataSource = Values;
            SearchGrid.DataBind();
        }
    }

    //FIRES FOR EVERY ROW IN THE GRID
    protected void SearchGrid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        //WE ONLY CARE ABOUT THE DATAROW NOT HEADER ETC
        if (e.Row.RowType != DataControlRowType.DataRow)
            return;
        //GET THE BOUND INDIVIDUAL ITEM
        TestObject obj = (TestObject)e.Row.DataItem; //IN YOUR CASE THIS WOULD BE: DataRow row = (DataRow)e.Row.DataItem

        //FIND ALL THE CHECKBOXES
        CheckBox cchk = e.Row.FindControl("CCheckBox") as CheckBox;
        CheckBox echk = e.Row.FindControl("ECheckBox") as CheckBox;
        CheckBox rchk = e.Row.FindControl("RCheckBox") as CheckBox;

        //CHECK IT OR NOT BASED ON THE DATATITEMS VALUE
        if (cchk != null)
            cchk.Checked = obj.C; //IN YOUR CASE THIS WOULD BE: bool c = (bool)row["C"];

        if (echk != null)
            echk.Checked = obj.E;

        if (rchk != null)
            rchk.Checked = obj.R;
    }
}

【讨论】:

  • 您好,感谢您的成功。但现在我的问题是在添加另一行后,前一行复选框未选中,我启用了复选框的视图状态,但仍然未选中前行复选框。这个问题有什么解决办法吗?
  • 这是一个很难回答的问题。添加行后是否重新绑定网格(调用 .databind())?您是将行添加到数据表还是直接添加到网格?您是否在每次调用时使用相同的方法将 e、c 和 r 设置为可敬的值?我建议您调试用于创建列的方法并确保它们具有正确的值。
  • 其实我每次都是在创建一个数据行,然后将其添加到一个表中,然后将网格控件绑定到数据表上
  • 看起来在回发时您的数据丢失并替换为数据表中的数据,并且复选框更改从未提交到数据表?
  • 是的,但我不能在数据表中放置复选框,对吗?如何在数据表中引用复选框值?我们可以将控件放在数据表中吗?
【解决方案2】:

您可以尝试检查 GridView.RowDataBound 的功能。使用此事件捕获绑定了数据的行,然后您应该能够访问 CheckBox 项并分配其 .Checked 值。

链接:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2013-07-30
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多