2009-07-29 6 views
23

Ich habe den folgenden Repeater unten und ich versuche, IblA in Code zu finden, und es schlägt fehl. Unterhalb der Markup sind die Versuche, die ich gemacht habe:Kann die Steuerung in ASP.net Repeater nicht finden?

<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 war 0, obwohl m Repeater enthält 1 ItemTemplate

Antwort

28

Sie müssen das Attribut OnItemDataBound="myFunction"

Und dann in Ihrem Code setzen Sie die folgenden

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

Im übrigen können Sie für verschachtelte Repeater diesen exakt gleichen Ansatz. 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 machen .

+0

Ich bin ein wenig verwirrt. Was ich gerade mache ist, wenn ich auf einen Link Details anzeigen auf 1 Seite klicke, es bringt mich zu einer Detailansicht auf einer anderen Seite, die den Repeater hat und in page_load versuche ich lblA – Xaisoft

+0

Edited zu lokalisieren. Hoffentlich erklärt das ein bisschen mehr. –

+0

Ok, was ich getan habe, war das Verschieben einer DataTable-Variable auf die oberste Ebene der Klasse. Dann habe ich das ItemDataBoundEvent erstellt und dort nach dem lblA im Repeater gesucht und wenn es gefunden wurde, setze es auf einen Text, den ich von einer Zeile in der DataTable zurückbekommen habe. Habe ich recht, wenn ich das verstehe? Danke – Xaisoft

1

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

Sie zuerst binden sollte.
zum Beispiel)

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

rptDetails.DataBind(); 
7

Ich hatte gerade das gleiche Problem.

Wir vermissen den Artikeltyp beim Einschleifen der Artikel. Das allererste Element im Repeater ist der Header, und Header hat nicht die Asp-Elemente, nach denen wir suchen.

Versuchen Sie folgendes:

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

danke Mann, ich habe das gleiche Problem und ich verbringe so viel Zeit Finde das Problem heraus. SO ist großartig !! – Kamran

+0

dito - das sollte eigentlich in MSDNs eigenem Beispiel enthalten sein ... aber was sollen wir von dem erwarten? – Rich

Verwandte Themen