サードパーティのコントロールを使用することに興味があるかどうかはわかりませんが、まったく同じ要件があり、データを階層的に表示し、繰り返し値を折りたたみ可能なノード (ツリーなど) を持つ単一の値として表示する必要がありました。ただし、ツリー コントロールはデータ バインドされていないため、かなりの量のコーディングが必要です。しかし、正規化されていないデータに基づくこのスタイルのツリー構築は、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}") 行はツリー グループを生成しますが、単一の列でグループ化する必要がありましたが、複数の列でグループを使用できます。小計に関するドキュメントの例を参照してください。
お役に立てれば。