从查询填充 TreeView

Populating a TreeView from a query

我正在尝试从数据库查询填充 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

我尝试寻找与我有类似问题的其他人。然而,这些例子很难理解,而且通常对我不起作用。要么我实施错误,要么它不适合我的情况。

我最近的尝试是在循环中创建循环以遍历 children 并尝试将它们与 parents 相关联。但它并没有显示任何东西。

// 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);

                }

            }

有人 tell/show 可以告诉我如何遍历 table 并关联 parent 和 child 节点,然后将它们添加到树视图中吗?

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

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);
    }