方法一:

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=@tidunion allselect t.tid,t.tname,t.pid from dbo.t_goodsType  t inner join tton 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 = 上一级的tiddv.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));

  

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

  1. 使用js如何获取treeview控件的当前选中的节点

    var selectedNodeID = theForm.elements["<%=treeView1.ClientID%>_SelectedNode"].value; ...

  2. 树型控件TreeView的几种用法

    1 基本用法 void TreeViewDataBind()         {             //首先清除树型控件内的结点             this.TreeView1.Nodes ...

  3. C#——树视图TreeView控件使用

    C#--TreeView控件使用 说明 TreeView Nodes属性 ImageList属性 Scrollable属性 ShowLines属性 ShowPlusMinus属性 ShowRootLi ...

  4. Winform编程中的treeview控件

    Winform编程中的treeview控件 treeview基础操作 treeview添加.删除节点操作 treeview节点展开与折叠 treeview节点重命名 treeview获取节点集合并设置 ...

  5. VB Treeview控件 介绍与使用

    一.概述 TreeView控件显示Node对象的分层列表,每个Node对象均由一个标签和一个可选的位图组成.TreeView 一般用于显示文档标题.索引入口.磁盘上的文件和目录.或能被有效地分层显示的 ...

  6. WPF TreeView 控件样式

    TreeView 树视图(TreeView)控件以树的方式显示集合,可以显示层次关系. Nodes属性 该属性用于设计TreeView控件的节点. 具体方法 在TreeView的属性栏找到Nodes, ...

  7. android treeview 树形结构,前端开发中,使用TreeView控件创建树形结构

    原标题:前端开发中,使用TreeView控件创建树形结构 Wijmo是一款使用Type编写的新一代Java/HTML5控件集.它秉承触控优先的设计理念,在全球率先支持AngularJS,并提供性能卓越 ...

  8. WPF 控件专题 TreeView控件详解

    1.TreeView介绍 命名空间:System.Windows.Controls TreeView 表示一个控件,该控件在树结构(其中的项可以展开和折叠)中显示分层数据. TreeView 是一个 ...

  9. TreeView控件 1202

    TreeView控件 1202 控件相关 通过Nodes添加节点 关联ListView图片盒子 节点对象的属性 节点属性 节点属性 关键代码 其它代码 获取节点的父节点文本

最新文章

  1. 终于!有本书把我从“拖延+不专注”的低效深坑里救出来了!
  2. 神经网络之 CNN 与 RNN 的关系
  3. java支持的数据类型有哪些_Java支持的数据类型有哪些?什么时候自动装拆箱?...
  4. 这个NLP工具,玩得根本停不下来
  5. python plot map_使用matplotlibbasemap在边界打印
  6. [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 将mysq数据导入hive
  7. Jupyter Notebook的安装和使用
  8. 【A】超全!深度学习在计算机视觉领域的应用一览
  9. 限时促销_江北恒一乐优家丨限时优惠大促销
  10. 微信小程序-day1
  11. 中缀表达式求值、后缀表达式求值、中缀转后缀、前缀
  12. git添加远程库遇到的问题
  13. matlab雷达辐射源,雷达辐射源PDW数据分析系统的制作方法
  14. Ubuntu Server 21.10静态IP地址设置
  15. 分享一个AUTO uninstaller|AUTOCAD 安装失败解决方案
  16. jpa 动态查询条件 数组_利用JPA+querydsl实现多条件动态查询
  17. matlab自动识别技术,基于Matlab的车牌自动识别技术研究与实现
  18. 静态文档,动态文档和活动文档
  19. 适合刚起步的创业项目有哪些?
  20. #单调队列#洛谷 2698 [USACO12MAR]花盆Flowerpot

热门文章

  1. php多人访问抽奖倒计时一致,Javascript和PHP倒计时器为每个人显示相同的计时器...
  2. 一个域名解析到另一个域名_注册域名公司|教你如何注册一个.net域名
  3. web api、获取DOM元素的方式、事件理解、click事件在移动端300ms延时、事件对象、事件委托、常见事件类型
  4. css3盒模型、过渡、转换介绍
  5. linux log是什么意思,大家来帮我看看这个LOG是什么意思 英文不好看不懂
  6. 实现页面适配_微信公众号文章页面适配深色模式
  7. SaltStack 第一板块入门介绍 [1]
  8. apache如何在虚拟主机中实现用户验证
  9. ElasticSearch fuzzy模糊查询(英文检索)
  10. 在分布式环境中解决session共享问题