2010-07-28 16 views
8

I Ho uno schermo che deve essere un po 'più dinamico di quello a cui sono abituato e non riesco a trovare la risposta di cui ho bisogno.Repeater annidato

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

    savings with product b 

    (and so on) 

So che ci sarà sempre un minimo di uno in ogni campo. Qualcuno ha detto di usare un ripetitore annidato o qualcosa del genere. Mi sono guardato intorno e non sono riuscito a scoprire come utilizzare un ripetitore annidato. Sono in scadenza e non posso davvero giocare con le cose finché non trovo qualcosa che funzioni.

Quale controllo asp dovrei usare per fare questo? Un esempio sarebbe carino ma ho solo bisogno di aiuto nella giusta direzione.

Sto utilizzando sql ma ricevo i dati tramite link. I dati finiscono nelle liste.

Grazie per il vostro aiuto!

+0

Waht è la forma dei dati che si ottiene dal database?e come dovresti presentare queste informazioni, eventuali requiremnets dal design, usando div, tabelle? –

risposta

17

I ripetitori annidati sono piuttosto semplici. Basta buttare uno in ItemTemplate, e nel caso OnItemDataBound del ripetitore principale effettuare le seguenti operazioni

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(); 
} 

Dove il modello del ripetitore esterna ha avuto un nome del cliente e un ripetitore e quello interno ha diverse risparmio

sintassi probabilmente errata, ma si ottiene l'idea

<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

È possibile utilizzare un GridView con AutoGenerateColumns = "true". Questo creerà i tuoi contatti basati sull'origine dati che stai vincolando.

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

Considerate questa classe

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

E questo codice

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(); 

Questo genererà una tabella HTML con alle colonne denominati Field1 e Campo2 con i corrispondenti 3 righe. Somthing come questo.

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

Se si modifica l'origine dati ad un'altra sorgente con colonne differnt esso genererà automaticamente le colonne corrispondenti per voi.

3

so che questa domanda è per un datatable, ma ho trovato questa domanda mentre cercavo di svolgere lo stesso compito con gli oggetti e non ho trovato una risposta e ho pensato che sarebbe stata utile per qualcun altro.

Se si utilizza un oggetto che ha nidificato oggetti in esso, si imposta l'origine dati come questo

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

sono arrivato a questa conclusione su tutte le altre risposte sembrare troppo complicato

Qui è la mia ripetitore completo codice

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