树TreeView控件与DataTable交互添加节点(最高效的方法)

方法一:

View Code
本文转载:http: // dengzebo.blog.163.com/blog/static/18867406201032141742168/


#region "读取树结点从Datatable"

         ///   <summary>

        
///  读取树结点从Datatable"

        
///   </summary>

        
///   <param name="TreeView1"> 在填充的TreeView控件 </param>

        
///   <param name="DT"> 数据源DataTable </param>

        
///   <param name="IsAppendNode"> 是在现有TreeView控件上添加结点,还是清空再添加 </param>

        
///   <param name="ParentNumberColumnIndex"> 在DataTable中,代表父节点编号的列索引 </param>

        
///   <param name="NumberColumnIndex"> 在DataTable中,代表当前节点编号的列索引 </param>

        
///   <param name="NameColumnIndex"> 在DataTable中,代表当前节点名称的列索引 </param>

        
///   <returns> True/False </returns>

         public  bool ReadNodesFromDataTable(TreeView TreeView1, DataTable DT,  bool IsAppendNode,  int ParentNumberColumnIndex,  int NumberColumnIndex,  int NameColumnIndex)

        {

             try

            {

                 if (IsAppendNode ==  false)

                {

                    TreeView1.Nodes.Clear();

                }

                 if (DT !=  null && DT.Rows.Count >  0)

                {

                    DataRow[] DR =  null;

                    DR = DT.Select(DT.Columns[ParentNumberColumnIndex].ColumnName +  " ='' or  " + DT.Columns[ParentNumberColumnIndex].ColumnName +  " ='0' or  " + DT.Columns[ParentNumberColumnIndex].ColumnName +  "  is null "); // 先将顶级的查出来
                     for ( int I =  0; I <= DR.Length -  1; I++) // 先将顶级的加入到TreeView中
                    {

                        TreeNode TNode =  new TreeNode(DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString());

                        TNode.Tag = DR[I][DT.Columns[NumberColumnIndex].ColumnName].ToString();

                        TNode.Name = DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString();

                        TreeView1.Nodes.Add(TNode);

                    }

                     for ( int I =  0; I <= TreeView1.Nodes.Count -  1; I++) // 再递归遍历结点
                    {

                        ForTreeNodeFormDT(TreeView1.Nodes[I], DT, ParentNumberColumnIndex, NumberColumnIndex, NameColumnIndex);

                    }

                }

                 return  false;

            }

             catch

            {

                 return  true;

            }

        }

 

         ///   <summary>

        
///  从DT中递归遍历出结点
        
///   </summary>

        
///   <param name="TempNode"> 传入的顶级结点 </param>

        
///   <param name="DT"> 保存TreeView结构的DataTable </param>

        
///   <param name="ParentNumberColumnIndex"> 在DataTable中,代表父节点编号的列索引 </param>

        
///   <param name="NumberColumnIndex"> 在DataTable中,代表当前节点编号的列索引 </param>

        
///   <param name="NameColumnIndex"> 在DataTable中,代表当前节点名称的列索引 </param>

         private  void ForTreeNodeFormDT(TreeNode TempNode, DataTable DT,  int ParentNumberColumnIndex,  int NumberColumnIndex,  int NameColumnIndex)

        {

             string TTag =  null;

            TTag = TempNode.Tag.ToString();

            DataRow[] DR =  null;

            DR = DT.Select(DT.Columns[ParentNumberColumnIndex].ColumnName +  " =' " + TTag +  " ' ");

 

             for ( int I =  0; I <= DR.Length -  1; I++)

            {

                TreeNode TNode =  new TreeNode(DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString());

                TNode.Tag = DR[I][DT.Columns[NumberColumnIndex].ColumnName].ToString();

                TNode.Name = DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString();

                TempNode.Nodes.Add(TNode);

            }

 

             foreach (TreeNode aNode  in TempNode.Nodes)

            {

                ForTreeNodeFormDT(aNode, DT, ParentNumberColumnIndex, NumberColumnIndex, NameColumnIndex);

            }

        }

         #endregion

 

 

方法二:

 

做分类 经常会用到无限级别的分类  先介绍一下数据库的表结构

树TreeView控件与DataTable交互添加节点(最高效的方法)

tid  类别编号

tname 类别名称

pid 父类编号

测试数据就不写了,大家可以自己插入一下试试

查询制定类别的 所有的子类   sql 的 代码

with as 递归查询
复制代码
alter proc  proc_chaxun

(@tid int )

as

begin  



    

    with tt  as 

    (

        

        select tid,tname,pid from dbo.t_goodsType where tid=@tid

        union all

        select t.tid,t.tname,t.pid from dbo.t_goodsType  t inner join tt

        on t.pid=tt.tid

    )

    select * from tt

end 
复制代码

查询之后获取记录集   绑定到前台的 TreeView 上面

递归进行添加
复制代码
 /// <summary>

            /// 给Tree 绑定数据 递归添加子节点

            /// </summary>

            /// <param name="dv">数据视图</param>

            /// <param name="tnOld">添加数据的节点</param>

            public void TreeDataBind(DataView dv,TreeNode tnOld)

            {

                TreeNode tnNew;    //创建一个新的节点

                foreach (DataRowView drv in dv)

                {

                    //为新的借点设置属性 

                    tnNew = tnOld.Nodes.Add(drv["tname"].ToString());

                    tnNew.Tag = drv["tid"];

                    //过滤数据视图 父类id = 上一级的tid

                    dv.RowFilter = "pid=" + drv["tid"].ToString();

                    //自己调用自己 

                    TreeDataBind(dv, tnNew);

                }

            }

          
复制代码

调用的方法很简单

调用
DataTable dtRet = (DataTable)dh.ExecProcRetObj(ep);

DataView dv = new DataView(dtRet);

 dv.RowFilter = "pid=0";

TreeDataBind(dv, this.treeView1.Nodes.Add("商品类别"));

效果

树TreeView控件与DataTable交互添加节点(最高效的方法)

 

[知识分享] LINQ TO SQL 实现无限递归查询

本文转载:http://blog.csdn.net/q107770540/article/details/7708418

List<DetptInfo> lstDept = new List<DetptInfo> 

{

new DetptInfo {ID=1,DeptName="公司",ParentID=0},

new DetptInfo {ID=10,DeptName="软件中心",ParentID=1},

new DetptInfo {ID=11,DeptName="综合办公室",ParentID=1},

new DetptInfo {ID=100,DeptName="人力资源部",ParentID=11},

new DetptInfo {ID=101,DeptName="行政部",ParentID=11},

};







public static List<DetptInfo> GetSonID(List<DetptInfo> lstDept, int p_id)

{

var query = from c in lstDept

where c.ParentID == p_id

select c;



return query.Concat(query.SelectMany(t => GetSonID(lstDept, t.ID))).ToList();

}







--调用:



var query = GetSonID(lstDept, 0);

Console.WriteLine("Id\tName\tParent");



query.ToList().ForEach(q => Console.WriteLine("{0}\t{1}\t{2}", q.ID, q.DeptName, q.ParentID));

  

你可能感兴趣的:(Datatable)