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