44

リピーターの中にリピーターがいます。親リピーターが、Datatbleを含む列を持つ にバインドされDatatableている場所。

子リピーターを親リピーターのデータ行のデータテーブル列にバインドしたい

これは可能ですか?私は次のaspxようにファイルで直接これを行うことができると考えていました:

DataSource="<%# DataBinder.Eval(Container.DataItem, "Products")%>"しかし、うまくいかないようです。

4

7 に答える 7

82

親リピーターでメソッドを OnItemDataBound イベントにアタッチし、そのメソッドでネストされたリピーターを見つけてデータ バインドします。

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

例 (.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();
    }
}
于 2010-05-27T16:58:24.493 に答える
26

子リピーター自体に DataBinding イベントを追加します。

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

次に、それを実装します。

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

ItemDataBoundテンプレート内のコントロールまたはアイテムを削除する必要がある場合に、それを使用する親コントロールでコードを探すことを心配する必要がないように、レベルではなくコントロール レベルで行うことを好みます。それはすべて、彼がコントロールすることでローカライズされます。さらに、FindControl.

将来的にコントロールを置き換えたい場合は、それを削除するだけで、すべて自己完結型であるため、コードは引き続き機能します。を使用するItemDataBoundと、コードは引き続きコンパイルされますが、子コントロールに依存しているため、実行時にクラッシュまたは予期しない動作が発生します。

于 2010-05-27T17:03:43.323 に答える
8

方法は次のとおりです。

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

したがって、ネストされたリピーターの子テーブル/データソースを保持する親テーブルの列がわかっている場合は、これを aspx ファイルに直接配置できます。

于 2010-05-27T18:51:44.733 に答える
2

その必要がある場合は、通常、親リピーターの ItemDataBound イベントを使用して子リピーターをバインドします。e が EventArgs パラメータの場合、e.Item.FindControl() を介して子リピーターにアクセスし、e.Item.DataItem を介してデータにアクセスできます。

于 2010-05-27T16:58:43.887 に答える
2

Repeater1 OnItemDataBound イベント、次に FindControl Repeater2。コード ビハインドは、ネストされた Repeater2! を検出しません。FindControl("Repeater2") を使用する必要があります。

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();
    }  
}
于 2012-01-20T03:14:53.743 に答える
1

これを行う方法の例を次に示します: ネストされたリピーター制御の記事

于 2010-05-27T17:10:35.413 に答える
0
 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();
            }
    }
于 2016-06-05T11:29:16.577 に答える