如何在分层结构中显示非规范化数据?

我的问题是我想在层次结构中显示数据,如下所示:

  • 民主党人
    • 县委书记
      • 候选人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值,然后在该方中使用不同的办公室名称值来执行此操作。

是否有任何.NETfunction可以轻松完成我正在尝试的内容? 除了中继器之外,还有更好的方式来显示信息吗?

提前致谢!

如果你可以修改存储过程,我会推荐一个邻接列表forms的结果集:

 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("
    "); foreach (DataRow child in roots) { WriteNode(child, sb); } sb.Append("
"); // recursively write out each node public static void WriteNode(DataRow row, StringBuilder sb) { sb.Append("
  • "); sb.Append(row["Name"]); // find children rows... DataRow[] children = row.Table.Select("parentId = " + row["id"].ToString()); if (children.Length > 0) { sb.Append("
      "); foreach (DataRow child in children) { WriteNode(child, sb); } sb.Append("
    "); } sb.Append("
  • "); }

    我不确定您是否有兴趣使用第三方控件,但我对您的要求完全相同,并且需要按层次显示数据,将重复值显示为具有可折叠节点(如树)的单个值。 但是,Tree控件不受数据限制,仍然需要相当多的编码。 但是,基于非标准化数据的这种树型构建可以通过DataBinding轻松完成。 我使用的FlexGrid是DataBound的DataBound,只需几行代码即可完全显示您需要的内容,尽管是基于第三方控件。

    我使用了ComponentOne FlexGrid控件并使用其“SubTotal”function生成分层数据。 我正在粘贴下面的代码,以防您有兴趣使用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}”)行生成树组,但我需要对单个列进行分组,您可以在多个列上使用组。 只需在Subtotalling上参考他们的文档示例。

    希望这可以帮助。

    TreeView控件将为您提供所需的格式。 但是,从数据库填充它需要一些努力。 这里有一篇关于从数据库中填充asp.net TreeViews的文章: http : //www.codeproject.com/KB/tree/TreeViewWithDatabase.aspx