我有一個GridView,用於向用戶顯示搜索結果。我想讓他們選擇在執行搜索時在GridView上顯示哪些列。很簡單,是嗎?我想嘗試使用只是數據綁定,沒有事件。不幸的是,我的代碼無法使用綁定到列的Visible屬性的複選框更新GridView。 chechboxes的狀態發生變化,但列的Visible屬性不變。的簡單的數據綁定到gridview列
片段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:
protected void Page_Load(object sender, EventArgs e)
{
Repeater1.DataSource = FacultyGridView1.GridView.Columns;
Repeater1.DataBind();
}
需要明確的是,在GridView公開爲公共名爲FacultyGridView的用戶控件的屬性。的FacultyGridView.ascx相關片段:
<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)綁定中繼器時只有在第一個Page_Load()上,或者沒有使用Checkbox.AutoPostback時,我還沒有看到我期望的行爲true或false。任何線索我做錯了什麼?我期望它是簡單的,但我在這裏有點綠。
作爲一個說明:我知道如何輕鬆地處理事件,但我想用數據綁定作爲學習練習。
我認爲在你的問題標題中使用「簡單」這個詞有點用詞不當:-) – ichiban 2009-06-11 23:13:47
似乎是一個簡單的例子,但也許我的問題形成了非常羅嗦:) – JoshJordan 2009-06-11 23:55:50