2010-07-28 20 views
8

Tengo una pantalla que necesita ser un poco más dinámica de lo que estoy acostumbrado y parece que no puede encontrar la respuesta que necesito.Repetidor anidado

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

    savings with product b 

    (and so on) 

sé que siempre habrá un mínimo de uno en cada campo. Alguien dijo usar un repetidor anidado o algo así. Miré a mi alrededor y no pude descubrir cómo usar un repetidor anidado. Estoy en una fecha límite y no puedo jugar con las cosas hasta que encuentre algo que funcione.

¿Qué control asp debo usar para hacer esto? Un ejemplo sería bueno, pero solo necesito ayuda en la dirección correcta.

Estoy usando sql pero obtengo los datos a través del enlace. Los datos terminan en listas.

¡Gracias por tu ayuda!

+0

Waht es la forma de los datos que youe obtener de la base de datos?y ¿cómo se debe presentar esta información, cualquier requerimiento del diseño, usando divs, tablas? –

Respuesta

17

Repetidores anidados son bastante fáciles. Acaba de lanzar uno en su ItemTemplate, y en el caso OnItemDataBound de su repetidor principal haga lo siguiente

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

Cuando la plantilla del repetidor exterior tenía un nombre de cliente y un repetidor y la interior tiene los diferentes ahorro

sintaxis probablemente incorrecta, pero se entiende la 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

Puede usar un GridView con AutoGenerateColumns = "true". Esto creará sus columnas basadas en el origen de datos que está vinculando.

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

considerar esta clase

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

Y este código

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

Esto generará una tabla HTML con columnas llamadas a Campo1 y Campo2 con los correspondientes 3 filas. Algo así.

<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 cambia la fuente de datos a otra fuente con columnas diferentes personas que generará automáticamente las columnas correspondientes para usted.

3

sé que esta pregunta es para una tabla de datos, pero encontré esta pregunta al intentar realizar la misma tarea con los objetos y no encontré una respuesta y pensé que sería útil para otra persona.

Si está utilizando un objeto que ha anidado objetos en ella, se establece el origen de datos como éste

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

llegué a esta conclusión a todas las otras respuestas parecer demasiado complicado

Aquí está mi código repetidor completo

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