用递归生成目录树

时间:2021-08-29 12:33:02
一定要用DataTable显示出来
提供代码如下
   public static DataTable GetCategoryTree(WebInfoBase info)
    {
          DataTable dt = info.List(_DefaultDB, "", "[ID],[Title],[ParentID],[ChildNum],[Depth],[OrderNo]", "&version=", "[ID] ASC");
      dt.Columns.Add("Path", typeof(string));
      //下面的怎么写
    
             }

显示后的结果为:

1 ⊙分类名称 0  
2 ├减速机 1  
42│ ├四大系列 9  
43│ ├行星系列 10  
44│ ├T系列 11  
49│ ├摆线系列 16  
50│ ├三合一系列 17  
51│ └其他 18  
14├搅拌设备 5  
15└起重机及配件 

23 个解决方案

#1


自己顶下 用递归生成目录树

#2


找了半天没找到
反正主要思想就是根据关系位置(父结点,子结点,叶子结点)来拼字符串绘图。
这些结点的判断就是递归判断各个结点在层次树中的地位,然后通过符号、空格,字符串,结点名称来拼,最后还要注意排序绘制问题。
比如平常叶子结点和最后一个结点的区别:
44│  T系列 11  

51│  其他 18  
偶再找找去,呵呵。

#3


怎么没有人啊? 用递归生成目录树

#4


//------------------------------------------------
        /// <summary>
        /// 初始化TREEVIEW
        /// </summary>
        /// <param name="tv"></param>
        public void InitTreeView( TreeView tv)
        {
            string strSql= "select * from table1 where ParentID is null";

            DataView dataview = GetTreeDataView(strSql);

            foreach (DataRowView AddDataView in dataview)
            {
                TreeNode node = new TreeNode();

                node.Text = AddDataView["Title"].ToString()+ "      " + AddChilDataView["ChildNum"].ToString(); 
                node.Value = AddDataView["id"].ToString();
                tv.Nodes.Add(node);

                AddChildNodes(node);
            }
        }


        public DataView GetTreeDataView(string SQLString)
        {
            DataSet ds = DbManagerSQL.Query(SQLString);
            return ds.Tables[0].DefaultView;
        }

        /// <summary>
        /// 添加子项
        /// </summary>
        /// <param name="ChildNode"></param>
        public void AddChildNodes(TreeNode ChildNode)
        {
            string ParentID = Convert.ToString(ChildNode.Value);
            DataView dataview = GetTreeDataView("select * from table1 where ParentID = '" + ParentID + "'");
            foreach (DataRowView AddChilDataView in dataview)
            {
                TreeNode Node = new TreeNode();
                Node.Text = AddChilDataView["Title"].ToString() + "      " + AddChilDataView["ChildNum"].ToString(); 
                Node.Value = AddChilDataView["id"].ToString();
                ChildNode.ChildNodes.Add(Node);

                AddChildNodes(Node);
            }
        }

        ///------------------------------------------------

看看这个吧,我前几天就是这样做的。

#5


我先看下
但是不知道你是否看清楚了
我的需求

#6


我不要TreeView
要用DataTable显示

#7


我前段时间也是须要用DataTable显示,后来没做出来,就用TreeView 
将就着用了

#8


我的数据显示之后可是要能够修改和删除的

#9


帮顶

#10


帮顶

#11


江湖救急

#12


我相信高手还是有的

#13


继续等待.........

#14


用递归生成目录树

#15


继续等待

#16


引用 15 楼 ws_hgo 的回复:
继续等待

用递归生成目录树

#17


不懂,帮顶

#18


不懂,帮顶

#19


我也有这方面需求,看看有什么好的代码吗? 

#20


原来好多人的带着星星却不会将DataTable中的数据加载到树中。。。。。汗

#21


static DataColumn column = new DataColumn();   
  static DataTable table = new DataTable();   
  
    static DataRow MyRow;   
