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

我计划使用嵌套中继器,但我需要一个独特的派对值,然后在该派对内使用不同的办公室名称值才能做到这一点。

是否有任何 .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 中构建字符串文字,避免了使用嵌套中继器的麻烦。

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

我不确定您是否有兴趣使用第三方控件,但我对您的要求完全相同,需要分层显示数据,将重复值显示为具有可折叠节点(如树)的单个值。但是,树控件没有数据绑定,仍然需要一些编码。但是这种基于非规范化数据的 Tree 构建风格可以通过 DataBinding 轻松完成。我使用的 FlexGrid 是 DataBound 到 DataTable,只需要几行代码即可准确显示您需要的内容,尽管它基于第三方控件。

我使用了 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}") 行生成树组,虽然我需要在单个列上进行分组,但您可以在多个列上使用组。只需参考他们关于 Subtotalling 的文档示例。

希望这可以帮助。

于 2010-05-29T03:33:25.393 回答
0

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

于 2010-05-29T02:56:12.550 回答