2013-05-02 19 views
7

Diciamo che ho una struttura di classe che sembra qualcosa di simile:dati principali di accesso in un nidificato ripetitore fortemente tipizzato

public class A 
{ 
    public string Poperty1 { get; set; } 
    public string Poperty2 { get; set; } 
    public List<B> Property3 { get; set; } 
} 

public class B 
{ 
    public string Property4 { get; set; } 
    public string Property5 { get; set; } 
} 

... e un paio di ripetitori nidificati che assomigliano a questo:

<asp:Repeater ItemType="A" runat="server"> 
    <ItemTemplate> 
     <asp:Label Text="<%# Item.Property1 %>" runat="server" /> 
     <asp:Repeater runat="server" DataSource="<%# Item.Property3 %>" ItemType="B"> 
      <ItemTemplate> 
       <asp:Label Text="<%# Item.Property4 %>" runat="server" /> 
      </ItemTemplate> 
     </asp:Repeater> 
    </ItemTemplate> 
</asp:Repeater> 

Come accedere alla Proprietà2 dal secondo ripetitore?

+1

Significa DataSource = "<% # Item.Property3%>" invece di DataSource = "<% # Item.Property2%>" –

+0

Sì, l'ho fatto. Grazie per averlo capito. –

risposta

8

Bene, da Accessing parent data in nested repeater, in the HeaderTemplate, ho trovato la seguente soluzione. Non è la più bella, ma funziona:

<%# ((Container.Parent.Parent as RepeaterItem).DataItem as A).Property2 %> 
+0

Speravo in una soluzione che includesse alcune proprietà magiche che contenevano il genitore fortemente tipizzato ... ma non sono stato in grado di trovarne uno ... –

3

si potrebbe usare una tupla generico come tipo per il ripetitore interno, e trasmettere l'elemento dal ripetitore esterno:

<asp:Repeater ItemType="A" runat="server" ID="Rpt"> 
    <ItemTemplate> 
     <asp:Label Text="<%# Item.Property1 %>" runat="server" /> 
     <asp:Repeater runat="server" 
      DataSource="<%# Item.Property3.Select(innerItem => new Tuple<A,B>(Item, innerItem)) %>" 
      ItemType="System.Tuple<A,B>"> 
      <ItemTemplate> 
       <asp:Label Text="<%# Item.Item2.Property4 %>" runat="server" /> 
      </ItemTemplate> 
     </asp:Repeater> 
    </ItemTemplate> 
</asp:Repeater> 

essere consapevoli del fatto che ReSharper protesterà contro l'uso di generici in ItemType!

Ecco un esempio diverso, più vicino a qualcosa che stava lavorando:

<asp:Repeater runat="server" ID="RptWeekNumbers" ItemType="System.Int32"> 
    <ItemTemplate> 
     <asp:Repeater runat="server" 
      DataSource="<%# Enumerable.Range(1, 5).Select(day => new Tuple<int,int>(Item, day))%>" 
      ItemType="System.Tuple<int,int>"> 
      <ItemTemplate> 
       WeekNumber: <%# Item.Item1 %>, 
       DayNumber: <%# Item.Item2 %> 
       <br /> 
      </ItemTemplate> 
     </asp:Repeater> 
    </ItemTemplate> 
</asp:Repeater> 
1

Quando si imposta il DataSource per il ripetitore interno:

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

Annotare il singolo apice quando si imposta il valore.

Problemi correlati