42 votes

Répéteur en répéteur

J'ai un répéteur à l'intérieur d'un répéteur. Où le répéteur parent est lié à un Datatble qui a une colonne contenant un Datatable .

Je voudrais lier le répéteur enfant à la colonne datatable du datarow du répéteur parent

Est-ce possible? Je pensais pouvoir le faire directement dans le fichier aspx comme:

DataSource="<%# DataBinder.Eval(Container.DataItem, "Products")%>" mais cela ne semble pas fonctionner.

77voto

Anton Points 3129

Dans le répéteur parent, attachez une méthode à l'événement OnItemDataBound et, dans la méthode, recherchez le répéteur imbriqué et associez-le à des données.

Exemple (.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>
 

Exemple (.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();
    }
}
 

24voto

Kelsey Points 26456

Je voudrais ajouter une liaison de données de l'événement à l'enfant de la répétition elle-même:

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

Puis il suffit de le mettre en œuvre:

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();
}

Je préfère le faire au niveau de contrôle au lieu de l' ItemDataBound de niveau de sorte que, si jamais vous avez à supprimer les contrôles ou les éléments à l'intérieur de vos modèles, vous n'avez pas à vous soucier de la recherche de code dans les contrôles parent qui l'utilisent. Elle est de toutes les localiser witht le contrôle de lui-même. Plus jamais vous n'aurez à faire un FindControl.

Si vous souhaitez remplacer un contrôle dans le futur, vous pouvez simplement le supprimer et de votre code fonctionne toujours car c'est tous les contenus eux-mêmes. À l'aide de l' ItemDataBound serait la cause de votre code pour toujours compiler mais crash ou d'agir de façon inattendue lors de l'exécution en raison de sa dépendance sur les contrôles enfants.

8voto

bill Points 295

Voici comment c'est fait:

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

Ainsi, si vous connaissez la colonne de la table parente qui contient la table / source de données enfant pour le répéteur imbriqué, vous pouvez l'insérer directement dans le fichier aspx.

2voto

joelt Points 1917

Si j'ai besoin de le faire, je le fais généralement en utilisant l'événement ItemDataBound du répéteur parent pour lier le répéteur enfant. Si e est votre paramètre EventArgs, vous aurez accès au répéteur enfant via e.Item.FindControl () et aux données via e.Item.DataItem.

1voto

NiK Points 1130

Voici un exemple de procédure à suivre: Article pour le contrôle de répéteur imbriqué

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X