C# 树形结构列表 的问题
发布网友
发布时间:2022-05-13 21:19
我来回答
共3个回答
热心网友
时间:2022-05-19 21:14
首先Tree应该是一个自定义类,
tree.GetCategorys(); 是返回创建这颗树的所有结点,具体怎么定义,怎么来,看用户自己是怎么定义的了
// 如果没有结点, 就没必要创建树了, 直接返回
if(ds == null || ds.Tables.Count <= 0 || ds.Tables[0].Rows.Count <= 0) return;
// 这是要创建的树, 清空相当于进行初始化
tv.Nodes.Clear(); ///清空树的所有节点
///获取根节点的所有数据 (ParentID='0'的为根结点, 刚才说了,所有结点都存放在ds.Tables[0]中)
DataRow[] rootRows = ds.Tables[0].Select("ParentID='0'");
//如果没有根结点, 就没必要继续了, 返回
if(rootRows.Length <= 0) return;
//创建根节点,并添加到TreeView控件中
TreeNode root = new TreeNode(); // 这是一个结点对象,此将作为根结点
// 根结点的显示文本为第一行的Name字段
root.Text = rootRows[0]["Name"].ToString();
// 根结点的value值为第一行的ID字段
root.Value = rootRows[0]["ID"].ToString();
// 选中这个结点的动作----展开子结点
root.SelectAction = TreeNodeSelectAction.Expand;
// 将此结点加到树的第一层次中---因为直接加到树中,才决定了它是根结点
// 其它的子结点不是直接加到树中, 而是加入根结点中的(此种方法使用了组合
// 模式, 不明白的话,建议看看这种模式的说明
tv.Nodes.Add(root);
//刚才说了, 子结点是加入到根结点的, 这样才能形成树,
//这个方法是创建子结点,所以参数中要传入根结点
private static void CreateSubNode(TreeNode parentNode,DataTable dt)
{
// 根结点为空,返回
if(parentNode == null || dt == null) return;
///获取当前节点的所有数据 , 根据根结点ID查询根结点下的子结点
DataRow[] rows = dt.Select("ParentID='" + parentNode.Value + "'","ShowOrder");
// 循环所有子结点, 一个一个加入到根结点
foreach(DataRow row in rows)
{
///创建当前节点 , 下面这些跟上面的相似, 不用再说明
TreeNode node = new TreeNode();
node.Text = row["Name"].ToString();
node.Value = row["ID"].ToString();
node.Expanded = false;
//将此子结点加入根结点
parentNode.ChildNodes.Add(node);
///递规创建当前节点(node)的子节点
// 此子结点有可能也有子结点, 所以也要为它添加子结点
// 此递归的结束条件是完成所有子结点的循环
CreateSubNode(node,dt);
}
}
热心网友
时间:2022-05-19 22:32
去掉所有的附加代码看
private static void CreateSubNode(TreeNode parentNode,DataTable dt)
{
foreach(DataRow row in rows) //结束条件控制
{
CreateSubNode(node,dt); //函数自己调用自己,这个是递归函数
}
}
实际上你只要知道递归函数是什么就可以了。递归函数就是在函数内部自己迭代调用自己的函数,很类似数学里面的数列通项公式,不过要使用递归函数要小心控制结束条件,一个不小心就是无限循环调用
热心网友
时间:2022-05-20 00:07
首先Tree应该是一个自定义类,
tree.GetCategorys();
是返回创建这颗树的所有结点,具体怎么定义,怎么来,看用户自己是怎么定义的了
//
如果没有结点,
就没必要创建树了,
直接返回
if(ds
==
null
||
ds.Tables.Count
<=
0
||
ds.Tables[0].Rows.Count
<=
0)
return;
//
这是要创建的树,
清空相当于进行初始化
tv.Nodes.Clear();
///清空树的所有节点
///获取根节点的所有数据
(ParentID='0'的为根结点,
刚才说了,所有结点都存放在ds.Tables[0]中)
DataRow[]
rootRows
=
ds.Tables[0].Select("ParentID='0'");
//如果没有根结点,
就没必要继续了,
返回
if(rootRows.Length
<=
0)
return;
//创建根节点,并添加到TreeView控件中
TreeNode
root
=
new
TreeNode();
//
这是一个结点对象,此将作为根结点
//
根结点的显示文本为第一行的Name字段
root.Text
=
rootRows[0]["Name"].ToString();
//
根结点的value值为第一行的ID字段
root.Value
=
rootRows[0]["ID"].ToString();
//
选中这个结点的动作----展开子结点
root.SelectAction
=
TreeNodeSelectAction.Expand;
//
将此结点加到树的第一层次中---因为直接加到树中,才决定了它是根结点
//
其它的子结点不是直接加到树中,
而是加入根结点中的(此种方法使用了组合
//
模式,
不明白的话,建议看看这种模式的说明
tv.Nodes.Add(root);
//刚才说了,
子结点是加入到根结点的,
这样才能形成树,
//这个方法是创建子结点,所以参数中要传入根结点
private
static
void
CreateSubNode(TreeNode
parentNode,DataTable
dt)
{
//
根结点为空,返回
if(parentNode
==
null
||
dt
==
null)
return;
///获取当前节点的所有数据
,
根据根结点ID查询根结点下的子结点
DataRow[]
rows
=
dt.Select("ParentID='"
+
parentNode.Value
+
"'","ShowOrder");
//
循环所有子结点,
一个一个加入到根结点
foreach(DataRow
row
in
rows)
{
///创建当前节点
,
下面这些跟上面的相似,
不用再说明
TreeNode
node
=
new
TreeNode();
node.Text
=
row["Name"].ToString();
node.Value
=
row["ID"].ToString();
node.Expanded
=
false;
//将此子结点加入根结点
parentNode.ChildNodes.Add(node);
///递规创建当前节点(node)的子节点
//
此子结点有可能也有子结点,
所以也要为它添加子结点
//
此递归的结束条件是完成所有子结点的循环
CreateSubNode(node,dt);
}
}