c# - 动态添加复选框到gridview

标签 c# asp.net gridview

<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 来检查该复选框,但它似乎不起作用。有人可以告诉我我在这里做错了什么吗?

最佳答案

您可以将标记绑定(bind)到值:Checked='<%# Eval("C") %>'

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

关于c# - 动态添加复选框到gridview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662320/

相关文章:

c# - Unity3D C# 无法从类创建对象

c# - 将 XML 文件保存在项目文件夹中

css - 使用 css 旋转 GridView 标题

c# - 在 C# 中对 gridview 进行复杂编辑

c# - 我如何防止使用 C# 进行屏幕录制

C# MouseHover 上的按钮透明背景

c# - 如何使用 Html Agility Pack 进行 HTML 验证

asp.net - 基于 Asp Web 应用程序创建电话应用程序

c# - 如何过滤 Telerik 的 RadGrid 的 GridTemplateColumns

c# - 一个参数值按字面意思更新,但其他参数值正常 C#