Kann nicht die Kontrolle innerhalb asp.net Repeater finden?
Frage
Ich habe folgendes Repeater unten und ich versuche LBLA in Code-behind zu finden und es funktioniert nicht. Unterhalb der Markup sind die Versuche, die ich gemacht habe:
<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>
Zuerst habe ich versucht,
Label lblA = (Label)rptDetails.FindControl("lblA");
aber LBLA war null
Dann habe ich versucht,
Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");
aber Artikel von 0 obwohl m Repeater enthält 1 itemtemplate
Lösung
Sie müssen das Attribut OnItemDataBound="myFunction"
einstellen
Und dann im Code gehen Sie wie folgt
void myFunction(object sender, RepeaterItemEventArgs e)
{
Label lblA = (Label)e.Item.FindControl("lblA");
}
Im übrigen können Sie genau diesen gleichen Ansatz für verschachtelte Repeater einsetzen. 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>
Und dann in Ihrem Code:
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");
}
Allzu oft sehe ich Leute Elemente manuell auf einer inneren Repeater Bindung und sie nicht erkennen, wie schwierig sie Dinge für sich selbst zu machen.
Andere Tipps
Ich habe gerade das gleiche Problem.
Wir vermissen den Elementtyp , während in den Einzelteilen Looping. Der erste Punkt in dem Repeater ist die Header , und Header nicht über die asp Elemente, die wir suchen.
Versuchen Sie folgendes:
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");}
-Code für 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
Untersuchen Sie die Repeater.ItemDataBound Ereignis .
Sie sollten binden zuerst.
zum Beispiel)
rptDetails.DataSource = dataSet.Tables["Order"];
rptDetails.DataBind();