【发布时间】:2009-06-11 23:04:24
【问题描述】:
我有一个 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>
Search.aspx.cs 中的代码隐藏 sn-p:
protected void Page_Load(object sender, EventArgs e)
{
Repeater1.DataSource = FacultyGridView1.GridView.Columns;
Repeater1.DataBind();
}
明确地说,GridView 公开为名为 FacultyGridView 的用户控件的公共属性。 FacultyGridView.ascx的相关sn-p:
<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 由页面上的 Button 绑定,但无论我在数据绑定之前还是之后使用复选框,我都没有更新 Visible 属性。此外,使用 if(!IsPostBack) 在第一个 Page_Load() 上绑定转发器 only 时,我没有看到我想要的行为,也没有使用 Checkbox.AutoPostback true 或 false。关于我做错了什么的任何线索?我希望它是简单的东西,但我在这里有点绿色。
作为说明:我知道如何通过事件轻松地做到这一点,但我想通过数据绑定作为学习练习来做到这一点。
【问题讨论】:
-
我认为在你的问题标题中使用“简单”这个词有点用词不当:-)
-
看起来像一个简单的案例,但也许我的问题很罗嗦:)
标签: asp.net data-binding