使用TreeView与数据表关联建树时,数据表中有一字段OrderId(专门用来排序)对应TreeView各节点的absoluteIndex属性。
OrderId   Name   TreeView节点的absoluteIndex
0         aaa     0
1         bbb     1        
2         ccc     2
...       ...     ...
但是当在TreeView上实现对节点(包括及下子节点)进行拖曳时,如何使改变后的节点
最新的absoluteIndex及时更新到数据表的OrderId字段值。目前我可以用对整个树视图搜索的方式更新OrderId的值,但是当表中记录数据较多时,速度很慢。希望各位能够提供更好的方法。

解决方案 »

  1.   

    你的树结构数据表是什么结构?感觉怪怪的,怎么能够实现树结构呢?我没有使用过AbsoluteIndex属性,能不能解释一下?
    我做树的时候,在数据库中使用的结构如下:ID  PARENTID  NAME(CAPTION)....
    1   -1        ---
    2   -1        ---
    3   -1        ---
    4   1         ---
    5   1         ---
    其中PARENTID=-1表示是根节点。然后4的父节点是1,5的父节点是1。这样通过ID,PARENTID就可以确定了树结构的所有的节点的关系了。你的各个节点的关系是怎么确定的?同时,如果你的树结构中如果层关系不多的话,你可以确定每一个节点的父节点,比如最大的层为10,则树结构表的关系如下:id   parentid  name(caption), r0,r1,r2,r3,r4,r5,r6,r7,r8,r9
    这样任何一个节点,你可以从数据库中得到该节点是第几层,同时各层的父节点。比如有一条记录如下:
    ID  NAME  R0  R1  R2  R3  R4  R5  R6  R7  R8  R9
    100 ---   -1  2   3   4   5   100 -2  -2  -2  -2
    这样你就知道100这条记录是第5层的子节点。其中他的第一层节点是2,第二层父节点是3,依次就可以了。
    这样在节点拖动的时候,就可以非常方便的更改数据库中结构,只要找到目的父节点的数据,然后将父节点的R0到R9的数据更新到本记录的数据上,然后在更改本节点的本层的数据就可以了,同时更改所有子节点的数据(update tTree set () where R5=100 )就可以了。你的树结构表建的非常的奇怪。因此不能给你帮助了。
      

  2.   

    我列举的数据表结构只是一部分,其中OrderId字段不参与建树,而且用来根据TreeView的节点位置进行排序的字段。
    ID      ParentID   Seq_No   OrderId(仅用于排序)
    1        0         0        1 
    2        0         1        2
    3        0         2        3
    4        1         0        4
    5        1         1        5
    中PARENTID=0 表示是根节点。然后4的父节点是1,5的父节点是1,同父节点的根据字段Seq_No的值进行排序。
      

  3.   

    喔,明白了。在进行拖动后,是否Node的数据就马上更改了?如果更改了的话,那么更改成多少?比如你的Node的原来的OrderID是20,然后更改成2,是否原来2到19的数据的顺序都进行更改?如果都更改了的话,你不就惨了?还真的将数据库中所有的记录一条一条的进行更改。尤其是你拖动的节点下面有子节点的话,你会更惨。
    因此是否可以动动OrderID的脑筋,是否OrderID数据可以不唯一,或者采用复合模式,即采用ParentID*100000+?的模式?那样可能就好一点,因为你拖动后,找到发生更改的Node的新的父节点的ID,然后本Node的OrderID就可以进行重新计算,而不影像其他的Node的OrderID属性。你说呢?
    QQ 156514982
      

  4.   

    听说过1st Class的控件吧,下一个吧,里面有一个DBTreeView,数据一挂就OK了,非常的爽。