2024年3月30日发(作者:)

声明此文为本人转载,原文请访问

/xxm/archive/2006/10/18/#1914019

最近着手写一个工程预算软件。在软件中大量的使用到了XtraTreeList这个控件,不禁感叹,

这个控件实在是太优秀了。在同类控件中暂时还没有能超越它的。而在WEB领域,暂时还没有

发现这么好用控件。但同时,它没有提供对子节点进行排序和升降级的功能,在实现这些的时候

我还花了些功夫,可能是我自己水平有限吧。对别人来讲,可能算不了什么。

TreeList控件把TreeView和DataGrid两者有机的结合了起来。为我们处理父子关系的数据提

供了有力的支持,它支持数据的绑定方式加载,不过它对于数据有一些要求,这就是你必须要指

定一个子节点的编号和父节点的编号。并将它们赋值给ParentID和FieldNameID这两个属性,

那么控件就会自动的将这么层次关系的数据以树的形式展现在你的面前。如果你给你定的层次数

据不符合以上形式呢?比如是以码长形式给出的(100100101)。那它就不能够自动的绑定数据了。

到了这一步,我们就要自己动手来实现这个数据加载的过程了。在些之前我们要熟悉两个重要的

属性才能够完成我们自定义的加载过程:

(1)、TreeListNodeChildNode=Node(Object[],........,ParentNode);这是我们用

手动的方法向控件增加子节点。Object[]对象中的值是和你在TreeList定的Columns对象对应

的。后面是一系列图标的索引。要不要加载小图标在子节点的前面我们自行选择。前提是这些小

图标已放在了一个ImageList中。这个过程的执行结果,就是一个节点被加载到了控件中。我们

取得了控件的引用。还可以对它进行一些处理。如往Tag属性里面放些小东西,来达到我们的

一些特别目的,ParentNode,是告诉控件。要把当前节点放在哪个父节点下。赋值为null的时候,

就是根节点了。

(2)TreeListNode Node=deByID(int ID),这个属性是通过一个节点在控件中的

索引来取得对它的引用。第一个加进来的节点它的索引永远是0,我们通过对ID赋值为0就取

得了对第一个节点的引用。

好了。熟悉了这两个属性。我们就要开始我们的自定义绑定过程了。如果数据在1万条以上。我

建议用DataTable来做数据源。虽然生成它的代价比较大。但生成以后我们就取得了比较我大

的性能。因为它是放在内存中的。如果一律用DataReader来读的话。你会对它很失望的。呵呵。

生成DataTable的时候,我们需要对数据进行排序。为什么。你可以试下不排序的时候,你绑

定的后果是什么,乱七八糟的。。。。。。,而且是要用到Order by len(OrderCode),其中的OrderCode

就是我们前面所说的以码长形式给出的编码。当我们用长度为基础排序后,我们会发现最短的编

码出现在了最前面。这些最短的编码通常也就是控件中的根节点,基础啊。没有它们,后面的事

怎么开始啊,对吧。。。。好了。取得了根节点的数据,我们就可以向控件中增加节点了。这时候

有人会问。我们就一条一条的往里面增加吗?那不是变成了GridView了。在这种情况下。我们

就要用一定的方法来取得当前的父节点了。没有父节点的信息,我们也不知道把当前节点往哪放

了。我的方法是在程序开始的时候初 始化一个HashTable,以编码为Key,以在控件中的ID为

Value,新增一个节点就往HashTable中添加一条记录,做人口普查啊。做好基础工作,以后的

事就好办了。如果当前的节点的编码是100100,它的父节点100肯定早就已经加载了。而且在

也登记在案了。在HashTable中一查,找到了它的ID,用FindNodeById一查不就找到了吗?

实现过程就是这样。有空把代码贴上来吧。口说无凭,呵呵。经我测试。在四万条记录下,加载

需要6秒钟左右,有些让人难以接受,我却是无法再优化了。有高手看到。给些意见吧。

写完一部分代码。都快要四点了。最近做项目,好久没有往博客上放东西了。趁着还有些精神,

赶紧把上次没有发布的代码补上。使用TreeList都有两个月了。发现自己使用它的Tag属性达

到了变态的地步,在Tag属性里放的Struct里面的东西越来越多。在某种程度上。没有这个

属性。我的好多工作是无法完成的。考虑到装箱和拆箱的过程,却也无可奈何。这是一个通过

DataTable来自动绑定TreeList的类,考虑到了部分数据显示和部分字段显示,在每个

SimpleBind的重载中都加入了这一部分的处理,强调一点。我所处理的数据都是以父子节点为

基础的绑定。同时。子节点是以1开始。父节点是以0开始。这样在存入父子节点ID的时候

要注意。代码如下,谨供自己和自己一样的菜鸟参考。

1using tions ;

2using ;

3using BusinessEntity;

4using PersistenceLayer;

5using eeList ;

6using ;

7using s ;

8namespace NskProject

9{

10 ///

11 /// 一些实现或辅助绑定TreeList的静态方法。

12 ///

13 public class BindTreeList

14 {

15 ///

16 /// 初级绑定方法,给定的表中有父子关系的字字段,默认情况下表内所有字段都被

绑定到控件内

17 ///

18 /// 数据源表

19 /// 需要绑定的控件

20 public static void SimpleMode(DataTable Dt,TreeList Ti)

21 {

22 if(ParentFieldName==null && ChildFieldName==null)

23 {

24 return;

25 }

26

27 FieldName=ParentFieldName;

28 ldName=ChildFieldName;

29 urce=Dt;

30 teColumns();

31 return;

32 }

33 ///

34 /// 初级绑定方法:在前一方法的基础上增加了将某一字段加入到Tag属性中去。

保存附加信息

35 /// 该表在赋值前以父节点为基础进行了排序

36 ///

37 /// 数据源表

38 /// 附加到Tag属性中的字段