+ -
当前位置:首页 → 问答吧 → treeview显示大量数据问题

treeview显示大量数据问题

时间:2011-09-14

来源:互联网

我用treeview 显示4万条数据,不能一下子全部加载,那样会非常慢,想当用户单击某个节点时,加载该节点的下级子节点。
现在的问题是当我加载完第一层节点,treeview显示时,前面默认是-号,不是+号,很容易给用户误导没有子节点,如何让它有没有节点都显示+号,当用户点击时我再判断是否展开,不知我说清楚没有,举例:

root
-node1
-node2
-node3
....

要实现默认显示+号,也就是所有的节点默认显示有子节点
root
+node1
+node2
+node3
...

作者: richardi   发布时间: 2011-09-14

变通一下,你每个节点只增加一个子节点就可以了,用户点击时再增加所有的。

作者: babydog01   发布时间: 2011-09-14

设置haschildren := true

作者: bdmh   发布时间: 2011-09-14

Delphi(Pascal) code
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  vNode: TTreeNode;
begin
  vNode :=  treeview1.Items.Add(nil, 'xxxx');
  vNode.HasChildren := True;
end;

作者: SmallHand   发布时间: 2011-09-14

不怎么好,VC编的有数据才显示“+”,没有显示“-”

作者: jet_piolet   发布时间: 2011-09-15

每增加一个子节点的时候。设置这个子节点的属性 haschildren := true

作者: yangjing41   发布时间: 2011-09-15

引用 3 楼 smallhand 的回复:

Delphi(Pascal) code
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
vNode: TTreeNode;
begin
vNode := treeview1.Items.Add(nil, 'xxxx');
vNode.HasChildren := True;
end;

此方法是可以实现,但它的缺点是如果没有子节点,那个+号是点不开的,需要另加代码处理

作者: zhnglicho   发布时间: 2011-09-15

按照这个步骤添加节点,400万也不慢,不到1秒,前提是不包括读取数据库的时间
tv1.Items.BeginUpdate;
//添加树节点
tv1.Items.EndUpdate;

作者: youthon   发布时间: 2011-09-15

直接添加也不慢
应该是读取数据库的速度慢吧

作者: youthon   发布时间: 2011-09-15

逐个添加?
应该预先组织为 行首层次缩进的文本,再loadfromstream

作者: sz_haitao   发布时间: 2011-09-15

设计上来说,没有必要加载所有节点,所以只加载用户展开的节点是正确的选择。

在加载节点时,给Node.Data赋值,并且从数据库中读取A节点的子节点时要将所有子节点的子节点的个数也获取。

如果子节点的个数大于0,则在子节点下加一个节点,但将Node.Data设置为空.

在展开节点时,检查第一个子节点的Node.data 确定是否已经加载。

-----------------------------
这只是最基本的方法。更好的办法就是创建一个
TMyNode=class
  Data:Tobject;
  ID:Integer;
  Text:Integer;
  isLoad:Boolean;
end;

将每个业务读取后,ID=业务对象的唯一标识,Text =要显示的内容。IsLoad=是否加载。


不管你要显示的内容是什么业务,读取后都转换成 TMyNode 。

------------------------------------------------------
在更好的选择就是用:最好是使用 TVirtualStringTree 。



作者: ZyxIp   发布时间: 2011-09-15

如果选中时再加载,肯定是反映慢
要想快的话,至少要预加载下一层节点吧

作者: youthon   发布时间: 2011-09-15

热门下载

更多