2

私はASP.NETから始めていますが、DataTableのデータをグループで表示する「スマートな」方法があるかどうか疑問に思っていますか?
次の例を想像してみてください: SQL からデータテーブルにグループ化およびソートされたデータを取得します。

protected void Page_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("parent", typeof(string));
    dt.Columns.Add("child", typeof(string));
    dt.Rows.Add("AAA", "111");
    dt.Rows.Add("AAA", "222");
    dt.Rows.Add("AAA", "333");
    dt.Rows.Add("BBB", "444");
    dt.Rows.Add("BBB", "555");
    dt.Rows.Add("CCC", "666");
    dt.Rows.Add("CCC", "777");
    dt.Rows.Add("CCC", "888");

    repeaterParent.DataSource = dt;
    repeaterParent.DataBind();
}

そして、私は以下のようなページにそれらを表示したい:
ここに画像の説明を入力

そのためにネストされたリピーターを使用しようとしました:

<asp:Repeater ID="repeaterParent" runat="server">
    <ItemTemplate>
        <b><%# DataBinder.Eval(Container.DataItem, "parent") %></b>
        <br /> 
        <asp:repeater id="repeaterChild" runat="server">
            <itemtemplate>
                    - <%# DataBinder.Eval(Container.DataItem, "child") %> <br />
            </itemtemplate>
        </asp:repeater>
    </ItemTemplate>
</asp:Repeater>

もちろん、それは機能しません-結果は次のとおりです-グループ化も子も表示されていません:
ここに画像の説明を入力

どのようにそれを行うことができますか - コントロールはリピーターである必要はありません - リストビュー、箇条書きリスト、または類似のものである可能性があります。

「スマートな」方法があれば最高です。つまり、データテーブルをデータソースにバインドするだけで、コントロールが残りの部分 (グループ化) を作成します。可能な限り、データソース テーブルを 2 つの異なるソースに分割したり、親アイテムごとに SQL クエリを作成したり、ItemDataBound イベントで遊んだりすることは避けたいと思います。そうでない場合は、それを行う方法を教えてもらえます? .NET バージョン: 4.0

よろしく、
マルシン

--編集:
次の解決策を見つけましたが、アイテムごとにソーステーブルをフィルタリングするのにコストがかかるため、あまり好きではありません。大きなソースデータテーブルでどのように動作するかわかりません。より良い解決策があるかどうかを喜んで聞きます:

protected void repeaterParent_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    DataRowView drv = (DataRowView)e.Item.DataItem;
    string parent = drv["parent"].ToString();

    dt.DefaultView.RowFilter = string.Format("[parent]='{0}'", parent);
    DataTable dtChild =  dt.DefaultView.ToTable(true, "child");

    Repeater repeaterChild = (Repeater)e.Item.FindControl("repeaterChild");
    repeaterChild.DataSource = dtChild;
    repeaterChild.DataBind();

}
4

1 に答える 1

0

あなたは正しい方向に進んでいますが、データソースは1つしかなく、それが最初のリピーターの入力です。

2番目の(ネストされた)リピーターに2番目のデータソースを追加する必要があります。たとえば、最初のデータソースの実際の親の子を返す関数。

ASP.NETのネストされたリピーター

于 2012-11-02T14:05:32.500 に答える