2010-07-28 7 views
8

I Avoir un affichage qui doit être un peu plus dynamique que ce que je suis habitué et ne semble pas trouver la réponse dont j'ai besoin.Répéteur imbriqué

     Customer a  Customer b  Customer c (and so on) 
    savings with product a 

    savings with product b 

    (and so on) 

Je sais qu'il y aura toujours un minimum dans chaque champ. Quelqu'un a dit utiliser un répéteur imbriqué ou quelque chose. J'ai regardé autour et je n'ai pas pu trouver comment utiliser un répéteur imbriqué. Je suis sur une date limite et je ne peux pas vraiment jouer avec les choses jusqu'à ce que je trouve quelque chose qui fonctionne.

Quel contrôle d'ASP devrais-je utiliser pour faire ceci? Un exemple serait bien mais j'ai juste besoin d'aide dans la bonne direction. J'utilise sql mais j'obtiens les données via le lien. Les données se retrouvent dans des listes.

Nous vous remercions de votre aide!

+0

Quelle est la forme des données que vous obtenez de la base de données?et comment devriez-vous présenter cette information, n'importe quels requiremnets du design, usingg divs, tables? –

Répondre

17

Les répéteurs imbriqués sont assez faciles. Il suffit de jeter un dans votre ItemTemplate, et en cas OnItemDataBound de votre répéteur principal, procédez comme suit

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
{ 
    DataRowView row = (DataRowView)e.Item.DataItem; 

    Repeater nestedRepeater = e.Item.FindControl("NestedRepeater") as Repeater; 
    nestedRepeater.DataSource = getSavingsPerCustomer(row["customerID"]); 
    nestedRepeater.DataBind(); 
} 

Lorsque le modèle du répéteur externe avait un nom de client et un répéteur et une intérieure a les différentes économies

syntaxe probablement incorrecte, mais vous obtenez l'idée

<asp:repeater ID="outer"> 
<HeaderTemplate> 
    <div style="float:left"> 
</HeaderTemplate> 
<ItemTemplate> 
    Customer: <%= Eval(customer)%><br/> 
    <asp:repeater ID="NestedRepeater"> 
      <ItemTemplate> 
      Saving: <%= Eval(saving)%><br/> 
      </ItemTemplate> 
    </asp:repeater> 
</ItemTemplate> 
<FooterTemplate> 
    </div> 
</FooterTemplate> 
</asp:repeater> 

Similar SO question: Repeater in Repeater

1

Vous pouvez utiliser GridView avec AutoGenerateColumns = "true". Cela créera vos colonnes en fonction de la source de données que vous liez.

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true"> 
</asp:GridView> 

Tenir compte de cette classe

public class A 
{ 
    public string Field1 { get; set; } 
    public int Field2 { get; set; } 
} 

Et ce code

GridView1.DataSource = new List<A>() { 
    new A() { Field1 = "a", Field2 = 1 }, 
    new A() { Field1 = "b", Field2 = 2 }, 
    new A() { Field1 = "c", Field2 = 3 }, 
}; 
GridView1.DataBind(); 

Cela va générer un tableau HTML avec des colonnes nommées Field1 et Field2 avec les 3 lignes correspondantes. Quelque chose comme ça.

<table> 
    <tbody> 
     <tr> 
      <th scope=col>Field1</th> 
      <th scope=col>Field2</th> 
     </tr> 
     <tr> 
      <td>a</td> 
      <td>1</td> 
     </tr> 
     <tr> 
      <td>b</td> 
      <td>2</td> 
     </tr> 
     <tr> 
      <td>c</td> 
      <td>3</td> 
     </tr> 
    </tbody> 
</table> 

Si vous changez la source de données à une autre source avec des colonnes differnt il génère automatiquement les colonnes correspondantes pour vous.

3

Je sais que cette question est pour un datatable, mais j'ai trouvé cette question en essayant d'accomplir la même tâche avec des objets et je n'ai pas trouvé de réponse et je pensais que cela serait utile pour quelqu'un d'autre.

Si vous utilisez un objet qui a des objets imbriqués dans, vous définissez la source de données comme celui-ci

DataSource='<%# Eval("ChildDataSourceProperty") %>' 

Je suis venu à cette conclusion sur toutes les autres réponses semblant trop compliquées

Voici mon code répéteur complet

<asp:Repeater ID="linkGroups" 
       runat="server" 
       DataSource="add your datasource"> 
    <ItemTemplate> 
     <dt><%# Eval("ParentProperty") %></dt> 
     <dd>     
      <asp:Repeater ID="links" 
          runat="server" 
          DataSource='<%# Eval("ChildDataSourceProperty") %>'> 
       <ItemTemplate> 
        <p><%# Eval("ChildObjectProperty") %></p> 
       </ItemTemplate> 
      </asp:Repeater> 
     </dd> 
    </ItemTemplate> 
</asp:Repeater> 
Questions connexes