2009-06-11 1 views
0

Ich habe eine GridView, die ich benutze, um meinen Benutzern das Ergebnis einer Suche zu zeigen. Ich möchte ihnen erlauben zu wählen, welche Spalten in der GridView angezeigt werden, wenn sie ihre Suche durchführen. Einfach genug, ja? Ich wollte versuchen, dies zu tun mit nur Datenbindung, keine Ereignisse. Leider kann mein Code die GridView nicht mithilfe von Kontrollkästchen aktualisieren, die an die Visible-Eigenschaft der Spalte gebunden sind. Der Status der Chechboxen ändert sich, die Visible-Eigenschaft der Spalten jedoch nicht.Einfache Datenbindung an GridView-Spalten

Snippet 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> 

-Code-behind-Schnipsel in Search.aspx.cs:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Repeater1.DataSource = FacultyGridView1.GridView.Columns; 
    Repeater1.DataBind(); 
} 

Um klar zu sein, das Gridview als öffentliche ausgesetzt ist Eigenschaft eines Benutzersteuerelements mit dem Namen FacultyGridView. Relevante Snippet 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> 

Abschließend möchte ich erwähnen, dass die Gridview durch einen Knopf auf der Seite gebunden ist, aber ich bin nicht Updates für die Visible-Eigenschaft bekommen, ob ich mit den Kontrollkästchen spielen vor oder nach Datenbindung. Außerdem habe ich mein gewünschtes Verhalten beim Binden des Repeaters only auf der ersten Page_Load() nicht mit if (! IsPostBack) gesehen, noch durch das Verwenden von Checkbox.AutoPostback True oder False. Irgendeine Ahnung, was ich falsch mache? Ich erwarte, dass es etwas Einfaches ist, aber ich bin hier ein bisschen grün.

Als Anmerkung: Ich weiß, wie man dies leicht mit Ereignissen macht, aber ich möchte es mit Databinding als Lernübung machen.

+1

Ich denke, das Wort "einfach" in Ihrer Frage Titel ist ein bisschen falsch :-) – ichiban

+0

Scheint wie ein einfacher Fall, aber vielleicht war meine Frage sehr wortreich formuliert :) – JoshJordan

Antwort

0

Wahrscheinlich, weil jedes Mal, wenn das Gitter an die Daten gebunden ist, die Spalte & Einstellungen neu erstellt werden (ohne Ihre Änderungen).

+0

Dies scheint nicht der Fall zu sein. Ich binde die GridView nur einmal an ihre Daten und (wie oben), die Checkboxen aktualisieren die GridView-Spalten auch nach der Datenbindung nicht. In der Tat zeigt das Abfangen des Databaseding-Ereignisses GridView, dass die Spalten nicht einmal davor aktualisiert werden. Außerdem, wenn ich an die Spalten neu binde, sehe ich, dass die Kontrollkästchen den Status niemals ändern, selbst wenn ich darauf klicke. – JoshJordan