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

简介: 方法一: View Code 本文转载:http://dengzebo.blog.163.com/blog/static/18867406201032141742168/#region "读取树结点从Datatable"        ///         /// 读取树结点从Data...

方法一:

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));

  

目录
相关文章
|
关系型数据库 API 数据库
盘点10个.NetCore实用的开源框架项目
盘点10个.NetCore实用的开源框架项目
2589 0
盘点10个.NetCore实用的开源框架项目
|
存储 虚拟化 Windows
ESXI8.0安装Windows11
HKEY_LOCAL_MACHINE\SYSTEM\Setup 创建一个名为“LabConfig”的项,在“LabConfig”下创建两个32位DWORD值: 键为“BypassTPMCheck”,值为“00000001” 键为“BypassSecureBootCheck”,值为“00000001” 在安装 Windows 11 进入到以下阶段即“现在安装”按 Shift+F10 进入到命令提示符,添加注册表键值绕过 TPM 检查;如果你是从微软官方下载的 ISO 镜像则在提示需要输入密钥阶段进入到命令提示符;之后就可以正常安装了。 REG ADD HKLM\SYSTEM\Setu
8943 0
ESXI8.0安装Windows11
|
域名解析 弹性计算 Linux
阿里云购买云服务器、注册域名、备案及绑定图文教程参考
本文为大家介绍了2024年购买阿里云服务器和注册域名,绑定以及备案的教程,适合需要在阿里云购买云服务器、注册域名并备案的用户参考,新手用户可通过此文您了解在从购买云服务器到完成备案的流程。
阿里云购买云服务器、注册域名、备案及绑定图文教程参考
|
7月前
|
人工智能 网络协议 Java
RuoYi AI:1人搞定AI中台!开源全栈式AI开发平台,快速集成大模型+RAG+支付等模块
RuoYi AI 是一个全栈式 AI 开发平台,支持本地 RAG 方案,集成多种大语言模型和多媒体功能,适合企业和个人开发者快速搭建个性化 AI 应用。
1712 77
RuoYi AI:1人搞定AI中台!开源全栈式AI开发平台,快速集成大模型+RAG+支付等模块
|
JavaScript 数据可视化 图形学
iCraft Editor - 助你轻松绘制出色的立体架构图
iCraft Editor是一款创新工具,专为绘制立体架构图设计,带来直观且吸引人的3D视觉体验。它简化了复杂系统的表达,支持自由旋转与缩放,让用户从多角度审视设计。简洁界面与丰富图形库让操作变得简单快捷,即使是新手也能迅速上手。iCraft Editor支持子场景嵌套及外部模型导入,适用于软件架构设计、系统部署维护等多种场景,提升沟通效率。无需编程基础,即可在线免费使用,轻松实现复杂设计的可视化。开启3D新视角,让您的创意无限延伸![官网](https://icraft.gantcloud.com)
2108 1
iCraft Editor - 助你轻松绘制出色的立体架构图
|
tengine 负载均衡 应用服务中间件
Nginx+Keepalived高可用集群部署详细文档
Nginx+Keepalived高可用集群部署详细文档
732 0
|
Ubuntu 网络安全 数据库
使用官方开源项目搭建自有Overleaf服务
【10月更文挑战第6天】本文详细介绍了在服务器上部署 Overleaf 服务的步骤,包括服务器环境准备、域名与 SSL 证书配置、获取官方项目代码、配置与构建服务,以及测试和使用服务等内容。适用于希望自建 Overleaf 服务的用户。建议服务器配置为 Ubuntu 系统,具备至少 10GB 磁盘和 2GB 内存。
820 0
|
安全 Linux Shell
SSH 命令完整实用指南 | Linux SSH 服务
【8月更文挑战第20天】
1552 0
|
Android开发
Android studio 出现Plugin [id: ‘com.android.application‘, version: ‘8.1.0‘, apply: false] 问题解决办法
Android studio 出现Plugin [id: ‘com.android.application‘, version: ‘8.1.0‘, apply: false] 问题解决办法
5675 2
|
安全
qt.qpa.xcb: could not connect to display 问题解决
【5月更文挑战第16天】qt.qpa.xcb: could not connect to display qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found. This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. 问题解决
7062 1