我的问题是我想以分层结构显示数据:
但我正在检索这样的数据集:
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值,然后在该方中使用不同的办公室名称值来实现它。
是否有任何.NET功能可以轻松完成我正在尝试的内容?除了中继器之外,还有更好的方法来显示信息吗?
提前致谢!
答案 0 :(得分: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>");
}
答案 1 :(得分:1)
我不确定您是否有兴趣使用第三方控件,但我对您的要求完全相同,并且需要按层次显示数据,将重复值显示为具有可折叠节点(如树)的单个值。但是,Tree控件不受数据限制,仍然需要相当多的编码。但是,使用DataBinding可以轻松完成基于非规范化数据的这种树型构建。我使用的FlexGrid是DataBable的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}”)行生成树组,但我需要对单个列进行分组,您可以在多个列上使用组。只需在Subtotalling上参考他们的文档示例。
希望这有帮助。
答案 2 :(得分:0)
TreeView控件将为您提供所需的格式。但是,从数据库填充它需要一些努力。这里有一篇关于从数据库中填充asp.net TreeViews的文章: http://www.codeproject.com/KB/tree/TreeViewWithDatabase.aspx