[原创]递归读取DataTable加载TreeList控件
[原创]递归读取DataTable加载TreeList控件
最重要是表结构定义,isid和ParentID组成父子结点关系。 RecusiveCreateTreeList类应用,用法很简单的: //如转帖请注明出处,by www.csframework.com { //获取树数据 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[] 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:
参考文档:
[原创]超牛Outlook导航导控件(Outlook Navigation Panel) 使用递归获取TreeList中所有勾选的结点 Winform 快速初始化Dev TreeList树控件的数据 DevExpress TreeList 自动加载数据源并显示漂亮图标 原创Winform布局开源框架,Winform控件框架,插件化框架|C/S框架网 【原创】C# 深度拷贝对象 使用.NET反射+递归原理实现深度克隆 【原创】C# Dev用户自定义组件,自动下拉弹框表格过滤数据组件ucMyLookUpEdit 【原创】C# Winform Dev自动下拉弹框筛选数据PopupContainerEdit组件 运行ASP.NET 自承载WebApi服务器报错:未能加载文件或程序集System.Web.Http或它的某一个依赖项 【原创】WebApi开发框架:Token生成、Token缓存原理、Token验证、令牌机制与原理 Dev异步加载动画图片等待窗体frmWaiting,WaitForm,SplashScreenManager DataTable已属于另一个DataSet C# DataSet和DataTable 原创:C/S架构快速开发框架通用可配置的数据修改日志解决方案 VS2017工具箱无法加载DevExpress15.2.x控件(添加选项卡加载DLL解决)
其它资料:
什么是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内容管理系统 | |