2009-02-03 7 views
4

Y at-il un moyen d'afficher une ligne de sous-en-tête lors de changements dans un champ dans un asp de databound: contrôle de répéteur par ex.asp: répéteur - en-têtes au changement de section

Au lieu de

 
country | colour | number 
uk | red | 3 
uk | green | 3 
france | red 3

Pour ce faire:

 
==UK== 
colour | number 
red | 3 
green 3 
==FRANCE== 
colour | number 
red | 3

Un grand merci pour toute aide.

Répondre

0

Il semble y avoir quelques bugs dans le code dotnetjunkies mais j'ai trouvé beaucoup plus simple solution ici http://www.west-wind.com/weblog/posts/140753.aspx

Maintenant répéteurs ne prennent pas en charge le regroupement, donc vous devez le faire vous-même, mais il est assez facile à faire. Dans le répéteur ci-dessus l'expression de données suivantes est responsable du groupement:

<%# this.RenderGroup(Eval("Group") as 
string) %> 

L'expression appelle une méthode sur la forme pour rendre une balise div supplémentaire. Le code de cette méthode simple ressemble à ceci:

string LastGroup = "@#@~"; 
protected string RenderGroup(string Group) { 
    if (Group == this.LastGroup)  
    return "";  // *** Group has changed  
    this.LastGroup = Group;  
    return "<div class='groupheader'>" +Group + "</div>"; 
} 

Ce code est appelé pour chaque élément et il vérifie simplement si le groupe a changé. Si rien n'a été renvoyé, une simple balise div est renvoyée sous la forme d'une chaîne à incorporer dans le balisage. J'ai choisi de renvoyer le HTML mais je suppose que vous pouvez aussi retourner vrai ou faux et rendre un contrôle conditionnel dans le Répéteur, ce qui rendrait les CSS nazis plus heureux.

0

Ah - vous recherchez un répéteur de groupe. Le solution que j'ai adapté dans le passé semble avoir disparu. Peut-être que vous pouvez le trouver. Mais de toute façon, une recherche de répéteurs de regroupement devrait aider.

+0

Bravo, c'est ce que je cherche. – ctrlalt3nd

+0

Cet article ne fonctionne plus. – NotMe

5

Il n'y a pas de support intégré, mais cela ne signifie pas que c'est impossible.

Vous aurez besoin de l'emporter sur l'événement OnItemDataBound, et quelque chose comme ceci dans le balisage:

<asp:Repeater OnItemDataBound="NextItem" ... > 
    <ItemTemplate><asp:Literal Id="Header" Visible="False" Text="{0}<strong>{1}</strong><br/><table>" ... /> 
     <tr> 
      <td><asp:Label id="Color" Text="<%# Eval("Color")" ... /></td> 
      <td><asp:Label id="Number" Text="<%# Eval("Number")" ... /></td> 
     </tr> 
    </ItemTemplate> 
</asp:Repeater></table> 

Puis dans le code-behind:

private string CurCountry = string.Empty; 

private void NextItem(object sender, RepeaterItemEventARgs e) 
{ 
    if (e.Item.ItemType != ListItemType.Item 
     && e.Item.ItemType != ListItemType.AlternatingItem) return; 

    DbDataRecord row = (DbDataRecord)e.Item.DataItem; 

    if (CurCountry != row["country"].ToString()) 
    { 
     string prev = (CurCounter == string.Empty)?"":"</table>"; 
     CurCountry = row["country"].ToString(); 

     Literal header = (Literal)e.Item.FindControl("Header"); 
     Literal footer = (Literal)e.Item.FindControl("Footer"); 

     header.Text = string.Format(header.Text, prev, CurCountry); 
     header.Visible = true; 
    } 
} 
+0

Merci! Cela a fonctionné pour moi. – Eden

0

Pour joel Solution, je peut conseiller suivant - modifier cette ligne:

header.Text = string.Format("<strong> {0} </strong><br/><table>", CurCountry); 

à

header.Text = string.Format(header.Text, CurCountry); 

Et que vous pouvez personnaliser regarder & se sentir à partir du fichier .as? X.

1

Une autre solution consiste simplement à utiliser deux répéteurs, l'un imbriqué dans l'autre. Vous pouvez transmettre vos groupes avec les enregistrements enfants au premier répéteur, et sur la balise ItemDataBound du répéteur de groupes, passez les enregistrements enfants au répéteur enfant et appelez DataBind() à cet endroit.

Ceci est plus de code mais vous donne réellement plus de contrôle sur la mise en page sans avoir de code de création HTML dans votre code-behind. Comme vous pouvez le voir ici, nous avons un répéteur parent et dans le modèle d'élément, nous pouvons personnaliser chaque groupe comme bon nous semble.Dans le ChildRepeater, nous avons notre modèle d'élément dans lequel nous pouvons personnaliser chaque élément à l'intérieur du groupement. Très propre et tout avec interface utilisateur déclarative.

<asp:Repeater runat="server" id="GroupRepeater"> 
<ItemTemplate> 
    <asp:Literal runat="server" id="HeaderText" /> 
    <asp:Repeater runat="server id="ChildRepeater"> 
    <ItemTemplate> 
     <asp:Literal runat="server" id="InfoGoesHere" /> 
    </ItemTemplate> 
    </asp:Repeater> 
</ItemTemplate> 
</asp:Repeater> 

Dans le code derrière nous pouvons avoir quelque chose comme ceci:

private void GroupRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    //Get the child records, this can be any data structure you want 
    SomeChildCollection children = ((SomeGroupCollection)e.Item.DataItem).Children; 
    //Find the child repeater 
    Repeater childRepeater = e.Item.FindControl("ChildRepeater") as Repeater; 
    childRepeater.ItemDataBound += SomeMethod; 
    childRepeater.DataSource = children; 
    childRepeater.DataBind(); 
} 

Après la liaison de chaque enfant, vous pouvez souscrire à l'événement ItemDataBound et faire l'enfant se liant à des contrôles comme bon vous semble.

+0

+1 aux répéteurs imbriqués. Cet article a une approche similaire qui est essentiellement la même que cette réponse, mais peut aider les autres: http://www.codeproject.com/KB/aspnet/AspNetNestedRepeaters.aspx – bkaid

Questions connexes