ublic static DataTable GetCategoryTree(WebInfoBase info)   
  {   
     DataTable dt = info.List(_DefaultDB, "", "[ID],[Title],[ParentID],[ChildNum],[Depth],[OrderNo]", "&version=", "[ID] ASC");   
       
     if (table.Rows.Count > 0)   
     {   
         table.Columns.Clear();   
         table.Rows.Clear();   
     }   
     CreateDataTable();   
     GetTree(dt, "0", 0);   
     return table;   
  }   
    public static void GetTree(DataTable dt, string pid, int blank)   
    {   
        string str = " ";   
        DataView dv = new DataView(dt);   
        dv.RowFilter = "ParentID = " + pid;   
        if (blank > 0)   
        {   
            string s = "";   
            if (blank == 1)   
            {   
                str = "├";   
            }   
            for (int i = 2; i <= blank; i++)   
            {   
                s = s + "  |  "+" "+" - ";   
            }   
            str = s + "├";   
        }   
           
        foreach (DataRowView drv in dv)   
        {   
            string id = drv["ID"].ToString();   
            string Title = drv["Title"].ToString();   
            string OrderNo = drv["OrderNo"].ToString();   
            string ParentID = drv["ParentID"].ToString();   
            string Depth = drv["Depth"].ToString();   
            string ChildNum = drv["ChildNum"].ToString();   
               
            MyRow = table.NewRow();   
            MyRow["ID"] = int.Parse(id);   
            MyRow["Title"] = str + Title;   
            MyRow["OrderNo"] = int.Parse(OrderNo);   
            MyRow["ParentID"] = int.Parse(ParentID);   
            MyRow["Depth"] = int.Parse(Depth);   
            MyRow["ChildNum"] = int.Parse(ChildNum);   
            table.Rows.Add(MyRow);   
  
            int n = int.Parse(Depth);   
            //if (n <= 1)   
            //{   
                n++;   
            //}   
            GetTree(dt, id, n);   
        }   
    }   
       public static void CreateDataTable()   
    {   
        table.Columns.Clear();   
        column = new DataColumn();   
        column.DataType = System.Type.GetType("System.Int32");   
        column.ColumnName = "ID";   
        table.Columns.Add(column);   
  
        column = new DataColumn();   
        column.DataType = System.Type.GetType("System.Int32");   
        column.ColumnName = "ParentID";   
        table.Columns.Add(column);   
  
        column = new DataColumn();   
        column.DataType = Type.GetType("System.String");   
        column.ColumnName = "Title";   
        table.Columns.Add(column);   
  
        column = new DataColumn();   
        column.DataType = Type.GetType("System.Int32");   
        column.ColumnName = "ChildNum";   
        table.Columns.Add(column);   
  
        column = new DataColumn();   
        column.DataType = Type.GetType("System.Int32");   
        column.ColumnName = "Depth";   
        table.Columns.Add(column);   
  
        column = new DataColumn();   
        column.DataType = Type.GetType("System.Int32");   
        column.ColumnName = "OrderNo";   
        table.Columns.Add(column);   
        //table.Columns.Clear();   
  
    }

#22


引用 6 楼 ws_hgo 的回复:
我不要TreeView
要用DataTable显示


lz有意思,datatable和dataview有什么区别,代码改下不就可以用了么?

#23


引用 4 楼 rongfu2008 的回复:
C# code
//------------------------------------------------
        /// <summary>
        /// 初始化TREEVIEW
        /// </summary>
        /// <param name="tv"></param>
        public void InitTree……


楼上的递归算法有问题哦

#1


自己顶下 用递归生成目录树

#2


找了半天没找到
反正主要思想就是根据关系位置(父结点,子结点,叶子结点)来拼字符串绘图。
这些结点的判断就是递归判断各个结点在层次树中的地位,然后通过符号、空格,字符串,结点名称来拼,最后还要注意排序绘制问题。
比如平常叶子结点和最后一个结点的区别:
44│  T系列 11  

51│  其他 18  
偶再找找去,呵呵。

#3


怎么没有人啊? 用递归生成目录树

#4


//------------------------------------------------
        /// <summary>
        /// 初始化TREEVIEW
        /// </summary>
        /// <param name="tv"></param>
        public void InitTreeView( TreeView tv)
        {
            string strSql= "select * from table1 where ParentID is null";

            DataView dataview = GetTreeDataView(strSql);

            foreach (DataRowView AddDataView in dataview)
            {
                TreeNode node = new TreeNode();

                node.Text = AddDataView["Title"].ToString()+ "      " + AddChilDataView["ChildNum"].ToString(); 
                node.Value = AddDataView["id"].ToString();
                tv.Nodes.Add(node);

                AddChildNodes(node);
            }
        }


        public DataView GetTreeDataView(string SQLString)
        {
            DataSet ds = DbManagerSQL.Query(SQLString);
            return ds.Tables[0].DefaultView;
        }

        /// <summary>
        /// 添加子项
        /// </summary>
        /// <param name="ChildNode"></param>
        public void AddChildNodes(TreeNode ChildNode)
        {
            string ParentID = Convert.ToString(ChildNode.Value);
            DataView dataview = GetTreeDataView("select * from table1 where ParentID = '" + ParentID + "'");
            foreach (DataRowView AddChilDataView in dataview)
            {
                TreeNode Node = new TreeNode();
                Node.Text = AddChilDataView["Title"].ToString() + "      " + AddChilDataView["ChildNum"].ToString(); 
                Node.Value = AddChilDataView["id"].ToString();
                ChildNode.ChildNodes.Add(Node);

                AddChildNodes(Node);
            }
        }

        ///------------------------------------------------

