DevExpress的TreeList,它的节点要怎么去绑定,节点展开的时候出现异常又要怎么排查,这是在WinForms、WPF或者Web这些项目里面,做层级数据展示的时候,挺容易碰到的问题。TreeList这个东西,它跟那种普通的表格还不太一样,那种表格一般就是一行显示一条数据就完了,但TreeList不光要显示数据,它还得能认出来数据之间的父子关系、节点本身的ID、父节点的ID、要显示哪些字段,还有节点是展开的还是收起来的这些状态。要是数据源那边的关系没有给配对好,界面上看着也许还能有数据显示出来,可是节点的层级会乱掉,点也点不开,展开了里头是空的,更严重的,还会出现那种循环嵌套的情况。
一、DevExpress TreeList节点怎么绑定
在给TreeList绑定节点以前,先要把数据长什么样子给弄清楚。常见的办法,一般有两种,一种呢,是用ID和ParentID这两个字段去表示父子关系,另一种,是直接把那种树形的对象集合给绑定上去。在企业项目里面,前一种情况会更常见一些,因为数据大部分都是从数据库的表里面来的。
1、先把父子字段给理顺
每一条数据,都要有一个它自己独有的ID,而且还要有一个能指向它父节点是谁的ParentID。所有根节点的ParentID,得统一起来,比如都设成0,或者都设成null,再或者都设成空的值,但是不能有的用这个,有的又用那个,混在一起去用。要不然,TreeList在识别根节点的时候,就容易出问题,会出现有些数据怎么也挂不上去的情况。
2、把关键的绑定字段给设好
在【TreeList】的设置里面,去把KeyFieldName和ParentFieldName这两个给配上,让控件知道哪一个字段代表的是节点自己的ID,哪一个字段又代表的是它父节点的ID。
就比如,KeyFieldName去绑定那个Id,ParentFieldName就去绑定ParentId,设完了这些,再去把DataSource给绑定上去。这里要特别留意,字段的名字得跟数据源里面的一模一样,大小写、别名,还有实体里头的属性名,全都得仔细核对清楚。
3、把显示用的列给配一下
节点的关系绑定好了以后,接着还要去配置那些用来显示的列,像名称、编码、类型、状态、数量什么的。不用把所有的字段全给显示出来,TreeList它本来就已经带着一层一层的那种结构了,要是列弄得太多,用户反而会看不清主要的信息到底是什么。一般会把节点的名称放在第一列,然后再根据业务的需要,补上那么少数几个关键的字段就行了。
二、DevExpress TreeList节点展开异常怎么排查
节点展开的时候不正常,常见的一些表现,就是节点怎么也点不开、点开了下头却没有子节点、显示的层级位置是错位的,或者是每次展开都会觉得卡。排查的时候,先不用去怀疑是不是控件本身出了问题,大多数的情况,还是数据之间的关系、字段的配置,或者是那种懒加载的逻辑出了毛病。
1、检查一下父子关系是不是完整的
要是有一个节点的ParentID,它指向了一个根本不存在的ID,那这条数据显示出来可能就会不正常。还有另外一种情况,就是父节点和子节点的字段类型不一致,比如说ID是数字,ParentID那边却是字符串,在界面上看着好像值是一样的,可是在匹配的时候,就可能会失败。先把数据导出来仔仔细细地查上一遍,这往往比反复去改控件上的那些属性,要来得更快一些。
2、检查一下是不是有循环引用的问题
要是节点A的父节点是B,结果B的父节点又给指回到A了,这么一来,就形成了一个循环的关系。碰到这种情况,TreeList在展开的时候,就可能会出现层级混乱、没办法正常渲染出来,甚至会连性能都变得不正常。这些有层级关系的数据,在存到库里面以前,最好就做一下校验,避免那种自己挂自己,或者是子节点反过来又成了父节点的情况。
3、检查一下懒加载的逻辑
要是项目里头用的是那种需要的时候才去加载的方式,也就是展开节点的时候才去查它下头的子节点,那就要看一看,展开的那个事件里面,是不是正确地根据当前节点的ID去把数据给查出来了。这类问题,经常是第一次展开的时候好好的,第二次展开的时候就开始重复地加载;又或者是节点上头的图标明明显示着是可以展开的,可真去点它,实际上又查不到子节点的数据。这就需要去查一下,HasChildren的判断是不是正确的,还有数据加载完了以后,有没有去把节点的状态给刷新一下。
三、DevExpress TreeList节点绑定怎么减少问题
TreeList的很多毛病,并不是在绑定的那一会儿才冒出来的,而是到了后面,去新增数据、删除数据、做筛选,或者是刷新数据的时候,才暴露出来的。想让节点的展示稳定下来,数据的规范,还有刷新的逻辑,这些都得提前就处理好。
1、把根节点的规则给统一了
根节点的ParentID,最好是在系统里头就统一地约定好,不要弄成有的地方用0,有的地方用null,有的地方又用空字符串。前端在绑定的时候、后端在查询的时候,还有数据库在存储的时候,都照着同一套规则去处理,这样后面再排查起来,就会轻松很多了。
2、在刷新数据以前,把展开的状态给保留下来
要是TreeList的数据需要很频繁地去刷新,那么刷新了以后,所有的节点可能就全都给收回去了。这个时候,就可以在刷新以前,先记录一下当前哪些节点是展开的,把它们的ID记下来,等数据重新绑定完了以后,再照着这些ID去把展开的状态给恢复出来。要不然,用户正盯着某一个层级在看呢,数据一刷,整个界面就又回到了一开始的样子,体验就会变得很不好。
3、把节点的总数量和层级的深度控制一下
TreeList这个东西,不太适合一次性地把没有限制的层级,还有超级多的节点,全都给展示出来。数据要真是很多的话,就可以考虑用那种按需加载的办法、搞个分页筛选,或者干脆只挑关键的几层展示出来。要不然的话,在展开节点的时候,就会觉得特别卡,而且用户也很难在那么深的树里头,找到自己要看的目标数据。
总结一下
DevExpress的TreeList,节点要怎么去绑定,展开的时候出了异常又要怎么去排查,它核心的东西,就是先得把ID、ParentID、根节点的规则,还有显示列要怎么配这些给弄清楚了,然后再去排查父子的关系、字段的类型、有没有循环引用,还有懒加载的逻辑。TreeList显示上出了毛病的时候,不要光想着去改控件上的属性,要先回到数据源那里,去把层级的结构给检查清楚。数据结构只要够稳定、绑定的字段够准确、展开的逻辑也够清楚,那TreeList节点展示出来的样子,才会是比较可靠的。
