我有一个名为Notebook的SQL表。包含以下字段(所有字符串)的注释:
<表类>
标签
与
主题
指出
ERP项目
Doe, Mary
进度报告
09/09/2021上午9:00 -没有问题
工程师项目
Doe, Randy
进度报告
09/10/2021上午10:00 -大问题。
工程项目
Doe, Randy
问题
2021年10月9日下午1:00 -需要增加2名工程师
ERP项目
Doe, Mary
进度报告
2021年9月16日上午9:00 -没有问题
员工例会
IT员工
每月例会
2012.9.29上午11:00 - issue w/Server
表类>
您需要跟踪每个级别的节点,并以嵌套的方式添加它们。像这样:
treeView1.Nodes.Clear();
const string query = @"
SELECT *
FROM Notebook.Notes
ORDER BY Tab, Contact, Subject;
";
using (var cn = new SqlConnection(YourConnectionString))
using (var cm = new SqlCommand(query, cn))
{
cn.Open();
TreeNode tab = null;
TreeNode contact = null;
TreeNode subject = null;
using (var dr = cm.ExecuteReader())
{
while (dr.Read())
{
if(tab?.Text != (string)dr["Tab"])
{
tab = new TreeNode((string)dr["Tab"]);
treeView1.Nodes.Add(tab);
}
if(contact?.Text != (string)dr["Contact"])
{
contact = new TreeNode((string)dr["Contact"]);
tab.Nodes.Add(contact);
}
if(subject?.Text != (string)dr["Subject"])
{
subject = new TreeNode((string)dr["Subject"]);
contact.Nodes.Add(subject);
}
subject.Nodes.Add(new TreeNode((string)dr["Notes"]);
}
}
}
指出:
- 要使这段代码正常工作,您需要在SQL中有一个
ORDER BY
。如果没有,则需要另一种方法来跟踪节点,例如Dictionary
注意使用新 - 可以缩短代码稍微
SqlConnection
,不要缓存它注意using
块的使用if(tab?.Text != (string)dr["Tab"])
treeView1.Nodes.Add(tab = new TreeNode((string)dr["Tab"]));
- 然而,这种语法可能会让一些人感到困惑