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

War es hilfreich?

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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top