我想把数据库表中的数据按照我的要求添加到TreeView中,我采用分层添加的方法,问题如下:怎样按层遍历TreeView?在遍历的过程中当到达某个节点时就定位到该节点,并对其进行操作?望高手不吝赐教!!!

解决方案 »

  1.   

    采用数组:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      a:array of Ttreenode;
      node:TTreenode;
      i,j,count:integer;
    begin
      i:=0;j:=0;
      Count:=Treeview1.Items.Count;
      setlength(a,Count);
      node:=Treeview1.TopItem;
      while node<>nil do
      begin
       a[i]:=node;
       node:=node.getNextSibling;
       i:=i+1;
      end;
      j:=i-1;
      i:=0;
      while i<Count do
        begin
            node:=a[i].getfirstchild;
            while node <> nil do
               begin
                 j:=j+1;
                 a[j]:=node;
                 node:=node.getNextSibling;
               end;
        i:=i+1;
      end;
     //以下用于集中输出,当然也可以在中间输出
     for i:=0 to Count-1  do
         listbox1.Items.Add(a[i].text);
     end;
      

  2.   

    呵呵!你要给某个节点增加子节点并不是要让它获得焦点才行的!
    只要你程序里能引用到它,用这个节点的ALLCHILDNODE就行了!
      

  3.   

    procedure TForm1.FormShow(Sender: TObject);
    var
      TreeNodeProvince,TreeNodeCity : TTreeNode;
      NodeDataRecPtr : PNodeDataRec;
      RegAdmiCode,Temp : String;
    begin
      TreeView1.Items.Clear;
      //TreeNodeProvince := nil;
      //TreeNodeCity := nil;
      with Query1 do
      begin
        Close;
        SQL.Clear;
        SQL.Text := 'select * from Admipartition order by ADMIPARTITIONNO asc';
        try
          Open;
        except
          Close;
          Exit;
        end;
        //----^    if not (bof and eof) then
        begin
          First;
          while Not eof do
          begin
            Temp := fieldbyname('AdmipartitionNo').AsString;        if Copy(fieldbyname('AdmipartitionNo').AsString,3,4) = '0000' then
            begin
              New(NodeDataRecPtr);
              NodeDataRecPtr^.AdmiName := FieldByName('ADMIPARTITIONNAME').AsString;
              NodeDataRecPtr^.AdmiCode := FieldByName('ADMIPARTITIONNO').AsString;
              TreeNodeProvince := TreeView1.Items.AddObject(nil,FieldByName('ADMIPARTITIONNAME').AsString +
                            '' + FieldByName('ADMIPARTITIONNO').AsString,NodeDataRecPtr);         // TreeNodeProvince := TreeView1.Items.Add(nil,FieldByName('ADMIPARTITIONNAME').AsString
                  //          );
            end
            else
              if Copy(FieldByName('ADMIPARTITIONNO').AsString,5,2) = '00' then
              begin
                New(NodeDataRecPtr);
                NodeDataRecPtr^.AdmiName := FieldByName('ADMIPARTITIONNAME').AsString;
                NodeDataRecPtr^.AdmiCode := FieldByName('ADMIPARTITIONNO').AsString;
                TreeNodeCity := TreeView1.Items.AddChildObject(TreeNodeProvince,FieldByName('ADMIPARTITIONNAME').AsString,NodeDataRecPtr);
              end
              else
              begin
                New(NodeDataRecPtr);
                NodeDataRecPtr^.AdmiName := FieldByName('ADMIPARTITIONNAME').AsString;
                NodeDataRecPtr^.AdmiCode := FieldByName('ADMIPARTITIONNo').AsString;
                TreeView1.Items.AddChildObject(TreeNodeCity,FieldByName('ADMIPARTITIONNAME').AsString,NodeDataRecPtr);          end;
            Next;
          end;
        end;
      end;
      TreeView1.SetFocus;
      TreeView1Click(Self);
    end;
      

  4.   

    http://www.code-labs.com/article/articleinfo.php?id=1019
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      CurrNode : TTreeNode;
    begin
      with TreeView1 do
      begin
        CurrNode := Items.GetFirstNode;
        while CurrNode <> nil do
        begin
          Items.AddChild(CurrNode,'子节点');  //这里给当前节点增加子节点      CurrNode := CurrNode.getNextSibling;         //这个方法就是得到同属一层节点
        end;
      end;
    end;