zoukankan      html  css  js  c++  java
  • C# 树次结构的数据

    public static void CreateTree(TreeView tv)
    { ///获取层次结构的数据
    Tree tree = new Tree();
    DataSet ds = tree.GetCategorys();
    if(ds == null || ds.Tables.Count <= 0 || ds.Tables[0].Rows.Count <= 0) return;

    tv.Nodes.Clear(); ///清空树的所有节点
    ///获取根节点的所有数据
    DataRow[] rootRows = ds.Tables[0].Select("ParentID='0'");
    if(rootRows.Length <= 0) return;
    ///创建根节点,并添加到TreeView控件中
    TreeNode root = new TreeNode();
    root.Text = rootRows[0]["Name"].ToString();
    root.Value = rootRows[0]["ID"].ToString();
    root.SelectAction = TreeNodeSelectAction.Expand;
    tv.Nodes.Add(root);
    ///创建根节点的子节点
    CreateSubNode(root,ds.Tables[0]);
    }

    private static void CreateSubNode(TreeNode parentNode,DataTable dt)
    {
    if(parentNode == null || dt == null) return;
    ///获取当前节点的所有数据
    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);
    }
    }

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

    }

      private static void CreateSubNode(TreeNode parentNode,DataTable dt)
    {
    foreach(DataRow row in rows) //结束条件控制
    {
    CreateSubNode(node,dt); //函数自己调用自己,这个是递归函数
    }

    }

  • 相关阅读:
    Java代理模式
    PHP7.3.0+弃用FILTER_FLAG_SCHEME_REQUIRED的解决办法
    《PHP7底层设计与源码实现》学习笔记1——PHP7的新特性和源码结构
    《MySQL实战45讲》学习笔记2——MySQL的日志系统
    PHP反射学习总结
    依赖注入模式中,为什么用对象而不是用数组传递?
    记MySQL的一次查询经历
    数据结构与算法之PHP递归函数
    PHP的json_encode()函数与JSON对象
    Linux系统如何查看版本信息
  • 原文地址:https://www.cnblogs.com/dullbaby/p/3158041.html
Copyright © 2011-2022 走看看