【问题标题】:Populating a TreeView from a query从查询中填充 TreeView
【发布时间】:2017-11-28 15:54:52
【问题描述】:

我正在尝试从数据库查询中填充 C# 树视图。

数据库的结构如下:

-----------------------------------------------
| PARENT_NODE | CHILD_NODE | LEVEL | NAME     |
-----------------------------------------------
|     1       |     2      |   1   | name1    |
-----------------------------------------------
|     1       |     4      |   1   | name2    |
-----------------------------------------------
|     2       |     6      |   1   | name4    |
-----------------------------------------------
|     2       |     3      |   2   | name3    |
-----------------------------------------------
|     3       |   null     |   3   | name5    |
-----------------------------------------------

注意数据库查询不能更改。

作为树视图的表示,它看起来像这样。

name1
  |---- name3
  |       |---- name5
name2
  |
  |
name4

我试图寻找与我有类似问题的其他人。但是,这些示例很难理解,通常对我不起作用。要么是我实施错了,要么就是不适合我的情况。

我最近的尝试是在循环中创建一个循环来遍历孩子并尝试将它们与父母相关联。但它没有显示任何东西。

// Nodes
            TreeNode rootNode = new TreeNode("root_NAME");
            TreeNode parent = new TreeNode();
            TreeNode child = new TreeNode();


            foreach (DataRow dr in dt.Rows)
            {
                if (dr["LEVEL"].ToString() == "1")
                {
                    parent = new TreeNode(dr["NAME"].ToString());
                    rootNode.Nodes.Add(parent);
                    //TreeView.traceTreeView.Nodes.Add(node);
                }
                else
                {
                    // Search for where child_node == parent_node and add that node 

                    List<TreeNode> childList = new List<TreeNode>();


                    foreach (DataRow cr in dt.Rows)
                    {
                        if (cr["PARENT_NODE"].ToString() == dr["CHILD_NODE"].ToString())
                        {
                            childList.Add(child = new TreeNode(cr["NAME"].ToString()));
                        }
                    }
                    TreeNode[] childArray = childList.ToArray();

                    TreeNode node = new TreeNode(dr["NAME"].ToString(), childArray);
                    parent.Nodes.Add(node);

                }

            }

有人能告诉/告诉我如何遍历表并关联父节点和子节点,然后将它们添加到树视图中吗?

【问题讨论】:

  • 不是答案,但我认为查找 AVL trees 可能会有所帮助。
  • NAME 指的是哪个节点?父节点还是子节点?它似乎因您的样本数据而异。 LEVEL 也没有意义,因为 name1 和 name2 具有相同的级别,但您说它们应该嵌套。
  • 我不认为 Forms Tree 是你认为的那样。根据您的表现,我实际上并不真正理解您要显示的内容。
  • @LucasTrzesniewski 每个节点都有自己的名称,包括子节点和父节点。 Name1 和 Name2 实际上是根节点的子节点,因此存在 level0。但是,查询中并未构建此级别。
  • @VinnieNovido 那么我不明白你的图表。我以为 name2 应该是 name1 的孩子,但如果你说他们都是 0 级的孩子,那为什么 name4 的绘制方式与 name2 相同?

标签: c# visual-studio tree treeview treenode


【解决方案1】:

下面我将介绍我是如何解决这个问题的。

foreach (DataRow dr in dt.Rows)
        {
            if (!UserFunctions.IsNullOrEmpty(traceWindow.traceTreeView.Nodes.Find(dr["PARENT_NODE"].ToString(), true)))
            {
                // add child to parent
                // if child_node == null -> cNode.Name(Text) = "INDATA"
                TreeNode cNode;
                // "JOB_NAME_IN" is a column name in the database
                if (!string.IsNullOrEmpty(dr["JOB_NAME_IN"].ToString()))
                {
                    cNode = new TreeNode(dr["JOB_NAME_IN"].ToString());
                }
                else
                {
                    cNode = new TreeNode(dr["INDATA"].ToString());
                }
                // .Name is the key of that node. 
                // Setting it to child node allows me to search for which node is the parent of the current datarow i'm reading.
                cNode.Name = dr["CHILD_NODE"].ToString();
                TreeNode[] pNode = traceWindow.traceTreeView.Nodes.Find(dr["PARENT_NODE"].ToString(), true);

                pNode[0].Nodes.Add(cNode);

            }
            else
            {
                // There is no child, create new parent
                // if child_node == null -> cNode.Name(Text) = "INDATA"
                TreeNode pNode;
                if (!string.IsNullOrEmpty(dr["JOB_NAME_IN"].ToString()))
                {
                    pNode = new TreeNode(dr["JOB_NAME_IN"].ToString());
                }
                else
                {
                    pNode = new TreeNode(dr["INDATA"].ToString());
                }
                pNode.Name = dr["CHILD_NODE"].ToString(); // Key
                traceWindow.traceTreeView.Nodes.Add(pNode);
            }


        }

注意,我创建了IsNullOrEmpty的扩展方法,如下所示:

public static bool IsNullOrEmpty(this Array array)
    {
        // This is an extension of an existing function
        // to make it work with arrays.

        return (array == null || array.Length == 0);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-09
    • 2017-05-25
    • 2017-06-05
    • 2010-10-22
    • 1970-01-01
    • 2010-09-26
    • 2021-10-22
    相关资源
    最近更新 更多