2009-06-11 7 views
0

J'ai un GridView que j'utilise pour montrer à mes utilisateurs le résultat d'une recherche. Je veux leur permettre de choisir quelles colonnes sont affichées sur GridView lors de leur recherche. Assez simple, oui? Je voulais essayer de le faire en utilisant juste la liaison de données, pas d'événements. Malheureusement, mon code ne parvient pas à mettre à jour GridView en utilisant les cases à cocher liées à la propriété Visible de la colonne. L'état des chechboxes change, mais pas la propriété Visible des colonnes.Liaison de données simple aux colonnes gridview

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

Extrait de code-behind dans Search.aspx.cs:

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

Pour être clair, le GridView est exposé comme public propriété d'un contrôle utilisateur nommé FacultyGridView. extrait pertinent de 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> 

Enfin, je dois mentionner que le GridView est lié par un bouton sur la page, mais je ne reçois pas les mises à jour à la propriété Visible si je joue avec les cases à cocher avant ou après la liaison de données. En outre, je n'ai pas vu mon comportement souhaité lors de la liaison du répéteur seulement sur le premier Page_Load() en utilisant if (! IsPostBack), ni en n'utilisant pas Checkbox.AutoPostback true ou false. Une idée de ce que je fais mal? Je m'attends à quelque chose de simple, mais je suis un peu vert ici.

À noter: Je sais comment faire facilement cela avec les événements, mais je veux le faire avec la liaison de données comme un exercice d'apprentissage.

+1

Je pense avoir le mot "simple" dans le titre de votre question est un peu un abus :-) – ichiban

+0

Semble comme un cas simple, mais peut-être ma question a été formée très verbeuse :) – JoshJordan

Répondre

0

Probablement parce que chaque fois que la grille est liée aux données, les paramètres de la colonne & sont recréés (sans vos modifications).

+0

Cela ne semble pas être le cas. Je lie une seule fois le GridView à ses données, et (comme ci-dessus), les cases à cocher ne mettent pas à jour les colonnes GridView même après la liaison de données. En fait, l'interception de l'événement de liaison de données GridView montre que les colonnes ne sont pas mises à jour avant même cette date. De plus, si je me reconnais dans les colonnes, je vois que les cases à cocher ne changent jamais d'état même lorsque je clique dessus. – JoshJordan

Questions connexes