2009-06-11 123 views
0

我有一個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。任何線索我做錯了什麼?我期望它是簡單的,但我在這裏有點綠。

作爲一個說明:我知道如何輕鬆地處理事件,但我想用數據綁定作爲學習練習。

+1

我認爲在你的問題標題中使用「簡單」這個詞有點用詞不當:-) – ichiban 2009-06-11 23:13:47

+0

似乎是一個簡單的例子,但也許我的問題形成了非常羅嗦:) – JoshJordan 2009-06-11 23:55:50

回答

0

可能因爲每次網格綁定到數據時,都會重新創建列&設置(無需更改)。