2009-06-11 194 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

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