webForumDet fria alternativet

Hämta värde ur en annan repeater?

.NET

3 svar · 393 visningar · startad av mozilla

Medlem sedan juli 20011 084 inlägg
Frågan#1

Jag 3 stycken nästlade repeater enligt följande mall och bindar sedan mitt dataset vilket innehåller relationer mellan olika tabeller.

<asp:Repeater id="level1" runat="server">
  <ItemTemplate>
    <h1><asp:Label id="lblHeader" runat="server" /></h1>

    <asp:Repeater id="level2" runat="server">
      <ItemTemplate>
        <p>[b]<asp:label id="lblNumber" runat="server" />[/b] <asp:Label id="lblText" runat="server" /></p>

        <asp:Repeater id="level3" runat="server">
          <ItemTemplate>
            <li>[b]<asp:label id="lblNumber" runat="server" />[/b] <asp:label id="lblList" runat="server" /></li>
          </ItemTemplate>
        </asp:Repeater>

      </ItemTemplate>
    </asp:Repeater>

  </ItemTemplate>
</asp:Repeater>

Jag vill i lblNumber skriva ut vilken iteration som man är på, detta gör jag i level2 genom (e.Item.ItemIndex + 1). Men i level3 vill jag fortfarande skriva ut level2's iterationsnummer. Men jag lyckas inte komma åt den repeatern. För att skriva ut iterationsnummer för level1 kan man använda (level1.Items.Count + 1). Men hur gör jag för att hitta level2 repeatern i level3?

Någon som förstår vad jag menar? :)

Önskat resultat
Rubrik
1. texten
* 1.1 foo
* 1.2 bar
Rubrik
2. texten
* 2.1 foo
* 2.2 bar

Medlem sedan juli 20011 084 inlägg
#2

Okej, verkar som ingen förstår :OO

Försöker förklara det en gång till, glöm bort det jag sa i första inlägget om det komplicerar till sakerna?

Jag vill helt enkelt komma åt en repeater som ligger i en annan repeater. Att bara använda namnet på repeatern fungerar inte. Och mina försök med FindControl och liknande vill inte riktigt fungera.

Dvs, när jag använder

level2.Items.Count

klagar den på att den inte hittar min repeater med id="level2

Medlem sedan sep. 20011 914 inlägg
#3

Otestad kod. Lek lite med den så borde du komma fram till något.

//.aspx
<asp:Repeater id="repLevel1" onitemdatabound="repLevel1_itemdatabound" runat="server">
  <ItemTemplate>
    <asp:label id="lbLevel1" runat="server" />
    <asp:Repeater id="repLevel2" onitemdatabound="repLevel2_itemdatabound" runat="server">
      <ItemTemplate>
        <asp:label id="lbLevel2" runat="server" />
        <asp:Repeater id="repLevel3" onitemdatabound="repLevel3_itemdatabound" runat="server">
          <ItemTemplate>
             <asp:label id="lbLevel3" runat="server" />
          </ItemTemplate>
        </asp:Repeater>
      </ItemTemplate>
    </asp:Repeater>
  </ItemTemplate>
</asp:Repeater>

//.cs
private int _level1Counter = 0;
private int _level2Counter = 0;
private int _level3Counter = 0;

public void repLevel1_itemdatabound(object sender, RepeaterItemEventArgs e)
{
   if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
   {
      this._level1Counter++;
      ((Label)e.Item.FindControl("lbLevel1")).Text = "Något";
      Repeater rep = e.Item.FindControl("repLevel2") as Repeater;
      rep.DataSource = GetDataForLevel2();
      rep.DataBind();
      this._level1Counter = 0;
   }
}

public void repLevel2_itemdatabound(object sender, RepeaterItemEventArgs e)
{
   if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
   {
      this._level2Counter++;
      ((Label)e.Item.FindControl("lbLevel2")).Text = string.Format("{0}.{1}", this._level1Counter.ToString(), this._level2Counter.ToString());
      Repeater rep = e.Item.FindControl("repLevel3") as Repeater;
      rep.DataSource = GetDataForLevel3();
      rep.DataBind();
      this._level2Counter = 0;
   }
}

public void repLevel3_itemdatabound(object sender, RepeaterItemEventArgs e)
{
   if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
   {
      this._level3Counter++;
      ((Label)e.Item.FindControl("lbLevel3")).Text = string.Format("{0}.{1}", this._level2Counter.ToString(), this._level3Counter.ToString());
      this._level3Counter = 0;
   }
}
Medlem sedan juli 20011 084 inlägg
#4

Tack för ditt förslag, men det kändes dock lite onödigt när jag misstänkte att informationen redan fanns i mina repeatrar. Och ja har äntligen kommit på hur man gör. Blev så glad så jag kände för att dela med mig :e

Repeater level2 = (Repeater)level1.Controls[0].FindControl("level2");
lblNumber.Text = String.Format("{0}.{1}", (level2.Items.Count + 1), (e.Item.ItemIndex + 1));

För just hemsidan i fråga är lösningen perfekt (privat hemsida). Men finns det någon nackdel (prestanda) att göra som i mitt exempel?

254 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)