0

リピーターを使用してバインドしていnested collectionます。基本的に私がやっていることは、すべての要素と値を WebPage に表示することです。

私のアプローチは、ネストされたリピーターを使用し、a level belowリピーターデータソースをバインドすることでしたcurrent ItemDataBount Event(以下のコードを参照してください)

アイテムごとにコントロールを作成し、Eval.

という事実を考慮してDataSource is serializable、ネストされたコレクションをバインドするこの効率的で最も簡単な方法はありますか?

<asp:Repeater ID="rpt1" OnItemDataBound="rpt1_ItemDataBound" runat="server">   
    <ItemTemplate>

        <asp:Label ID="lblSomeProperty" Text='<%#Eval("SomeProperty") %>' runat="server" />
        <%--few other controls--%>
        <asp:Repeater ID="rpt2"OnItemDataBound="rpt2_ItemDataBound" runat="server">
            <ItemTemplate>

            <asp:Label ID="Label1" Text='<%#Eval("SomeOtherProperty") %>' runat="server" />
                <asp:Repeater ID="rpt3" runat="server">
                    <ItemTemplate>
                    <asp:Label ID="Label1" Text='<%#Eval("SomeMoreProperty") %>' runat="server" />
                    </ItemTemplate>
                </asp:Repeater>

            </ItemTemplate>
        </asp:Repeater>

    </ItemTemplate>
</asp:Repeater>

分離コード:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        rpt1.DataSource = //RootElement IEnumerable
    }
}

protected void rpt1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    //proceed only if ItemTemplate OR AlternatingItemTemplate

    //populate user control values from DataItem in current context
    var rpt2 = e.Item.FindControl("rpt2") as Repeater;
    rpt2.DataSource = //Child Level1 IEnumerable
}

protected void rpt2_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    //bind rpt3 DataSource
}

ご協力ありがとうございました。

4

2 に答える 2

0

あなたの実装は完全に実現可能であり、効率的であると思います。これは、テンプレート化された情報のコレクションを表示するために Repeater を使用して、これがデータのプライマリまたはサブコレクションであるかどうかにかかわらず、シナリオにアプローチする ".NET の方法" です。

また、物事を過度に複雑にするのではなく、将来の開発者に何が起こっているのかを簡単に把握できます。Repeater コントロールを拡張してそれを使用することに私が関与するビジネス要件がさらにない限り、それはとにかくあなたのシナリオに取り組む方法です。必要のないシナリオを過度に複雑にする必要はありません。

于 2012-10-23T13:50:12.363 に答える
0

データソースがシリアル化可能な場合は、リピーターの代わりにListViews (MSDN) を使用してデータを表示することを検討する必要があります。ListViews を使用すると、データソースを宣言的にバインドでき、コード ビハインドを記述する必要はありません。各リピーターをバインドするために使用しているすべての C# コードを効果的に削除できます。

これを行う方法の詳細な説明については、このStackOverflow の回答をご覧ください。

重要なのは、ネストされた各 ListView 内のマークアップに DataSource を設定することです

于 2012-10-23T14:16:26.690 に答える