2009-06-02 10 views
0

Je vais développer une page de calendrier d'événements qui affichera une liste d'événements pour 12 mois à partir de la date actuelle (ce sera en lecture seule). Il est assez facile de saisir les données de la base de données avec un SP passant la date de début et le nombre de mois, etc., mais je dois regrouper les informations par mois quand elles sont affichées dans la page. par exemple. :Afficher la liste des événements dans un GridView/Repeater/ListView

 

================================ 
June 2009 
================================ 
Event 1 
1 June 2009 to 2 June 2009 
Event info 
-------------------------------- 
Event 2 
20 June 2009 to 21 June 2009 
Event info 
================================ 
July 2009 
================================ 
Event 3 
1 July 2009 to 2 July 2009 
Event info 
-------------------------------- 

...some more months/events here... 

================================ 
May 2010 
================================ 
Event 99 
10 May 2010 to 11 May 2010 
Event info 
-------------------------------- 

J'ai vu d'autres postes où les gens parlent GridViews de nidification dans redoublants et vice versa, mais je suis sûr que je voudrais obtenir le regroupement par mois en utilisant cette méthode.

Répondre

2

Liez votre répéteur à quelque chose qui énumère les mois. Placez une vue de grille dans le modèle d'élément du répéteur. Dans l'événement ItemDataBound du répéteur, liez le gridview à quelque chose qui énumère tous les événements de ce mois. Vous pouvez obtenir le mois à partir de l'objet RepeaterItemEventArgs.Item.DataItem qui contient l'élément lié à l'élément répéteur.

<asp:Repeater ID="Repeater1" runat="server" 
     onitemdatabound="Repeater1_ItemDataBound"> 
    <ItemTemplate> 
     <asp:GridView ID="GridView1" runat="server"> 
     </asp:GridView> 
    </ItemTemplate> 
    </asp:Repeater> 



protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    GridView gridview = e.Item.FindControl("GridView1") as GridView; 
    gridview.DataSource = ...; 
    gridview.DataBind(); 
} 

EDIT: Mise à jour pour montrer comment est généré la plage de mois.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     DateTime currentDate = DateTime.Now; 
     DateTime startDate = new DateTime(currentDate.Year, currentDate.Month, 1); 
     List<DateTime> dateRange = new List<DateTime>(); 
     for (int i = 0; i < 12; i++) 
      dateRange.Add(startDate.AddMonths(i)); 

     Repeater1.DataSource = dateRange; 
     Repeater1.DataBind(); 
    } 
} 
0

Fondamentalement, un GridView est une table, en utilisant des tables dans redoublants ne très bien, vous devriez envisager cette option conjointement avec DataBinder.Eval tels que:

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1"> 
     <ItemTemplate> 
      <table> 
       <caption><%# Eval("MONTH") %></caption> 
       <tr> 
        <td><%# Eval("EVENT_NAME") %></td> 
       </tr> 
       <tr> 
        <td><%# Eval("DATE_BEGIN") %> to <%# Eval("DATE_END") %></td> 
       </tr> 
       <tr> 
        <td><%# Eval("EVENT_INFO") %></td> 
       </tr> 
      </table> 
     </ItemTemplate> 
    </asp:Repeater> 

Inconsciemment cela créerait une table pour chaque événement. Vous pouvez aussi commencer la table dans le et le terminer dans le FooterTemplate.

Maintenant tout ce dont vous avez besoin est de retourner les données en conséquence.

Bonne chance.

+0

Cela ne satisfait pas la nécessité de regrouper les événements par mois cependant? c'est-à-dire s'il y a deux événements en juin, je ne veux pas afficher plus d'une fois la rubrique «juin 2009». –

+0

Répéteur imbriqué serait par la solution. Fondamentalement, un répéteur à l'intérieur du ItemTemplate du premier, remplaçant le OnItemDataBound du premier répéteur. Voir: http://www.dotnetspider.com/resources/744-Using-Nested-Repeater-Controls.aspx http://www.codeproject.com/KB/aspnet/AspNetNestedRepeaters.aspx http: // www.voidnish.com/articles/ShowArticle.aspx?code=AspNetNestedRepeaters D'accord, notez la méthode CreateChildView. Bonne chance! – maxbeaudoin

Questions connexes