从查询

时间:2017-11-28 15:54:52

标签: c# visual-studio tree treeview treenode

我试图从数据库查询中填充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);

                }

            }

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

1 个答案:

答案 0 :(得分:0)

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

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