WinForm应用实战开发指南 - 如何完成树形列表(TreeList)的快捷绑定?
在一些字典绑定中往往为了方便展示详细数据需要把一些结构树展现在树列表TreeList控件中或者下拉列表的树形控件TreeListLookUpEdit控件中为了快速的处理数据的绑定操作比较每次使用涉及太多细节的操作我们可以把相关的数据绑定操作放在一些辅助类的扩展函数中进行处理这样可以更方便的更简洁的处理数据绑定操作本文将介绍TreeList控件和TreeListLookUpEdit控件在扩展函数中的处理操作。PS给大家推荐一个C#开发可以用到的界面组件——DevExpress WinForms它能完美构建流畅、美观且易于使用的应用程序无论是Office风格的界面还是分析处理大批量的业务数据它都能轻松胜任DevExpress新旧版本帮助文档下载欢迎进QQ qun获取169725316TreeList控件的绑定操作TreeList本身就是一个树形数据的展示控件可以展示常规的二维表也可以展示具有嵌套关系的二维表数据源可以是多种方式的支持Datable的数据源的嵌套展示。单个列信息的树形列表展示界面效果类似GridView的嵌套列表展示的TreeList界面效果这些界面都比较常见也是我们经常碰到的处理效果但是TreeList的界面设置有很多特性如果每次拷贝这些代码需要很多也不便于维护因此我们建立一些扩展函数来处理界面元素的绑定就非常必要。本文介绍基于TreeList和TreeListLookUpEdit控件的绑定即可。两个类型控件的数据源都可以是DataTable类型也可以是IList集合类型如下所示是基于SQLSugar开发框架返回的数据结构是IList类型的。所以一般树形列表的绑定操作提供一个方法来获取数据并绑定即可。/// summary /// 绑定树的数据源 /// /summary private async void BindTree() { var list await BLLFactoryIDictTypeService.Instance.GetAllAsync(); this.tree.DataSource list?.Items; this.tree.ExpandAll(); }如果使用原生代码初始化树列表那么代码如下所示。//使用原生代码处理 //添加显示列 this.tree.Columns.Add(new TreeListColumn{ FieldName Id, Caption ID});//增加一个隐藏的字段存储需要的ID this.tree.Columns.Add(new TreeListColumn{ FieldName Name, Caption 字典类型名称, Width160, VisibleIndex 0}); //设置树控件的层次关系及属性 tree.KeyFieldName Id; tree.ParentFieldName PID; this.tree.OptionsBehavior.Editable false; this.tree.OptionsView.ShowColumns false; this.tree.OptionsView.ShowCheckBoxes false; this.tree.OptionsView.EnableAppearanceOddRow true; this.tree.OptionsView.EnableAppearanceEvenRow true;而实现查询过滤的操作还需要另外处理代码我们看看大概的代码如下。/// summary /// 实现树节点的过滤查询 /// /summary private void InitSearchControl() { this.searchControl1.Client this.tree; this.tree.FilterNode (object sender, FilterNodeEventArgs e) { if (tree.DataSource null) return; string nodeText e.Node.GetDisplayText(Name);//参数填写FieldName if (string.IsNullOrWhiteSpace(nodeText)) return; bool isExist nodeText.IndexOf(searchControl1.Text, StringComparison.OrdinalIgnoreCase) 0; if (isExist) { var node e.Node.ParentNode; while (node ! null) { if (!node.Visible) { node.Visible true; node node.ParentNode; } else break; } } e.Node.Visible isExist; e.Handled true; }; }这些是比较常见的操作我们把它封装为扩展函数然后根据特性传入对应参数实现即可。最后简单的三行代码来简单处理可以达到同样的效果就可以了。//控件扩展函数封装处理 this.tree.CreateColumn(Name, 字典类型名称, 160, true); this.tree.InitTree(Id, PID, -1, false, false); this.tree.InitSearchControl(this.searchControl1, Name);我们扩展方法放在一个单独的文件中标注为静态类即可。/// summary /// TreeList控件的扩展函数 /// /summary public static class TreeList_Extension其中提供几个对TreeList 常见的封装处理方法就可以了。对于一些不常见的属性我们保留它即可如下界面代码是对TreeList绑定展示多个列的处理操作。/// summary /// 初始化TreeList控件,展现嵌套的列表。 /// /summary private void InitControl() { this.tree.Columns.Clear();//控件扩展函数封装处理 this.tree.CreateColumn(Name, 机构名称, 160, true); this.tree.CreateColumn(HandNo, 机构编码, 80, true); this.tree.CreateColumn(Category, 机构分类, 80, true); this.tree.CreateColumn(Address, 机构地址, 160, true); this.tree.CreateColumn(InnerPhone, 内线电话, 80, true); this.tree.CreateColumn(OuterPhone, 外线电话, 80, true); this.tree.CreateColumn(SortCode, 排序码, 80, true); this.tree.InitTree(Id, PID, null, true, true); this.tree.OptionsView.RowImagesShowMode RowImagesShowMode.InCell;//紧凑型图标 this.tree.ExpandAll(); // 列过滤处理 this.tree.OptionsView.ShowAutoFilterRow true;//显示过滤行 this.tree.OptionsBehavior.EnableFiltering true;//开启过滤功能 //初始化树节点选择事件 this.tree.FocusedNodeChanged delegate (object sender, FocusedNodeChangedEventArgs e) { this.FocusedNodeChanged(); }; //树节点双击处理事件 this.tree.DoubleClick (s, e) { if (this.tree.FocusedNode ! null) { string ID string.Concat(this.tree.FocusedNode.GetValue(Id)); MessageDxUtil.ShowTips(Id ID); } }; //编辑记录失去焦点后校验处理 this.tree.ValidateNode (s, e) { Console.WriteLine(this.tree.FocusedNode.GetValue(Name)); }; }实现类似GridView的嵌套列表展示的TreeList界面效果如下所示。TreeListLookUpEdit控件绑定操作在一些参考的列表中我们往往需要展示更丰富一点的列表内容如下所示。如果有嵌套列表的展示嵌套列表的处理对于下拉的树形列表虽然这个控件比TreeList更复杂一些它是下拉列表和TreeList的整合体不过我们也可以用类似的扩展函数方法来简单的实现数据的绑定展示。如对于常规的数据绑定我们大概的代码如下所示。//TreeListLookupEdit数据绑定 //this.txtProjectList3.Properties.TreeList.OptionsView.ShowCheckBoxes true; this.txtProjectList3.Properties.DataSource list; this.txtProjectList3.Properties.ValueMember Value; this.txtProjectList3.Properties.DisplayMember Text; this.txtProjectList3.Properties.TreeList.Columns.Clear(); for (int i 0; i columns.Count; i) { this.txtProjectList3.Properties.TreeList.CreateColumn(columns[i].FieldName, columns[i].Caption, columns[i].Width, true); } this.txtProjectList3.Properties.TreeList.InitTree(null, null, null, true, true); this.txtProjectList3.Properties.ImmediatePopup true; this.txtProjectList3.Properties.TextEditStyle TextEditStyles.Standard; this.txtProjectList3.Properties.PopupWidthMode DevExpress.XtraEditors.PopupWidthMode.ContentWidth; this.txtProjectList3.Properties.PopupFormSize new System.Drawing.Size(this.txtProjectList3.Width, 300); this.txtProjectList3.Properties.TreeList.IndicatorWidth 40; this.txtProjectList3.Properties.TreeList.CustomDrawNodeIndicator (s, ee) { if (ee.IsNodeIndicator) { var index ee.Node.TreeList.GetVisibleIndexByNode(ee.Node); ee.Info.DisplayText (index 1).ToString(); } };对于常规的列表绑定我们可以用简单的一个扩展函数实现如下所示。//常规类别绑定 this.txtProjectList4.BindDictItems(list, Text, Value, true, columns.ToArray());就可以实现常规的界面效果处理。对于树形列表我们需要设置属性的ID和PID以及一些显示的列属性那么也可以增加更多的参数来实现。var dictTypeColumns new ListLookUpColumnInfo() { new LookUpColumnInfo(Id, Id), new LookUpColumnInfo(Name, 字典类别名称) }; treeListLookUp.BindDictItems(result.Items, Name, Id, true, false, Id, PID, null, true, true, true, false, dictTypeColumns.ToArray());因此嵌套列表就可以正常的展示出层次关系了。因此我们把扩展方法放到静态类里面就可以了方法封装如下所示/// summary /// 绑定TreeListLookUpEdit控件的数据源(完整版 /// /summary /// param namelookup控件对象/param /// param namedataSource数据源/param /// param namedisplayMember显示字段/param /// param namevalueMember值字段/param /// param nameshowRowIndicator是否显示序号/param /// param nameshowCheckbox是否显示复选框/param /// param namekeyFieldName设置父子递归关系字段-子字段不指定则使用valueMember/param /// param nameparentFieldName设置父子递归关系字段-父字段不指定则不嵌套展示/param /// param namerootValue根节点的值/param /// param nameeditable树节点是否可以编辑/param /// param nameshowColumnHeader是否显示列头/param /// param nameoddEvenRowColor是否奇偶行不同颜色/param /// param nameallowDrop是否运行拖动列/param /// param namelookUpColumnInfos显示的列/param /// returns/returns public static object BindDictItems(this TreeListLookUpEdit lookup, object dataSource, string displayMember, string valueMember, bool showRowIndicator true, bool showCheckbox false, string keyFieldName null, string parentFieldName null, string rootValue null, bool editable true, bool showColumnHeader false, bool oddEvenRowColor true, bool allowDrop false, params LookUpColumnInfo[] lookUpColumnInfos) { lookup.Properties.DataSource dataSource; lookup.Properties.DisplayMember displayMember; lookup.Properties.ValueMember valueMember; lookup.Properties.TreeList.OptionsView.ShowCheckBoxes showCheckbox; lookup.Properties.TreeList.Columns.Clear(); for (int i 0; i lookUpColumnInfos.Length; i) { lookup.Properties.TreeList.CreateColumn(lookUpColumnInfos[i].FieldName, lookUpColumnInfos[i].Caption, lookUpColumnInfos[i].Width, true); } //初始化树的样式和特性 //keyFieldName !string.IsNullOrWhiteSpace(keyFieldName) ? keyFieldName : valueMember;//如果不指定采用valueMember lookup.Properties.TreeList.InitTree(keyFieldName, parentFieldName, rootValue, editable, showColumnHeader, oddEvenRowColor, allowDrop); lookup.Properties.PopupFormSize new System.Drawing.Size(lookup.Width, 300); lookup.Properties.ImmediatePopup true; lookup.Properties.TextEditStyle TextEditStyles.Standard; if (showRowIndicator) { lookup.Properties.TreeList.IndicatorWidth 40; //重写序号显示默认不显示数值 lookup.Properties.TreeList.CustomDrawNodeIndicator (s, ee) { if (ee.IsNodeIndicator) { var index ee.Node.TreeList.GetVisibleIndexByNode(ee.Node); ee.Info.DisplayText (index 1).ToString(); } }; } return dataSource; }通过扩展方法的方式可以简化界面的处理代码同时利于我们在项目开发的时候快速的实现相关的效果而不需要过多的中断查找相关的界面控件属性。本文转载自博客园 - 伍华聪

