树TreeView控件与DataTable交互添加节点(最高效的方法)
方法一:
#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 的 代码
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交互添加节点(最高效的方法)相关推荐
- 使用js如何获取treeview控件的当前选中的节点
var selectedNodeID = theForm.elements["<%=treeView1.ClientID%>_SelectedNode"].value; ...
- 树型控件TreeView的几种用法
1 基本用法 void TreeViewDataBind() { //首先清除树型控件内的结点 this.TreeView1.Nodes ...
- C#——树视图TreeView控件使用
C#--TreeView控件使用 说明 TreeView Nodes属性 ImageList属性 Scrollable属性 ShowLines属性 ShowPlusMinus属性 ShowRootLi ...
- Winform编程中的treeview控件
Winform编程中的treeview控件 treeview基础操作 treeview添加.删除节点操作 treeview节点展开与折叠 treeview节点重命名 treeview获取节点集合并设置 ...
- VB Treeview控件 介绍与使用
一.概述 TreeView控件显示Node对象的分层列表,每个Node对象均由一个标签和一个可选的位图组成.TreeView 一般用于显示文档标题.索引入口.磁盘上的文件和目录.或能被有效地分层显示的 ...
- WPF TreeView 控件样式
TreeView 树视图(TreeView)控件以树的方式显示集合,可以显示层次关系. Nodes属性 该属性用于设计TreeView控件的节点. 具体方法 在TreeView的属性栏找到Nodes, ...
- android treeview 树形结构,前端开发中,使用TreeView控件创建树形结构
原标题:前端开发中,使用TreeView控件创建树形结构 Wijmo是一款使用Type编写的新一代Java/HTML5控件集.它秉承触控优先的设计理念,在全球率先支持AngularJS,并提供性能卓越 ...
- WPF 控件专题 TreeView控件详解
1.TreeView介绍 命名空间:System.Windows.Controls TreeView 表示一个控件,该控件在树结构(其中的项可以展开和折叠)中显示分层数据. TreeView 是一个 ...
- TreeView控件 1202
TreeView控件 1202 控件相关 通过Nodes添加节点 关联ListView图片盒子 节点对象的属性 节点属性 节点属性 关键代码 其它代码 获取节点的父节点文本
最新文章
- 终于!有本书把我从“拖延+不专注”的低效深坑里救出来了!
- 神经网络之 CNN 与 RNN 的关系
- java支持的数据类型有哪些_Java支持的数据类型有哪些?什么时候自动装拆箱?...
- 这个NLP工具,玩得根本停不下来
- python plot map_使用matplotlibbasemap在边界打印
- [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 将mysq数据导入hive
- Jupyter Notebook的安装和使用
- 【A】超全!深度学习在计算机视觉领域的应用一览
- 限时促销_江北恒一乐优家丨限时优惠大促销
- 微信小程序-day1
- 中缀表达式求值、后缀表达式求值、中缀转后缀、前缀
- git添加远程库遇到的问题
- matlab雷达辐射源,雷达辐射源PDW数据分析系统的制作方法
- Ubuntu Server 21.10静态IP地址设置
- 分享一个AUTO uninstaller|AUTOCAD 安装失败解决方案
- jpa 动态查询条件 数组_利用JPA+querydsl实现多条件动态查询
- matlab自动识别技术,基于Matlab的车牌自动识别技术研究与实现
- 静态文档,动态文档和活动文档
- 适合刚起步的创业项目有哪些?
- #单调队列#洛谷 2698 [USACO12MAR]花盆Flowerpot
热门文章
- php多人访问抽奖倒计时一致,Javascript和PHP倒计时器为每个人显示相同的计时器...
- 一个域名解析到另一个域名_注册域名公司|教你如何注册一个.net域名
- web api、获取DOM元素的方式、事件理解、click事件在移动端300ms延时、事件对象、事件委托、常见事件类型
- css3盒模型、过渡、转换介绍
- linux log是什么意思,大家来帮我看看这个LOG是什么意思 英文不好看不懂
- 实现页面适配_微信公众号文章页面适配深色模式
- SaltStack 第一板块入门介绍 [1]
- apache如何在虚拟主机中实现用户验证
- ElasticSearch fuzzy模糊查询(英文检索)
- 在分布式环境中解决session共享问题