世外桃源

C#、Asp.net相关技术

导航

XtraTreeList使用扎记(1)

Posted on 2006-09-23 01:29  佚名  阅读(2798)  评论(5编辑  收藏  举报
最近着手写一个工程预算软件。在软件中大量的使用到了XtraTreeList这个控件,不禁感叹,这个控件实在是太优秀了。在同类控件中暂时还没有能超越它的。而在WEB领域,暂时还没有发现这么好用控件。但同时,它没有提供对子节点进行排序和升降级的功能,在实现这些的时候我还花了些功夫,可能是我自己水平有限吧。对别人来讲,可能算不了什么。
TreeList控件把TreeView和DataGrid两者有机的结合了起来。为我们处理父子关系的数据提供了有力的支持,它支持数据的绑定方式加载,不过它对于数据有一些要求,这就是你必须要指定一个子节点的编号和父节点的编号。并将它们赋值给ParentID和FieldNameID这两个属性,那么控件就会自动的将这么层次关系的数据以树的形式展现在你的面前。如果你给你定的层次数据不符合以上形式呢?比如是以码长形式给出的(100100101)。那它就不能够自动的绑定数据了。到了这一步,我们就要自己动手来实现这个数据加载的过程了。在些之前我们要熟悉两个重要的属性才能够完成我们自定义的加载过程:
(1)、TreeListNode ChildNode=TreeList.AppendNode(Object[],........,ParentNode);这是我们用手动的方法向控件增加子节点。Object[]对象中的值是和你在TreeList定的Columns对象对应的。后面是一系列图标的索引。要不要加载小图标在子节点的前面我们自行选择。前提是这些小图标已放在了一个ImageList中。这个过程的执行结果,就是一个节点被加载到了控件中。我们取得了控件的引用。还可以对它进行一些处理。如往Tag属性里面放些小东西,来达到我们的一些特别目的,ParentNode,是告诉控件。要把当前节点放在哪个父节点下。赋值为null的时候,就是根节点了。
(2)TreeListNode Node=TreeList.FindNodeByID(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秒钟左右,有些让人难以接受,我却是无法再优化了。有高手看到。给些意见吧。