相关新闻

如何免费使用开源德州扑克GTO求解器:从新手到高手的完整指南

如何免费使用开源德州扑克GTO求解器:从新手到高手的完整指南

如何免费使用开源德州扑克GTO求解器:从新手到高手的完整指南 【免费下载链接】desktop-postflop [Development suspended] Advanced open-source Texas Holdem GTO solver with optimized performance 项目地址: https://gitcode.com/gh_mirrors/de/desktop-postf…

2026/7/17 12:16:23阅读更多 →
MFC扩展库BCGControlBar Pro v34.1新版亮点:日历和计划表等功能升级

MFC扩展库BCGControlBar Pro v34.1新版亮点:日历和计划表等功能升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。BCGControlBar专业版v34.1已正式发布了,这个版本包含了对Windows 10/11字体图标的支持、功能区和可视…

2026/7/17 12:16:23阅读更多 →
3分钟掌握AcFun视频下载:免费开源工具AcFunDown完整指南

3分钟掌握AcFun视频下载:免费开源工具AcFunDown完整指南

3分钟掌握AcFun视频下载:免费开源工具AcFunDown完整指南 【免费下载链接】AcFunDown 包含PC端UI界面的A站 视频下载器。支持收藏夹、UP主视频批量下载 😳仅供交流学习使用喔 项目地址: https://gitcode.com/gh_mirrors/ac/AcFunDown 你是否经常在…

