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

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

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

  5.   

    设计上来说,没有必要加载所有节点,所以只加载用户展开的节点是正确的选择。在加载节点时,给Node.Data赋值,并且从数据库中读取A节点的子节点时要将所有子节点的子节点的个数也获取。如果子节点的个数大于0,则在子节点下加一个节点,但将Node.Data设置为空.在展开节点时,检查第一个子节点的Node.data 确定是否已经加载。-----------------------------
    这只是最基本的方法。更好的办法就是创建一个
    TMyNode=class
      Data:Tobject;
      ID:Integer;
      Text:Integer;
      isLoad:Boolean;
    end;将每个业务读取后,ID=业务对象的唯一标识,Text =要显示的内容。IsLoad=是否加载。
    不管你要显示的内容是什么业务,读取后都转换成 TMyNode 。------------------------------------------------------
    在更好的选择就是用:最好是使用 TVirtualStringTree 。