【问题标题】:TreeView Multiple ParentsTreeView 多个父级
【发布时间】:2018-04-26 13:43:36
【问题描述】:

我目前有一个从单个 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);
        }
    }

【问题讨论】:

  • 嗯,您正在为每个数据库结果创建一个父节点。所以...您应该检查父节点是否已经存在,如果存在则检查父节点,如果不存在则不存在。
  • 不幸的是,我不确定如何在我的代码中实现这一点。在此之前我没有使用过树视图。

标签: c# sql winforms treeview


【解决方案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);
    }
}

【讨论】:

    【解决方案2】:

    由于你已经有了 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());
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      相关资源
      最近更新 更多