2026/7/17 12:16:23阅读更多 →
CANN AscendC bfloat16精度转换函数

CANN AscendC bfloat16精度转换函数

__bfloat162bfloat16_rn 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https:/…

2026/7/17 13:21:58阅读更多 →
终极Zotero PDF中文翻译插件:三步搞定英文文献阅读难题

终极Zotero PDF中文翻译插件:三步搞定英文文献阅读难题

终极Zotero PDF中文翻译插件:三步搞定英文文献阅读难题 【免费下载链接】zotero-pdf2zh PDF2zh for Zotero | Zotero PDF中文翻译插件 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-pdf2zh 还在为阅读英文学术文献而烦恼吗?想象一下&…

2026/7/17 13:21:58阅读更多 →
CANN/asc-devkit TQueBind构造函数

CANN/asc-devkit TQueBind构造函数

TQueBind构造函数 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitco…

2026/7/17 13:21:58阅读更多 →
数字人推荐怎么选?2026商用短视频优先看合规AI标识、真人克隆和批量出片

数字人推荐怎么选?2026商用短视频优先看合规AI标识、真人克隆和批量出片

数字人推荐怎么选?2026商用短视频优先看合规AI标识、真人克隆和批量出片 如果今天有人问“数字人推荐哪个平台”,我不会先让他看哪个平台名气最大,而是先问三个问题:你是做短视频口播、直播带货,还是跨境多语种内容&am…

