详解在DevExpress程序中使用TreeList控件以及节点查询的处理

发布时间 - 2026-01-10 22:06:19    点击率:

在很多情况下,我们需要通过树列表进行数据的展示,如一些有层次关系的数据,通过有层级的展示,能够使用户更加直观查看和管理相关的数据。在一般Winform开发的情况下,可以使用微软的TreeView控件,也可以使用DevExpress的TreeList控件进行数据的展示,本篇随笔主要介绍基于DevExpress的TreeList控件使用以及使用SearchControl对节点进行查询的操作。

1、 使用微软的TreeView控件的实现效果和思路

在很多情况下,我们也倾向于使用TreeView控件作为数据的展示,相对于TreeList控件,这种控件的处理,需要自己管理树节点的层次关系,不过使用也比较简单,呈现的效果两者都差别不大。

如在我开发框架中,在字典管理模块里面,就是采用这个控件进行数据的展示的,整体效果也还不错。

在树形列表里面,我们获取数据后,统一根据层级的关系构建树节点即可,如下代码所示。

/// <summary>
/// 初始化树信息
/// </summary>
private void InitTreeView()
{
  this.treeView1.Nodes.Clear();
  this.treeView1.BeginUpdate();
  List<DictTypeNodeInfo> typeNodeList = BLLFactory<DictType>.Instance.GetTree();
  foreach (DictTypeNodeInfo info in typeNodeList)
  {
    AddTree(null, info);
  }
  this.treeView1.EndUpdate();
  this.treeView1.ExpandAll();
}
/// <summary>
/// 根据节点数据,递归构建该层级以下的树节点
/// </summary>
/// <param name="pNode">父树节点</param>
/// <param name="info">字典类型数据</param>
private void AddTree(TreeNode pNode, DictTypeNodeInfo info)
{
  TreeNode node = null;
  if (info.PID == "-1")
  {
    node = new TreeNode(info.Name, 0, 0);
    node.Tag = info.ID;
    this.treeView1.Nodes.Add(node);
  }
  else
  {
    node = new TreeNode(info.Name, 1, 1);
    node.Tag = info.ID;
    pNode.Nodes.Add(node);
  }
  foreach (DictTypeNodeInfo subInfo in info.Children)
  {
    AddTree(node, subInfo);
  }
}

还有我们在鼠标选择某个节点的时候,触发AfterSelect事件,这样我们就可以处理鼠标节点的事件了

/// <summary>
/// 单击节点事件处理
/// </summary>
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
  if (e.Node.Tag != null)
  {
    this.lblDictType.Text = e.Node.Text;
    this.lblDictType.Tag = e.Node.Tag;
    BindData();
  }
}

以上就是使用TreeView控件来处理数据的展示,从上面代码可以看到,整体的内容,主要是通过递归的关系来构建TreeNode的处理,但是使用的代码也不算复杂,因此大多数可以采用这种方式来自定义树形节点的展示。

2、使用DevExpress的TreeList控件的效果和实现代码

而使用DevExpress的TeeList控件,可以通过KeyFieldName和ParentFieldName指定他们的层级关系,使用就更加简单化,提供的数据源会自动进行层次的关系处理,非常方便。

我们先来看看通过DevExpress的TreeList控件展示的字典类型和字典数据的界面效果。

这里面的效果是如何通过代码实现的呢?

首先我们使用代码获取字典类型数据并进行树列表控件的初始化操作,如下所示。

//添加显示列
this.tree.Columns.Add(new TreeListColumn{ FieldName= "Name", Caption= "字典类型名称", Width=160, VisibleIndex =0});
//设置树控件的层次关系及属性
tree.KeyFieldName = "ID";
tree.ParentFieldName = "PID";
this.tree.OptionsBehavior.Editable = false;
this.tree.OptionsView.EnableAppearanceOddRow = true;
this.tree.OptionsView.EnableAppearanceEvenRow = true;

上面的代码我们还可以通过扩展函数对树列表的处理进行封装,已达到简化代码的目的,如下是处理后的实现代码:

//控件扩展函数封装处理
this.tree.CreateColumn("Name", "字典类型名称", 160, true);
this.tree.InitTree("ID", "PID", "-1", false, false);

通过添加TreeListColumn对象给TreeList控件就可以实现字段列的显示了,同时指定数据源里面的KeyFieldName和ParentFieldName来设定层级关系即可,非常简单。

而绑定数据源,则可以通过一个函数进行处理,如下所示。

/// <summary>
/// 绑定树的数据源
/// </summary>
private void BindTree()
{
  this.tree.DataSource = BLLFactory<DictType>.Instance.GetAll();
  this.tree.ExpandAll();
}

从上面代码我们可以看到,我们返回的数据源,不需要在实体类对象层级具有上下级的关系,如通过TreeView实现的时候,我们使用了DictTypeNodeInfo 对象是具有上下层级关系的。