看看这个吧,我前几天就是这样做的。

#5


我先看下
但是不知道你是否看清楚了
我的需求

#6


我不要TreeView
要用DataTable显示

#7


我前段时间也是须要用DataTable显示,后来没做出来,就用TreeView 
将就着用了

#8


我的数据显示之后可是要能够修改和删除的

#9


帮顶

#10


帮顶

#11


江湖救急

#12


我相信高手还是有的

#13


继续等待.........

#14


用递归生成目录树

#15


继续等待

#16


引用 15 楼 ws_hgo 的回复:
继续等待

用递归生成目录树

#17


不懂,帮顶

#18


不懂,帮顶

#19


我也有这方面需求,看看有什么好的代码吗? 

#20


原来好多人的带着星星却不会将DataTable中的数据加载到树中。。。。。汗

#21


static DataColumn column = new DataColumn();   
  static DataTable table = new DataTable();   
  
    static DataRow MyRow;   
ublic static DataTable GetCategoryTree(WebInfoBase info)   
  {   
     DataTable dt = info.List(_DefaultDB, "", "[ID],[Title],[ParentID],[ChildNum],[Depth],[OrderNo]", "&version=", "[ID] ASC");   
       
     if (table.Rows.Count > 0)   
     {   
         table.Columns.Clear();   
         table.Rows.Clear();   
     }   
     CreateDataTable();   
     GetTree(dt, "0", 0);   
     return table;   
  }   
    public static void GetTree(DataTable dt, string pid, int blank)   
    {   
        string str = " ";   
        DataView dv = new DataView(dt);   
        dv.RowFilter = "ParentID = " + pid;   
        if (blank > 0)   
        {   
            string s = "";   
            if (blank == 1)   
            {   
                str = "├";   
            }   
            for (int i = 2; i <= blank; i++)   
            {   
                s = s + "  |  "+" "+" - ";   
            }   
            str = s + "├";   
        }   
           
        foreach (DataRowView drv in dv)   
        {   
            string id = drv["ID"].ToString();   
            string Title = drv["Title"].ToString();   
            string OrderNo = drv["OrderNo"].ToString();   
            string ParentID = drv["ParentID"].ToString();   
            string Depth = drv["Depth"].ToString();   
            string ChildNum = drv["ChildNum"].ToString();   
               
            MyRow = table.NewRow();   
            MyRow["ID"] = int.Parse(id);   
            MyRow["Title"] = str + Title;   
            MyRow["OrderNo"] = int.Parse(OrderNo);   
            MyRow["ParentID"] = int.Parse(ParentID);   
            MyRow["Depth"] = int.Parse(Depth);   
            MyRow["ChildNum"] = int.Parse(ChildNum);   
            table.Rows.Add(MyRow);   
  
            int n = int.Parse(Depth);   
            //if (n <= 1)   
            //{   
                n++;   
            //}   
            GetTree(dt, id, n);   
        }   
    }   
       public static void CreateDataTable()   
    {   
        table.Columns.Clear();   
        column = new DataColumn();   
        column.DataType = System.Type.GetType("System.Int32");   
        column.ColumnName = "ID";   
        table.Columns.Add(column);   
  
        column = new DataColumn();   
        column.DataType = System.Type.GetType("System.Int32");   
        column.ColumnName = "ParentID";   
        table.Columns.Add(column);   
  
        column = new DataColumn();   
        column.DataType = Type.GetType("System.String");   
        column.ColumnName = "Title";   
        table.Columns.Add(column);   
  
        column = new DataColumn();   
        column.DataType = Type.GetType("System.Int32");   
        column.ColumnName = "ChildNum";   
        table.Columns.Add(column);   
  
        column = new DataColumn();   
        column.DataType = Type.GetType("System.Int32");   
        column.ColumnName = "Depth";   
        table.Columns.Add(column);   
  
        column = new DataColumn();   
        column.DataType = Type.GetType("System.Int32");   
        column.ColumnName = "OrderNo";   
        table.Columns.Add(column);   
        //table.Columns.Clear();   
  
    }

#22


引用 6 楼 ws_hgo 的回复:
我不要TreeView
要用DataTable显示


lz有意思,datatable和dataview有什么区别,代码改下不就可以用了么?

#23


引用 4 楼 rongfu2008 的回复:
C# code
//------------------------------------------------
        /// <summary>
        /// 初始化TREEVIEW
        /// </summary>
        /// <param name="tv"></param>
        public void InitTree……


楼上的递归算法有问题哦