2026/7/17 13:21:58阅读更多 →
CPM4OSSP-SERVER与CI/CD集成:实现自动化软件包生命周期管理

CPM4OSSP-SERVER与CI/CD集成:实现自动化软件包生命周期管理

CPM4OSSP-SERVER与CI/CD集成:实现自动化软件包生命周期管理 【免费下载链接】CPM4OSSP-SERVER The server of centralized management platform for operating system software package 项目地址: https://gitcode.com/openeuler/CPM4OSSP-SERVER 前往项目官…

2026/7/17 13:21:58阅读更多 →
自定义幻兽帕鲁游戏数据:高效存档修改的完整技术方案

自定义幻兽帕鲁游戏数据:高效存档修改的完整技术方案

自定义幻兽帕鲁游戏数据:高效存档修改的完整技术方案 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 在幻兽帕鲁的游戏体验中&#xf…

2026/7/17 13:16:57阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/17 10:42:55阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/17 8:31:03阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/17 13:22:23阅读更多 →
VS Code 高效配置与个性化定制全攻略

VS Code 高效配置与个性化定制全攻略

1. VS Code 高效配置基础作为一款轻量级但功能强大的代码编辑器,VS Code 的默认配置已经能满足基本需求,但通过合理调整设置可以大幅提升编码效率。我使用 VS Code 已经有五年多时间,期间尝试过各种配置方案,总结出这套适合大多数…

2026/7/17 0:00:01阅读更多 →
从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

在异常检测领域,很多优秀算法最初都是以研究代码的形式发布的。它们能够在固定测试集上复现实验结果,却不一定能被普通用户直接拿来测试自己的图片。尤其是最近很多算法仅提供在固定测试集的测试环境,而gradio的demo演示也不会提供。 对工程应用和在自己的图片上进行测试来…

2026/7/17 0:00:01阅读更多 →
WinRAR高效配置指南:从基础安装到高级压缩实战

WinRAR高效配置指南:从基础安装到高级压缩实战

前几天帮同事处理一个客户发来的压缩包,解压时系统自带的工具弹出一串乱码,换用 WinRAR 却顺利打开了。这种看似简单的场景,恰恰暴露了不同压缩工具在处理非标准编码、分卷压缩或加密文件时的差异。WinRAR 作为一款老牌工具,真正价…

2026/7/17 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/16 20:13:14阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/16 8:58:42阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/16 17:10:26阅读更多 →