2009-07-29 9 views
23

Mam poniżej następujący wzmacniacz i próbuję znaleźć LblA w kodzie za i nie powiedzie się. Poniżej znaczników są próby Podjąłem:Nie można znaleźć kontroli w ramach wzmacniacza asp.net?

<asp:Repeater ID="rptDetails" runat="server"> 
    <HeaderTemplate> 
     <table> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <tr> 
      <td><strong>A:</strong></td> 
      <td><asp:Label ID="lblA" runat="server"></asp:Label> 
      </td> 
     </tr> 
    </ItemTemplate> 
</asp:Repeater> 
</table> 

Najpierw próbowałem,

Label lblA = (Label)rptDetails.FindControl("lblA"); 

ale lblA NULL

Następnie próbowałem,

Label lblA = (Label)rptDetails.Items[0].FindControl("lblA"); 

ale Pozycje było 0 mimo że wzmacniacz m zawiera 1 sztukę szablonów

Odpowiedz

28

trzeba ustawić atrybut OnItemDataBound="myFunction"

A potem w kodzie mają następujące

void myFunction(object sender, RepeaterItemEventArgs e) 
{ 
    Label lblA = (Label)e.Item.FindControl("lblA"); 
} 

Nawiasem mówiąc można użyć dokładnie tego samego podejścia do zagnieżdżonych przemienników. IE:

<asp:Repeater ID="outerRepeater" runat="server" OnItemDataBound="outerFunction"> 
<ItemTemplate> 
    <asp:Repeater ID="innerRepeater" runat="server" OnItemDataBound="innerFunction"> 
    <ItemTemplate><asp:Label ID="myLabel" runat="server" /></ItemTemplate> 
    </asp:Repeater> 
</ItemTemplate> 
</asp:Repeater> 

A potem w kodzie:

void outerFunction(object sender, RepeaterItemEventArgs e) 
{ 
    Repeater innerRepeater = (Repeater)e.Item.FindControl("innerRepeater"); 
    innerRepeater.DataSource = ... // Some data source 
    innerRepeater.DataBind(); 
} 
void innerFunction(object sender, RepeaterItemEventArgs e) 
{ 
    Label myLabel = (Label)e.Item.FindControl("myLabel"); 
} 

Zbyt często widzę ludzi ręcznie wiążące elementy na wewnętrznej repeater i nie zdają sobie sprawy, jak trudno Robią rzeczy dla siebie .

+0

jestem trochę zdezorientowany. To, co faktycznie robię, to kliknięcie linku Wyświetl szczegóły na 1 stronie, przeniesie mnie do szczegółowego widoku na innej stronie, która ma repeater i na page_load, próbuję zlokalizować lblA – Xaisoft

+0

Edytowany. Mam nadzieję, że wyjaśnia to nieco więcej. –

+0

Ok, skończyło się to na przeniesieniu zmiennej DataTable na najwyższy poziom klasy. Następnie stworzyłem ItemDataBoundEvent i tam sprawdziłem lblA we wzmacniaczu, a jeśli go znalazł, ustaw go na tekst, który otrzymałem z rzędu w DataTable. Czy mam rację w moim rozumieniu tego? Dzięki – Xaisoft

1

Kod VB.net

Protected Sub rptDetails_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptDetails.ItemDataBound  
     If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then 
     Dim lblA As Label = CType(e.Item.FindControl("lblA"), Label) 
     lblA.Text = "Found it!" 
     End If 
    End Sub 
0

należy wiązać pierwszy.
na przykład)

rptDetails.DataSource = dataSet.Tables["Order"]; 

rptDetails.DataBind(); 
7

prostu miałem ten sam problem.

Brakuje nam elementu typu typu podczas zapętlania elementów. Pierwszym elementem w repeterze jest nagłówek, a w nagłówku nie ma elementów asp, których szukamy.

Spróbuj tego:

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    {Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");} 
+0

dzięki, mam ten sam problem wymyślić problem. SO jest świetne! – Kamran

+0

ditto - to naprawdę powinno być zawarte na przykładach MSDNs ... ale czego powinniśmy oczekiwać od tego huh? – Rich

Powiązane problemy