我目前只有一个树视图,它从一个SQL数据库表加载数据。我已经得到它来加载结果,但我发现它为每个子对象加载了相同的父节点,并且只在下面列出了一个子对象。如何将这些组合在一起,让多个孩子有一个父母?我的代码如下。我尝试使用DISTINCT,但我不知道自己能做什么,而且当我必须拉出多个列时,无法使用它。我赞赏任何人的帮助!
例如,我的表格有:
WorkOrderName ItemNumber
45123 101
45123 102
45123 103
我的树视图目前看起来像:
+ 45123
- 101
+ 45123
- 102
+ 45123
- 103
当我需要它时:
+ 45123
- 101
- 102
- 103
这是我的代码:
private void Form1_Shown(object sender, EventArgs e)
{
treeView1.Nodes.Clear();
try
{
cn.Open();
}
catch(SqlException ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.ExitThread();
}
SqlCommand cm = new SqlCommand("SELECT * FROM ProductTracking WHERE WorkOrderName IS NOT NULL ORDER BY WorkOrderName ASC", cn);
try
{
SqlDataReader dr = cm.ExecuteReader();
while (dr.Read())
{
TreeNode node = new TreeNode(dr["WorkOrderName"].ToString());
node.Nodes.Add(dr["ItemNumber"].ToString());
treeView1.Nodes.Add(node);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
答案 0 :(得分:1)
嗯,就像一个简单的修复,您可以先将数据转储到Dictionary
:
免责声明:这只是一个快速修复;完全写好,从我的头顶。即:可以编写更高效的代码
try
{
SqlDataReader dr = cm.ExecuteReader();
//create a dict of strings which holds a list of "items"
var dict = new Dictionary<string, List<string>>();
while (dr.Read())
{
var orderName = (dr["WorkOrderName"].ToString();
//fill the dictionary
if (!dict.ContainsKey(orderName))
dict.Add(orderName, new List<string>());
dict[orderName].Add(dr["ItemNumber"].ToString());
}
//this should also be possible with a single linq statement
//now loop the dictionary and fill the tree
foreach (var key in dict.Keys)
{
//add parent
TreeNode node = new TreeNode(key);
//add childs
foreach(var item in dict[key])
{
node.Nodes.Add(item);
}
//add it to the treeview
treeView1.Nodes.Add(node);
}
}
答案 1 :(得分:0)
由于您已经拥有WorkOrderName顺序的数据,您只需要跟踪父节点:
TreeNode parentNode = null;
while (dr.Read()) {
string parentKey = dr["WorkOrderName"].ToString();
if (parentNode == null || parentNode.Name != parentKey) {
parentNode = treeView1.Nodes.Add(parentKey, parentKey);
}
parentNode.Nodes.Add(dr["ItemNumber"].ToString());
}