我试图从数据库查询中填充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);
}
}
有人会告诉/告诉我如何遍历表并关联父节点和子节点,然后将它们添加到树视图中吗?
答案 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);
}