• 树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

     

    方法二:

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

    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("商品类别"));

    效果

    [知识分享] 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));
    

      

  • 相关阅读:
    流行的开源分布式文件系统比较
    Linux iostat监测IO状态
    M0n0wall软件防火墙教程
    networkscripts/ifcfg配置详解
    LVM 逻辑卷管理器
    Discuz 6.0数据库结构 四(详)
    Discuz 6.0数据库结构 二(详)
    手动配置linux(centos)的IP地址
    Discuz 6.0数据库结构 五(详)
    lnk快捷方式无法打开解决方法
  • 原文地址:https://www.cnblogs.com/51net/p/2450055.html
Copyright © 2020-2023  润新知