我用treeview+accesss写的个程序,treeview分很多级,每级上都有N多个节点,算下来有6000多个,但是现在问题出来了,程序打开时,加载这个树要N长时间,肯定不行。我想逐级展开这个树,也就是开始只加载一级或者两级结节,点击后判断还有没有子节点,有的话就展开,没有的话就执行命令,查了很多贴子,都不行,因为每个人的数据表结构都不一样,一般都只发一段代码,还是搞不清楚,我想要个例子,代码加数据表结构的,能不能给一个,马上给分,或者我把表结构贴在下面,大家给段简单的代码也行。表如下:ID      NAME      SJBH(表示结点关系的标记)     ZL(点击结点后显示出的资料)
1      一年级          0                                及格
2      二年级          0                                及格
3      张三            1                                不及格
4      李四            1                                极格
5      王五            2                                不及格
SJBH的意思就是根据前面的ID显示,如果SJBH是0,就是最上一级,SJBH是1的话,就为在ID为1的子结点,SJBH为2的话就是ID为2的子结点
我觉得这个表的结构也不怎么样,最好能有个简单的代码加表结构的例子看一看
[email protected]
如果方便的话,请帮一下忙,我非常的急!

解决方案 »

  1.   

    用不着一次全部装入吧?使用Filter 或者 参数化查询。 点一个节点的时候才装子结点。
      

  2.   

    不难的。
    ID      NAME      SJBH(表示结点关系的标记)     ZL(点击结点后显示出的资料)
    1      一年级          0                                及格
    2      二年级          0                                及格
    3      张三            1                                不及格
    4      李四            1                                极格
    5      王五            2                                不及格
    //
    //--------
      ds.Filter  := 'SJBH=0';
      ds.Filtered:=true;
      ds.first
      while not ds.eof do 
      beign
       ...
       ...
         anode:= treeview.items.add(nil,Field('Name'));
         anode.tag:=id;
       next;
      end;
    ////节点点击
      ds.Filtered:=False;
      ds.Filter:='SJBH='+IntToStr( anode.tag);
      ds.Filtered:=True;
      ds.first;
      ///.... 同上。
      

  3.   

    晕,逐级建树很easy
    unit uEamNavTree;interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, ImgList,DBClient,Menus;
    CONST
      SQLPROJECTCLASSCODE='SYS_PROJECTCLASS_GET';
      GET_PROJECTS_BY_PROJECTCLASSCODE='SYS_PROJECTS_GET';
      type
          TEamNavTree=class(TTreeView)
          private
            FMenuItem: TMenuItem;
            FOnChange: TTVChangedEvent;
            procedure Collapsing(Sender: TObject; Node: TTreeNode;var AllowCollapse: Boolean);
          public
            constructor create(AOwner:TComponent);override;
            procedure BuildTreeView();
            property MenuItem:TMenuItem read FMenuItem write FMenuItem;//MnuEnterPriseManager
            property OnChange: TTVChangedEvent read FOnChange write FOnChange;
          end;
    implementationuses uBaseDM, uPlugIn, uPluginInterface;{ TEamNavTree }procedure TEamNavTree.BuildPlugIn(Node: TTreeNode;
      ClassCode: String);
    var
      BaseDM:TBaseDM;
      PlugInControl:TPlugInControl;
      TmpNode:TTreeNode;
      cds:TClientDataSet;
      strFileName:string;
    begin
      cds:=TClientDataSet.Create(nil);
      try
      BaseDM:=TBaseDM.Instance;
      if Node=nil then Exit;
      BaseDM:=TBaseDM.Instance;
      if BaseDM.OpenData(GET_PROJECTS_BY_PROJECTCLASSCODE,ClassCode,cds) then
      begin
        while not cds.Eof do
        begin
          strFileName:=cds.fieldByname('APPLICATIONNAME').AsString;
          PlugInControl:=TPlugInControl.Create(strFileName);
          PlugInControl.Caption:=cds.fieldByName('NAME').AsString;
          TmpNode:=Items.AddChildObject(Node,cds.fieldByName('NAME').AsString,PlugInControl);
          if PlugInControl.Enabled then
          begin
          TmpNode.SelectedIndex:=3;
          TmpNode.ImageIndex:=3;
          end
          else
          begin
            TmpNode.SelectedIndex:=4;
            TmpNode.ImageIndex:=4;
          end;
          cds.Next;
        end;
      end;
      finally
       FreeAndNil(cds);
      end;end;procedure TEamNavTree.BuildTree(Node: TTreeNode;
      ParentID: integer);
    var
      BaseDM:TBaseDM;
      PlugInControl:TPlugInControl;
      TmpNode:TTreeNode;
      cds:TClientDataSet;begin
      cds:=TClientDataSet.Create(nil);
      try
      BaseDM:=TBaseDM.Instance;
      if Node=nil then Exit;
      BaseDM:=TBaseDM.Instance;
      if BaseDM.OpenData(SQLPROJECTCLASSCODE,IntToStr(ParentID),cds) then
      begin
         while not cds.Eof do
         begin
           TmpNode:=Items.AddChild(Node,cds.fieldByName('NAME').AsString);
           //子分类
           BuildTree(TmpNode,cds.fieldByName('ID').AsInteger);
           //分类下的项目
           BuildPlugIn(TmpNode,cds.fieldByName('CODE').AsString);
           if TmpNode.HasChildren then
           begin
             TmpNode.ImageIndex:=1;
             TmpNode.SelectedIndex:=1;
           end
           else
           begin
             TmpNode.ImageIndex:=2;
             TmpNode.SelectedIndex:=2;
           end;
           cds.Next;
         end;
      end; finally
       FreeAndNil(cds);
     end;end;procedure TEamNavTree.BuildTreeView;
    var
      Node:TTreeNode;
    begin
    end;procedure TEamNavTree.Collapsing(Sender: TObject; Node: TTreeNode;
      var AllowCollapse: Boolean);
    begin
      AllowCollapse:=not( Node.Level=0);
    end;constructor TEamNavTree.create(AOwner: TComponent);
    begin
      inherited;
      OnCollapsing:=Collapsing;
    end;end.