1、我想请问如何使用数据库中的数据动态添加到TreeView中去,并分清树结构的层。如我有一根节点下面有记录,但我在显示窗体的时候不添加记录。只在点击加号的时候再动态添加数据。
2、请问数据库中的表是如何建。
以上两个问题最好有代码,有比较多的注释.谢谢!表面给100分,如回答的好。有额的分。

解决方案 »

  1.   

    1、var
         TempTreeNode : TTreeNode;
       begin
         tempTreenode := Treeview.Selected;
         //ADOTABLE是根据所选节点过滤的结果集
         adotable.first;
         while not adotable.eof do
         begin
           treeview.items.addchild(temptreenode,adotable.fieldbyname('...').asstring);
           adotable.next;
         end;
       end;2、建议如下格式:
       JDID (节点ID),SJJDID(上级节点ID),JDBT(节点标题),JDXSSX(节点显示顺序)
      

  2.   

    unit Main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, DB, ADODB;type
      TFormMain = class(TForm)
        Access: TADOConnection;
        Query: TADOQuery;
        Tree: TTreeView;
        BtnFillTree: TButton;
        procedure FormCreate(Sender: TObject);
        procedure BtnFillTreeClick(Sender: TObject);
      private
        { Private declarations }
        AppPath : String;    Function OpenDatabase : Boolean;
        Procedure CloseDatabase;
        Procedure AddItem( Node : TTreeNode );
      public
        { Public declarations }
      end;var
      FormMain: TFormMain;implementation{$R *.dfm}function TFormMain.OpenDatabase: Boolean;
    Var
       ConnectionString : String;
    begin
         Result := False;
         ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +
                             AppPath + 'Database.mdb;Persist Security Info=False';
         Access.ConnectionString := ConnectionString;
         Try
            Access.Open;
            Result := True;
         Except
               Application.MessageBox( '打开数据库发生错误!', '错误', MB_OK + MB_ICONSTOP );
         End;
    end;procedure TFormMain.FormCreate(Sender: TObject);
    begin
         AppPath := ExtractFilePath( ParamStr( 0 ) );
    end;procedure TFormMain.CloseDatabase;
    begin
         Access.Close;
    end;procedure TFormMain.BtnFillTreeClick(Sender: TObject);
    Var
       Node : TTreeNode;
    begin
         Tree.Items.Clear;     If Not OpenDatabase Then Exit;     Query.Close;
         Query.SQL.Clear;
         Query.SQL.Add( 'Select Full_Name From Dept Where Parent_ID = ''000''' );
         Try
            Query.Open;
            While Not Query.Eof Do
            Begin
                 Tree.Items.AddChild( Nil, Query.Fields[ 0 ].AsString );
                 Query.Next;
            End;
         Except
               Exit;
         End;     Node := Tree.Items.GetFirstNode;
         AddItem( Node );     CloseDataBase;
    end;procedure TFormMain.AddItem(Node: TTreeNode);
    Var
       QueryX : TADOQuery;
       NodeX  : TTreeNode;
    begin
         QueryX := TADOQuery.Create( Nil );
         QueryX.Connection := Access;
         Try
            While Node <> Nil Do
            Begin
                 QueryX.Close;
                 QueryX.SQL.Clear;
                 QueryX.SQL.Add( 'Select Full_Name From Dept Where Parent_ID =' );
                 QueryX.SQL.Add( '       ( Select ID From Dept Where Full_Name = ' + QuotedStr( Node.Text ) + ' )' );
                 Try
                    QueryX.Open;
                    While Not QueryX.Eof Do
                    Begin
                         NodeX := Tree.Items.AddChild( Node, QueryX.Fields[ 0 ].AsString );
                         AddItem( NodeX );
                         QueryX.Next;
                    End;
                 Except
                       Exit;
                 End;
                 Node := Node.getNextSibling;
            End;
         Finally
                QueryX.Free;
         End;
    end;end.
    数据库字段:
    ID, Parent_ID, Full_Name三个字段(至少)
      

  3.   

    如果看不懂,到MSN上找我,我给你源程序([email protected]),正好帮别人写了一个例子!!!
      

  4.   

    http://www.csdn.net/Develop/Read_Article.asp?Id=13651值得一看
      

  5.   

    跟你的差不多,我的表结构是
         adcode 
         adname
     adcode是地区编码,每种级别的地区编码有固定长度 ,共有六级深度
     要求产生节点树,并且一次不能全部编历生产,要求点击一个节点后,若有则生成下级节点, 
     我是逐机取值来生成树的,并判断节点的深度.  
       这个程序从库里取值生产节点的方法上面的兄弟已经提了,另外重要的是鼠标点击TREEVIEW事件,以此来判断生成问题.
      我还没有完全写完,不过基本的东西已经出来了,把一些贴出来,结合上面的,你应该差不多了.procedure TfrmInarea.fcTreeView1MouseDown(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode; Button: TMouseButton; Shift: TShiftState; X,
      Y: Integer);              //&micro;&yen;&raquo;÷&frac12;&Uacute;&micro;&atilde;&Oacute;&Ograve;&frac14;ü&sup2;&Euml;&micro;&yen;  &frac14;°×ó&raquo;÷&sup2;&Ugrave;×÷
    var
      p: TPOINT;
      Axis_X, Axis_Y: Integer;
      sAnaly1,sAnaly2:String;
      iLevel:Integer;  //&micro;±&Ccedil;°&frac12;&Uacute;&micro;&atilde;&micro;&Auml;×&Oacute;&frac12;&Uacute;&micro;&atilde;&iquest;í&para;&Egrave;
    begin
      if Button = mbRight then
      begin
        CurrentNode := fcTreeview1.GetNodeAt(X, Y);
        if CurrentNode = nil then
          exit;
        if CurrentNode.Selected then
        begin
            //&Egrave;&laquo;&frac34;&Ouml;±&auml;&Aacute;&iquest;&micro;&Auml;&cedil;&sup3;&Ouml;&micro;
            sNodeText:=CurrentNode.Text;
            //sNodeLevel:=CurrentNode.Level;        //&Iuml;&Egrave;&micro;÷&Otilde;&ucirc;&Oacute;&Ograve;&frac14;ü&micro;&macr;&sup3;&ouml;&sup2;&Euml;&micro;&yen;&Iuml;&icirc;&micro;&Auml;×&acute;&Igrave;&not;
          if CurrentNode.HasChildren=False then
            begin
               n1.Enabled:=True;
               n2.Enabled:=False;
            end
          else
            begin
               n1.Enabled:=False;
               n2.Enabled:=True;
            end;      GetCursorPos(p);
          Axis_X := p.X;
          Axis_Y := p.Y;
          PopupMenu1.Popup(Axis_X, Axis_Y);
        end;
      end ;  if  Button = mbLeft then
      begin
        CurrentNode := fcTreeview1.GetNodeAt(X, Y);
        if CurrentNode = nil then
          exit;
        if CurrentNode.Selected then
        begin
         //&Egrave;&laquo;&frac34;&Ouml;±&auml;&Aacute;&iquest;&micro;&Auml;&cedil;&sup3;&Ouml;&micro;
            sNodeText:=CurrentNode.Text;
            iLevel:=frmInarea.AnalyLevel(CurrentNode)+2;
        //    sNodeLevel:=CurrentNode.Level;
         if Datamodule1.RArea.Active then Datamodule1.RArea.Close;
         Datamodule1.RArea.SQL.Clear;
         Datamodule1.RArea.SQL.Add('select * from admin_division where adname=:areaname');
         Datamodule1.RArea.Prepared;
         Datamodule1.RArea.Parameters.ParamByName('areaname').Value:=sNodeText;
         Datamodule1.RArea.Open;     if not(Datamodule1.RArea.IsEmpty) then
            begin
               sAnaly1:=trim(Datamodule1.RArea.Fields[0].AsString); //&Egrave;&iexcl;&micro;&Atilde;&micro;&yen;&raquo;÷&frac12;&Uacute;&micro;&atilde;&micro;&Auml;CODE±à&Acirc;&euml;&Ouml;&micro;
               Datamodule1.RArea.Close;           //&Ocirc;&Uacute;&Oacute;&Ograve;±&szlig;&acute;°&iquest;&Uacute;&Iuml;&Ocirc;&Ecirc;&frac34;&micro;&atilde;&raquo;÷&frac12;&Uacute;&micro;&atilde;&Oacute;&micro;&Oacute;&ETH;&micro;&Auml;&Iuml;&Acirc;&frac14;&para;&Ouml;&micro;
               if Datamodule1.DBDisp.Active then Datamodule1.DBDisp.Close;
               Datamodule1.DBDisp.SQL.Clear;
               Datamodule1.DBDisp.SQL.Add('select adcode &Ccedil;&oslash;&Oacute;ò&acute;ú&Acirc;&euml;,adname &Ccedil;&oslash;&Oacute;ò&Atilde;&ucirc;&sup3;&AElig; from admin_division where (adcode like :nodecode) and (len(adcode)=:iLevels)');
               Datamodule1.DBDisp.Prepared;
               Datamodule1.DBDisp.Parameters.ParamByName('nodecode').Value:=sAnaly1+'%';
               Datamodule1.DBDisp.Parameters.ParamByName('iLevels').Value:=iLevel;
               Datamodule1.DBDisp.Open;        end;
         if Datamodule1.RArea.Active then Datamodule1.RArea.Close;    end;
      end;
    end;
      

  6.   

    补充,你说:
      "如我有一根节点下面有记录,但我在显示窗体的时候不添加记录。只在点击加号的时候再动态添加数据"
      因为你的节点是从数据库生成的,所以如果你看的TreeView1的节点上是没有加号的,除非你已经生产了下级子节点
      

  7.   

    Delphi_Li(Delphi Li) 你的msn是多少啊?