1

私の問題は、次のように階層構造でデータを表示したいということです:

  • 民主党
    • 郡書記官
      • 候補者1
      • 候補 2
    • 治安判事
      • 候補者1
      • 候補 2
      • 候補 3

しかし、私は次のようにデータセットを取得しています:

Party | Office | Candidate
--------------------------------------------
Democrat | County Clerk | Candidate 1
Democrat | County Clerk | Candidate 2
Democrat | Magistrate | Candidate 1
Democrat | Magistrate | Candidate 2
Democrat | Magistrate | Candidate 3

ネストされたリピーターを使用することを計画しましたが、それを行うには、Party の個別の値と、そのパーティー内の Office Name の個別の値が必要です。

私がしようとしていることを簡単に行うための .NET 関数はありますか? リピーター以外の情報を表示するより良い方法はありますか?

前もって感謝します!

4

3 に答える 3

2

ストアド プロシージャを変更できる場合は、隣接リストの形式の結果セットをお勧めします。

ID    Name          ParentID
1     Democrat      NULL
2     County Clerk  1
3     Magistrate    1
4     Candidate 1   2
5     Candidate 2   2
6     Candidate 1   3
7     Candidate 2   3
8     Candidate 3   3

これにより、取得するデータの量が減り、親子関係に対して再帰的にプログラミングできるようになります。ルートから開始するだけです。このアプローチでは、StringBuilder で文字列リテラルを直接構築することで、ネストされた Repeater を使用する手間を省きます。

StringBuilder sb = new StringBuilder();
DataTable dt = new DataTable();
someDataAdapter.Fill(dt);

// find the roots:
DataRow[] roots = dt.Select("parentId is null");

sb.Append("<ul>");
foreach (DataRow child in roots)
{
    WriteNode(child, sb);
}
sb.Append("</ul>");


// recursively write out each node
public static void WriteNode(DataRow row, StringBuilder sb) {
    sb.Append("<li>"); 
    sb.Append(row["Name"]);

    // find children rows...
    DataRow[] children = row.Table.Select("parentId = " + row["id"].ToString());
        if (children.Length > 0)
        {
            sb.Append("<ul>");
            foreach (DataRow child in children)
            {
                WriteNode(child, sb);
            }
            sb.Append("</ul>");
        }

        sb.Append("</li>");
    }
于 2010-05-29T03:53:11.757 に答える
1

サードパーティのコントロールを使用することに興味があるかどうかはわかりませんが、まったく同じ要件があり、データを階層的に表示し、繰り返し値を折りたたみ可能なノード (ツリーなど) を持つ単一の値として表示する必要がありました。ただし、ツリー コントロールはデータ バインドされていないため、かなりの量のコーディングが必要です。しかし、正規化されていないデータに基づくこのスタイルのツリー構築は、DataBinding を使用して簡単に行うことができます。私が使用した FlexGrid は DataTable への DataBound であり、サード パーティ コントロールに基づいているにもかかわらず、必要なものを正確に表示するために数行のコードが必要でした。

ComponentOne FlexGrid コントロールを使用し、その「SubTotal」機能を使用して階層データを生成しました。ComponentOne FlexGrid の使用に関心がある場合に備えて、以下にコードを貼り付けます。デモコピーをダウンロードして確認できます。

        // Showing master policy in GROUPS
        // -----------------------------------------------------------------------------------
        // set tree mode to show settings in GROUPS
        flxAvailableSettings.Tree.Style = TreeStyleFlags.Simple;
        // show outline tree on column 1.
        flxAvailableSettings.Tree.Column = 0;
        flxAvailableSettings.Cols[0].Visible = true;
        flxAvailableSettings.Cols[0].Width = 15;
        flxAvailableSettings.AllowMerging = AllowMergingEnum.Nodes;
        // subtotal on column 1, outline level 0
        flxAvailableSettings.Subtotal(AggregateEnum.None, 0, 0, 0, "{0}");
        // use owner draw to suppress repeating group names in Non-Node rows
        flxAvailableSettings.DrawMode = DrawModeEnum.OwnerDraw;
        flxAvailableSettings.OwnerDrawCell += new C1.Win.C1FlexGrid.OwnerDrawCellEventHandler(flxAvailableSettings_OwnerDrawCell);
        // done, autosize columns to finish
        flxAvailableSettings.AutoSizeCols();
        // -----------------------------------------------------------------------------------

    private void flxAvailableSettings_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e)
    {
        if (!flxAvailableSettings.Rows[e.Row].IsNode && flxAvailableSettings.Cols[e.Col].Name == "PolicyGroup")
            e.Text = "";
    }

flxAvailableSettings.Subtotal(AggregateEnum.None, 0, 0, 0, "{0}") 行はツリー グループを生成しますが、単一の列でグループ化する必要がありましたが、複数の列でグループを使用できます。小計に関するドキュメントの例を参照してください。

お役に立てれば。

于 2010-05-29T03:33:25.393 に答える
0

TreeViewコントロールは、必要な形式を提供します。ただし、データベースからデータを取り込むには、ある程度の労力が必要です。データベースからのasp.netTreeViewの入力に関する記事がここにあります:http: //www.codeproject.com/KB/tree/TreeViewWithDatabase.aspx

于 2010-05-29T02:56:12.550 に答える