Asp.net 到gridview列的简单数据绑定

Asp.net 到gridview列的简单数据绑定,asp.net,data-binding,Asp.net,Data Binding,我有一个GridView,用于向用户显示搜索结果。我想让他们在执行搜索时选择在GridView上显示哪些列。很简单,是吗?我想尝试只使用数据绑定,不使用事件。不幸的是,我的代码无法使用绑定到列的Visible属性的复选框更新GridView。复选框的状态会更改,但列的Visible属性不会更改 Search.aspx的片段: <myControl:FacultyGridView ID="FacultyGridView1" runat="server" /> <asp:R

我有一个GridView,用于向用户显示搜索结果。我想让他们在执行搜索时选择在GridView上显示哪些列。很简单,是吗?我想尝试只使用数据绑定,不使用事件。不幸的是,我的代码无法使用绑定到列的Visible属性的复选框更新GridView。复选框的状态会更改,但列的Visible属性不会更改

Search.aspx的片段:

<myControl:FacultyGridView ID="FacultyGridView1" runat="server" />
    <asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
    <asp:CheckBox ID="CheckBox1" runat="server" Text='<%# Eval("HeaderText") %>' Checked='<%# Bind("Visible") %>' AutoPostBack=true/></ItemTemplate>
</asp:Repeater>
protected void Page_Load(object sender, EventArgs e)
{
     Repeater1.DataSource = FacultyGridView1.GridView.Columns;
     Repeater1.DataBind();
}
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    AllowPaging="True" AllowSorting="True" PageSize="25">
    <PagerSettings Mode="NumericFirstLast" Position="TopAndBottom" />
    <Columns>
        <asp:BoundField DataField="Name" HeaderText="Name" ReadOnly="True" SortExpression="Name" />
        <asp:TemplateField HeaderText="University" SortExpression="UniversityID">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Eval("University.Name") %>' />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Division">
            <ItemTemplate>
                <asp:Repeater ID="Repeater1" runat="server" DataSource='<%# Eval("DivisionMemberships") %>'>
                    <ItemTemplate>
                        <asp:Label ID="Label2" runat="server" Text='<%# Eval("Division.Name") %>'></asp:Label>
                    </ItemTemplate>
                </asp:Repeater>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Title" HeaderText="Title" ReadOnly="True" SortExpression="Title" />
        <asp:TemplateField HeaderText="Research Type">
            <ItemTemplate>
                <asp:Repeater ID="Repeater1" runat="server" DataSource='<%# Eval("ResearchTypeMappings") %>'>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("ResearchType.Name") %>'></asp:Label>
                    </ItemTemplate>
                </asp:Repeater>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Expertise" HeaderText="Expertise" ReadOnly="True" SortExpression="Expertise" />
        <asp:HyperLinkField DataNavigateUrlFields="Website" DataTextField="Website" HeaderText="Website"
            SortExpression="Website" />
        <asp:BoundField DataField="Phone" HeaderText="Phone" ReadOnly="True" SortExpression="Phone" />
        <asp:TemplateField HeaderText="Email Address" SortExpression="EmailAddress">
            <ItemTemplate>
                <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("EmailAddress", "mailto:{0}") %>'
                    Text='<%# Eval("EmailAddress") %>'></asp:HyperLink>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
需要说明的是,GridView是作为名为FacultyGridView的用户控件的公共属性公开的。FacultyGridView.ascx的相关片段

<myControl:FacultyGridView ID="FacultyGridView1" runat="server" />
    <asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
    <asp:CheckBox ID="CheckBox1" runat="server" Text='<%# Eval("HeaderText") %>' Checked='<%# Bind("Visible") %>' AutoPostBack=true/></ItemTemplate>
</asp:Repeater>
protected void Page_Load(object sender, EventArgs e)
{
     Repeater1.DataSource = FacultyGridView1.GridView.Columns;
     Repeater1.DataBind();
}
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    AllowPaging="True" AllowSorting="True" PageSize="25">
    <PagerSettings Mode="NumericFirstLast" Position="TopAndBottom" />
    <Columns>
        <asp:BoundField DataField="Name" HeaderText="Name" ReadOnly="True" SortExpression="Name" />
        <asp:TemplateField HeaderText="University" SortExpression="UniversityID">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Eval("University.Name") %>' />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Division">
            <ItemTemplate>
                <asp:Repeater ID="Repeater1" runat="server" DataSource='<%# Eval("DivisionMemberships") %>'>
                    <ItemTemplate>
                        <asp:Label ID="Label2" runat="server" Text='<%# Eval("Division.Name") %>'></asp:Label>
                    </ItemTemplate>
                </asp:Repeater>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Title" HeaderText="Title" ReadOnly="True" SortExpression="Title" />
        <asp:TemplateField HeaderText="Research Type">
            <ItemTemplate>
                <asp:Repeater ID="Repeater1" runat="server" DataSource='<%# Eval("ResearchTypeMappings") %>'>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("ResearchType.Name") %>'></asp:Label>
                    </ItemTemplate>
                </asp:Repeater>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Expertise" HeaderText="Expertise" ReadOnly="True" SortExpression="Expertise" />
        <asp:HyperLinkField DataNavigateUrlFields="Website" DataTextField="Website" HeaderText="Website"
            SortExpression="Website" />
        <asp:BoundField DataField="Phone" HeaderText="Phone" ReadOnly="True" SortExpression="Phone" />
        <asp:TemplateField HeaderText="Email Address" SortExpression="EmailAddress">
            <ItemTemplate>
                <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("EmailAddress", "mailto:{0}") %>'
                    Text='<%# Eval("EmailAddress") %>'></asp:HyperLink>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

最后,我应该提到GridView是由页面上的一个按钮绑定的,但是无论我在数据绑定之前还是之后使用复选框,我都不会得到Visible属性的更新。此外,在使用if(!IsPostBack)仅在第一个页面上绑定转发器时,或者在不使用Checkbox.AutoPostback true或false时,我还没有看到所需的行为。关于我做错了什么有线索吗?我希望它是简单的,但我在这里有点生疏


请注意:我知道如何轻松地处理事件,但我想将数据绑定作为一种学习练习。

可能是因为每次网格绑定到数据时,都会重新创建列和设置(无需更改)。

我认为使用“简单”这个词在你的问题中,标题有点用词不当:-)似乎是一个简单的例子,但也许我的问题很冗长:)这似乎不是事实。我只将GridView绑定到它的数据一次,而且(如上所述),即使在数据绑定之后,复选框也不会更新GridView列。事实上,截取GridView数据绑定事件表明,即使在此之前,列也没有更新。此外,如果我重新绑定到列,我会发现即使单击复选框,它们的状态也不会改变。