[原创]递归读取DataTable加载TreeList控件
如遇到特殊情况不能直接绑定DataSource属性加载树,此时我们只能通过编程方式加载了。下面分享一个类:
RecusiveCreateTreeList ,通过递归读取DataTable加载TreeList控件,只需写少量代码就能完成数据展示。

最重要是表结构定义,isid和ParentID组成父子结点关系。

RecusiveCreateTreeList类应用,用法很简单的:
//如转帖请注明出处,by www.csframework.com
private void btnRecusiveCreate_Click(object sender, EventArgs e)
{
//获取树数据
DataTable dt = DataProvider.Instance.GetTable("select * from [tb_department]", "tb_department");
//实例化一个加载器,用于创建树
RecusiveCreateTreeList creator = new RecusiveCreateTreeList(treeList1, dt,this.DataRow2NodeHandler);
//调用CreateTree方法
creator.CreateTree("isid", "ParentID", "0");
treeList1.ExpandAll();
}
实现DataRow转换为TreeListNode的方法。
private TreeListNode DataRow2NodeHandler(DataRow row, TreeList tree, TreeListNode parentNode)
{
TreeListNode node = tree.AppendNode(new object[]
{ row["DeptCode"], row["DeptName"], row["TagValue"] },parentNode);
return node;
}
DataRow转换为TreeListNode委托定义
public delegate TreeListNode DataRow2NodeHandler(DataRow row, TreeList tree, TreeListNode parentNode);
通用TreeList树加载器
public class RecusiveCreateTreeList
{
private TreeList _tree;
private DataTable _data;
private DataRow2NodeHandler _handle;
public RecusiveCreateTreeList(TreeList tree, DataTable data, DataRow2NodeHandler handle)
{
_data = data;
_tree = tree;
_handle = handle;
}
private DataRow[] GetRows(string parentFieldName, string parentValue)
{
string filter = string.Format("{0}={1}", parentFieldName, parentValue);
return _data.Select(filter);
}
private bool HasSubRows(string parentFieldName, string parentValue)
{
return this.GetRows(parentFieldName, parentValue).Length > 0;
}
/// <summary>
/// 生成一级菜单的树结构.
/// </summary>
public void CreateTree(string keyFieldName, string parentFieldName, string rootValue)
{
this._tree.Nodes.Clear();
this._tree.BeginUpdate();
//根结点记录
DataRow[] rows = this.GetRows(parentFieldName, rootValue);
DataRow[] childs;
string pValue;//parentValue;
string kValue;//key value
TreeListNode root;
foreach (DataRow row in rows)
{
pValue = row[parentFieldName].ToString();
kValue = row[keyFieldName].ToString();
root = _handle(row, _tree, null);
childs = this.GetRows(parentFieldName, kValue);
if (childs.Length > 0)
CreateChild(childs, root, keyFieldName, parentFieldName);
}
this._tree.EndUpdate();
}
/// <summary>
/// 生成子菜单的树结构
/// </summary>
private void CreateChild(DataRow[] childs, TreeListNode parentNode,
string keyFieldName, string parentFieldName)
{
string pValue;//parentValue;
string kValue;//key value
TreeListNode root;
foreach (DataRow row in childs)
{
pValue = row[parentFieldName].ToString();
kValue = row[keyFieldName].ToString();
root = _handle(row, _tree, parentNode);
childs = this.GetRows(parentFieldName, kValue);
if (childs.Length > 0)
CreateChild(childs, root, keyFieldName, parentFieldName);
}
}
}
Source code:
原创Winform布局开源框架,Winform控件框架,插件化框架|C/S框架网
DevExpress TreeList 自动加载数据源并显示漂亮图标
VS2017工具箱无法加载DevExpress15.2.x控件(添加选项卡加载DLL解决)
Winform 快速初始化Dev TreeList树控件的数据
[原创]超牛Outlook导航导控件(Outlook Navigation Panel)
【原创】C# Winform Dev自动下拉弹框筛选数据PopupContainerEdit组件
【原创】C# Dev用户自定义组件,自动下拉弹框表格过滤数据组件ucMyLookUpEdit
[原创]无线监控系统之二-------C#实现(续)
C/S快速开发框架旗舰版V5.1 | 加载报表模板文件|软件手册
NET开发框架,基于ADO.NET数据持久化快速开发框架平台-C/S框架网原创产品
使用Scheduler控件实现生产进度监控程序
创建TreeList及打开TreeListNode.Tag属性对应的窗体
[原创]Asp.Net的GridView绑定空数据显示标题
C/S快速开发框架旗舰版V5.1 | 加载报表模板文件|软件手册
WinFramework轻量级开发框架 | LayoutControl界面自适应控件|C/S开发框架
我安装了DevExpress19.2.8为什么VS2019工具箱没有Dev控件?
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
