it-swarm.com.de

Repeater im Repeater

Ich habe einen Repeater in einem Repeater. Wenn der übergeordnete Repeater an eine Datatble gebunden ist, die eine Spalte mit einer Datatable enthält.

Ich möchte den untergeordneten Repeater an die datierbare Spalte im Datumsbereich des übergeordneten Repeaters binden

Ist das möglich? Ich dachte, ich könnte das direkt in der aspx-Datei machen:

DataSource="<%# DataBinder.Eval(Container.DataItem, "Products")%>" scheint aber nicht zu funktionieren. 

42
bill

Hängen Sie im übergeordneten Repeater eine Methode an das OnItemDataBound-Ereignis an, und suchen Sie in der Methode den verschachtelten Repeater und binden Sie ihn an die Daten.

Beispiel (.aspx):

<asp:Repeater ID="ParentRepeater" runat="server" OnItemDataBound="ItemBound">
    <ItemTemplate>
        <!-- Repeated data -->
        <asp:Repeater ID="ChildRepeater" runat="server">
            <ItemTemplate>
                <!-- Nested repeated data -->
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

Beispiel (.cs):

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        ParentRepeater.DataSource = ...;
        ParentRepeater.DataBind();
    }
}

protected void ItemBound(object sender, RepeaterItemEventArgs args)
{
    if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem)
    {
        Repeater childRepeater = (Repeater)args.Item.FindControl("ChildRepeater");
        childRepeater.DataSource = ...;
        childRepeater.DataBind();
    }
}
77
Anton

Ich würde dem untergeordneten Repeater selbst ein DataBinding-Ereignis hinzufügen:

<asp:Repeater ID="parentRepeater" runat="server">
    <asp:Repeater ID="childRepeater" runat="server"
        OnDataBinding="childRepeater_DataBinding" />
</asp:Repeater>

Dann implementiere es einfach:

protected void childRepeater_DataBinding(object sender, System.EventArgs e)
{
    Repeater rep = (Repeater)(sender);

    int someIdFromParentDataSource = (int)(Eval("ParentID"));

    // Assuming you have a function call `GetSomeData` that will return
    // the data you want to bind to your child repeater.
    rep.DataSource = GetSomeData(int);
    rep.DataBind();
}

Ich ziehe es vor, die Steuerungsebene anstelle der Ebene ItemDataBound zu verwenden. Wenn Sie also Steuerelemente oder Elemente in Ihren Vorlagen entfernen müssen, müssen Sie sich nicht darum kümmern, in den übergeordneten Steuerelementen nach Code zu suchen, der sie verwendet. Es wird alles lokalisiert, ohne sich selbst zu kontrollieren. Außerdem müssen Sie niemals eine FindControl ausführen.

Wenn Sie ein Steuerelement in der Zukunft ersetzen möchten, können Sie es einfach löschen und der Code funktioniert weiterhin, da er vollständig abgeschlossen ist. Die Verwendung der Variablen ItemDataBound würde dazu führen, dass der Code kompiliert wird, aber zur Laufzeit abstürzt oder unerwartet handelt, da er von untergeordneten Steuerelementen abhängig ist.

24
Kelsey

So wird es gemacht:

DataSource='<%# ((System.Data.DataRowView)Container.DataItem)[3] %>'

Wenn Sie also die Spalte in der übergeordneten Tabelle kennen, die die untergeordnete Tabelle/Datenquelle für den verschachtelten Repeater enthält, können Sie diese direkt in die ASPX-Datei einfügen.

8
bill

Repeater1 OnItemDataBound-Ereignis und dann FindControl Repeater2. Der Code-Behind findet den verschachtelten Repeater2 nicht! Sie müssen FindControl ("Repeater2") verwenden.

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.DataItem != null)
    {
        MemberView dataRow = (MemberView)e.Item.DataItem;
        var cat = MemberPresenter.getMemberID(dataRow.memID);

        Repeater rp2 = (Repeater)e.Item.FindControl("Repeater2");
        rp2.DataSource = cat;
        rp2.DataBind();
    }  
}
2
Ravi Ram

Wenn ich das tun muss, mache ich es normalerweise mit dem ItemDataBound-Ereignis des übergeordneten Repeaters, um den untergeordneten Repeater zu binden. Wenn e Ihr EventArgs-Parameter ist, haben Sie über e.Item.FindControl () Zugriff auf den untergeordneten Repeater und über e.Item.DataItem auf die Daten.

2
joelt

Hier ein Beispiel, wie das geht: Artikel für geschachtelte Repeater-Steuerung

1
NiK
 protected void MainRepeater_ItemDataBound(object sender, RepeaterItemEventArgs args)
    {
         if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem)
            {
                Repeater childRepeater = (Repeater)args.Item.FindControl("ChildRepeater");

                DataTable innerTable= ((DataRowView)args.Item.DataItem)["InnerTableColumnName"] as DataTable;
                childRepeater.DataSource = tasksDetails;
                childRepeater.DataBind();
            }
    }
0
Lev Z