这里只需要使用普通的DictTypeInfo 对象集合即可,通过KeyFieldName和ParentFieldName来设定层级关系即可。

为了指定树形节点的图标,我们可以通过代码进行自定义图标的处理,如下代码所示,这样每个层级的图标都不一样,自动实现获取设置的处理。

//设置树的图标集合及逐级图标
this.tree.SelectImageList = this.imageCollection1;
this.tree.CustomDrawNodeImages += (object sender, CustomDrawNodeImagesEventArgs e)=>
{
  int maxCount = this.imageCollection1.Images.Count;
  var index = e.Node.Level < maxCount ? e.Node.Level : 0;
  e.SelectImageIndex = index;
};

实现树节点选中的事件处理,则需要实现FocusedNodeChanged事件即可。

//初始化树节点选择事件
  this.tree.FocusedNodeChanged += delegate(object sender, FocusedNodeChangedEventArgs e)
  {
    this.FocusedNodeChanged();
  };
}
private void FocusedNodeChanged()
{
  if (this.tree.FocusedNode != null)
  {
    var PID = string.Concat(this.tree.FocusedNode.GetValue("ID"));
    treeConditionSql = string.Format("DictType_ID = '{0}'", PID);
  }
  else
  {
    treeConditionSql = "";
  }
  BindData();
}

最后初始化树列表的代码如下所示。

private void InitTree()
{
  this.tree.Columns.Clear();
  //控件扩展函数封装处理
  this.tree.CreateColumn("Name", "字典类型名称", 160, true);
  this.tree.InitTree("ID", "PID", "-1", false, false);
  //设置树的图标集合及逐级图标
  this.tree.SelectImageList = this.imageCollection1;
  this.tree.CustomDrawNodeImages += (object sender, CustomDrawNodeImagesEventArgs e)=>
  {
    int maxCount = this.imageCollection1.Images.Count;
    var index = e.Node.Level < maxCount ? e.Node.Level : 0;
    e.SelectImageIndex = index;
  };
}

3、基于SearchControl控件对节点进行查询的操作

上面的处理就是树列表的一般性展示,如果需要在树节点上面增加一个查询过滤的操作,那么可以使用SearchControl控件进行过滤处理,只需要设置SearchControl控件的Client属性,以及实现树控件的FilterNode事件即可。

/// <summary>
/// 实现树节点的过滤查询
/// </summary>
private void InitSearchControl()
{
  this.searchControl1.Client = this.tree;
  this.tree.FilterNode += (object sender, DevExpress.XtraTreeList.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;
  };
}

实现效果如下所示, 对于符合记录的查询,那么会有高亮的颜色进行重点标注。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# DevExpress  # TreeList  # 节点  # DevExpress获取TreeList可视区域节点集合的实现方法  # DevExpress设置TreeList图片节点背景色的方法  # DevExpress实现TreeList向上递归获取符合条件的父节点  # DevExpress实现TreeList向上递归获取公共父节点的方法  # DevExpress实现TreeList节点互斥的方法  # DevExpress实现TreeList父子节点CheckState状态同步的方法  # DevExpress实现TreeList按条件隐藏节点CheckBox的方法  # 所示  # 递归  # 可以使用  # 鼠标  # 微软  # 情况下  # 可以看到  # 只需要  # 绑定  # 就可以  # 他们的  # 会有  # 在我  # 都不  # 还可以  # 要在  # 我们可以  # 可以通过  # 自定义  # 不需 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用JavaScript实现文本编辑器_光标和选区怎么处理  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  如何在景安云服务器上绑定域名并配置虚拟主机?  Python文件操作最佳实践_稳定性说明【指导】  如何快速查询网站的真实建站时间?  简单实现jsp分页  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  JavaScript如何实现倒计时_时间函数如何精确控制  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Android中AutoCompleteTextView自动提示  Laravel怎么调用外部API_Laravel Http Client客户端使用  手机网站制作与建设方案,手机网站如何建设?  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  如何在宝塔面板创建新站点?  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Java类加载基本过程详细介绍  高防服务器:AI智能防御DDoS攻击与数据安全保障  网站建设整体流程解析,建站其实很容易!  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何用wdcp快速搭建高效网站?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  北京企业网站设计制作公司,北京铁路集团官方网站?  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  新三国志曹操传主线渭水交兵攻略  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  网易LOFTER官网链接 老福特网页版登录地址  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  如何为不同团队 ID 动态生成多个非值班状态按钮  LinuxShell函数封装方法_脚本复用设计思路【教程】  Python函数文档自动校验_规范解析【教程】  Laravel distinct去重查询_Laravel Eloquent去重方法  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  如何获取上海专业网站定制建站电话?  微信小程序 canvas开发实例及注意事项