回 帖 发 新 帖 刷新版面

主题:关于TreeView1排序的问题

想将TreeView1的节点和子节点按数据表中IND的大小顺序排序(添加和删除后也可排序),会的朋友请帮助一下,感激不尽。

TreeView1的节点、子节点采用连接库自动生成的,结构如下:

707院系
-----信息管理学
-------------张三
-------------李四
-------------陈五
-------------王六
-----新闻管理学
-------------李大江
-------------郭秉长
-------------陈大海
-----市场经济学
-------------黄少兰
-------------方小飞
-----工商管理学
-------------江文涛
-------------周星星

数据表结构,如下:
ID(自动编号)  IDD(自编序号)  FNAME(名称)  IND(排序用的序号)
1               001              707院系        1
1               00101            信息管理学     01
2               0010101          张三           001
3               0010102          李四           002
4               0010103          陈五           003
5               0010104          王六           004
6               00102            新闻管理学     02
7               0010201          李大江         001
8               0010202          郭秉长         002
9               0010203          陈大海         003
10              00103            市场经济学     03
11              0010301          黄少兰         001
12              0010302          方小飞         002
13              00104            工商管理学     04
14              0010401          江文涛         001
15              0010402          周星星         002

回复列表 (共2个回复)

沙发

我对TTreeView没有很深的研究,下面这个方法只是灵机一动想出来的,没有经过严格的推敲,我就不害臊地贴出来了,全当抛砖引玉吧:

思路:在建树时,把IND值同时存储在相应节点的Data里,当IND值改变时,立即改变相应节点的Data值,排序时,暂时把Data值放到节点的Text中去,用TreeView的AlphaSort方法进行排序,然后再把Text中暂存的Data值去掉。
下面只是做了一个演示(树中只有四个节点,没有子节点),如果你希望逐个父节点做排序,应该TTreeNode也有AlphaSort方法,你自己试一下。

procedure TForm1.Button1Click(Sender: TObject);//建树
var
  I : integer;
  Node : TTreeNode;
begin
  for I := 0 to 3 do begin
    Node := TreeView1.Items.Add(nil, InttoStr(I)+'节点');
    Node.Data := Pointer(I);//IND值同时存入data,这里用I值代替IND值演示
  end;
end;

procedure TForm1.MySort;
var
  I : integer;
begin
  with Self.TreeView1 do begin
    for I := 0 to Items.Count-1 do
      Items[I].Text := Format('%.4X',[Integer(Items[I].Data)]) + Items[I].Text;
    AlphaSort();//这里用的是整个TreeView的,节点应该也有AlphaSort方法
    for I := 0 to Items.Count-1 do
      Items[I].Text := Copy(Items[I].Text, 5, Length(Items[I].Text)-4);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);//测试
begin
  TreeView1.Items[0].Data := Pointer(2);//这句是假设0节点的IND值由0变为2
  TreeView1.Items[2].Data := Pointer(0);//这句是假设2节点的IND值由2变为0
  MySort;
end;

最后还是要声明:楼主自己新建一个工程测试上面的代码;这代码仅仅是一个提示,演示我的一个想法;有可能有比我这个方法专业得多的方法,因此见笑了。

板凳

我想,如果IND设计得有规律,并且唯一,例如:

父节点X的IND值    为 100
其下子节点IND分别为  101
                     102
                     ...

应该可以凑合使用上面的方法。

我来回复

您尚未登录,请登录后再回复。点此登录或注册