TreeView多个父母

时间:2018-04-26 13:43:37

标签: c# sql winforms treeview

我目前只有一个树视图,它从一个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);
        }
    }

2 个答案:

答案 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());
}