我曾经用过二三种方法去做!联系我吧?QQ:3093749
e-mail:[email protected]

解决方案 »

  1.   

    给你一个递归:
    procedure TRForm.FillTreeD;
    var Node:TTreeNode;
    begin
      //这个函数很倒霉:明明是最先调用,到头来却最后结束----谁让你调用递归呢?
      with Query do
      begin
        Close;
        CommandText:='SELECT * FROM TableName ORDER BY Parent_Id';
        Open;
      end;
      Node:=TreeD.Items.Add(nil,'这是第一层');
      while not Query.Eof do
      begin
        if (Query.FieldByName('Parent_Id').IsNull) or (Query.FieldByName('Parent_Id').AsString='') then
        begin
          Node:=TreeD.Items.Add(Node,Query.FieldByName('Name').AsString);
          Node.SelectedIndex:=StrToInt(Query.FieldByName('id').AsString);
          //调用递归
          GetTop(Node,Query.FieldByName('id').AsString);
        end;
        Query.next;
      end;
    end;procedure TRForm.GetTop(N:Ttreenode;TopId:string);
    var TempData:TQuery;
        M:TtreeNode;//定义这个变量真无奈,在递归里,它本身的变量N都无法"变"
    begin
      //令我厌恶的是:递归里的变里不能是全局变量,但幸好我的内存还够大...
      TempData:=TQuery.Create(Self);
      with TempData do
      begin
        DataBaseName:=***;
        Close;
        CommandText:='SELECT * FROM TableName WHERE Parent_Id='''+TopId+'''';
        Open;
      end;
      while not TempData.Eof do
      begin
        M:=TreeD.Items.AddChild(N,TempData.FieldByName('name').AsString);
        M.SelectedIndex:=StrToInt(TempData.FieldByName('id').AsString);
        GetTop(M,TempData.FieldByName('id').AsString);
        TempData.Next;
      end;
      Tempdata.Free;
    end;
      

  2.   

    不错,是用递归,不过不是一次全部load完,在FormOnCreate时,load一和二级,当TreeView Expand 节点后,再加载下一级,速度就不会慢了。
    不然像楼上的,如果有x00,或x000条记录,等死人那速度.
      

  3.   

    经我研究
    对树的展开,如果子节点较少的情况下,使用中值排序基数法比较合适,速度比较快
    实现也方便;
    如果子节点比较多的情况下,使用父子数据结构,展开时采用逐层展开比较合适
    也就是说,Create时展开一级子树,以后对每级子树进行展开时,添加其节点