我是一个刚开始学习delphi编程的新手。想一个。treeview显示数据表中数据的小程序,自己看书及上网搜方法搞了几个星期,还是没解决.恳请各位高手帮助。
数据表有三个字段a、b、c,分别对应treeview中的三个结点。并且三个字段的数据分别是由子窗口的三个编辑框输入的。
a       b       c
a1      
a2      b2      c2
a3      b3
效果如下:
│---a1

│---a2
│   │
│   │---b2
│        │
│        │---c2

│---a3
    │
    │---b3
请高手们教我建树以及数据输入与显示的方法.谢谢了!
因为是新手,所以分不多,不好意思!

解决方案 »

  1.   


    procedure TForm1.RzBitBtn1Click(Sender: TObject);
    var N: TTreeNode;
    begin
      TreeView1.Items.Add(nil, 'a1');
      N := TreeView1.Items.Add(nil, 'a2');
      TreeView1.Items.AddChild(N, 'b2');
      TreeView1.Items.AddChild(N, 'c2');
      N := TreeView1.Items.Add(nil, 'a3');
      TreeView1.Items.AddChild(N, 'b3');
    end;
      

  2.   

    1.生成tree過程:procedure TRES_BOM_VIEW_F.CREATETREEVIEWMODEL;
    var
      iLoop:Integer;
      Master,MasterNode:TTreeNode;
    begin
      adoq_getop.Close;
      //SELECT distinct PARN_TYP FROM WWW where parn_typ<>'.' and parn_typ is not null order by PARN_TYP desc
      adoq_getop.SQL.Text:='SELECT distinct PARN_TYP FROM WWW where parn_typ<>''.'' and parn_typ is not null order by PARN_TYP desc';
      adoq_getop.Open;
      adoq_getop.First;
      cx_TV.Items.BeginUpdate;
      cx_TV.Items.Clear;
      Master:=cx_TV.Items.Add(nil,'昆盈BOM表檢視');
      while not adoq_getop.Eof do
      begin
        if adoq_getop.FieldByName('PARN_TYP').AsString<>'' then
        begin
          Screen.Cursor:=crSQLWait;
          MasterNode:=cx_TV.Items.AddChild(Master,VarToStr(adoq_getop.FieldValues['PARN_TYP']));
          Application.ProcessMessages;
          qry_op.Close;
          qry_op.SQL.Text:='SELECT DISTINCT PARN_LITM FROM WWW WHERE PARN_TYP='''+ VarToStr(adoq_getop.FieldValues['PARN_TYP'])+''' GROUP BY PARN_LITM';
          qry_op.Open;
          for iLoop:=0 to qry_op.RecordCount -1 do
          begin
            cx_TV.Items.AddChild(MasterNode,VarToStr(qry_op.FieldValues['PARN_LITM']));
            qry_op.Next;
          end;
          Application.ProcessMessages;
          cx_TV.Items.EndUpdate;
          Screen.Cursor:=crDefault;
        end;
        adoq_getop.Next;
        Application.ProcessMessages;
      end;
     {
      ThreadTView:=cx_TV;
      ViewThread:=TExpandLH.Create;
      ViewThread.Resume;
      }
    end;
    2.調用:procedure TRES_BOM_VIEW_F.btnSB_SearchClick(Sender: TObject);
    begin
      inherited;
      try
        RES_LOADING_F:=TRES_LOADING_F.Create(Self);
        RES_LOADING_F.Label1.Caption:='正在檢索相關數據......';
        RES_LOADING_F.Show;
        RES_LOADING_F.Update;
        CREATETREEVIEWMODEL;
      finally
        RES_LOADING_F.Close;
      end;
    end;
      

  3.   

    回复 a8923704 :树中的结点是从子窗口的Edit中输入到数据表中后显示出来的,不是在程序中设计的.
    回复 ye_jufei :您写的有点深,好多看不懂.还有好多要学啊.
      

  4.   

    【数据表有三个字段a、b、c,分别对应treeview中的三个结点。并且三个字段的数据分别是由子窗口的三个编辑框输入的。
    a b c
    a1   
    a2 b2 c2
    a3 b3】
    树对应的数据表不能是这样的结构
    除非你的树只有2层,而且第2层最多2兄弟(堂兄弟不限)
      

  5.   

    没事做,给你做了一下,看看怎么样unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, DB, ADODB;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Button1: TButton;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        procedure FormCreate(Sender: TObject);
        procedure ShowData;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb';
      ADOConnection1.Connected:=true;
      ADOQuery1.Connection:=ADOConnection1;
      showdata;
      TreeView1.FullExpand;
    end;procedure TForm1.ShowData;
    var
      sqlstr:string;
      i,l:integer;
      a,b,c:string;
      aNode:TTreeNode;
    begin
      sqlstr:='select * from 表1';
      with ADOQuery1 do begin
        close;
        SQL.Text:=sqlstr;
        open;
        first;
        l:=RecordCount;
        for i:=1 to l do begin
          a:=trim(FieldByName('a').AsString);
          b:=trim(FieldByName('b').AsString);
          c:=trim(FieldByName('c').AsString);
          if a<>'' then begin
            aNode:=TreeView1.Items.AddChild(nil,a);
            if b<>'' then begin
              TreeView1.Items.AddChild(aNode,b);
              if c<>'' then begin
                TreeView1.Items.AddChild(aNode,c);
              end;
            end;
          end;
          next;
        end;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      sqlstr1,sqlstr2:string;
    begin
      if trim(edit1.Text)<>'' then begin //根据三个edit的情况构造sql语句
         sqlstr1:='insert into 表1(a';
         sqlstr2:=' values ('''+trim(edit1.Text)+'''';
         if trim(edit2.Text)<>'' then begin
           sqlstr1:=sqlstr1+',b';
           sqlstr2:=sqlstr2+','''+trim(edit2.Text)+'''';
           if trim(edit3.text)<>'' then begin
             sqlstr1:=sqlstr1+',c';
             sqlstr2:=sqlstr2+','''+trim(edit3.Text)+'''';
           end;
         end;
         sqlstr1:=sqlstr1+')'+sqlstr2+')';
         //构造sql语句完成后,执行插入操作
         with ADOQuery1 do begin
           close;
           sql.Text:=sqlstr1;
           ExecSQL;       TreeView1.Items.Clear;
           ShowData;
           TreeView1.FullExpand;
         end;
      end;
    end;end.
      

  6.   


    - - 你问的是 treeview 的用法好吧。
    数据库读取出来再把a1啥的一换不就ok了吗。
      

  7.   

    回复hys_427:
    谢谢大家的耐心,我好好学学.我初步试一下,因为我用的数据库是sqlite,数据表名为dat.db.运行之后,点击button1提示:project project1.exe raised exception class Eoleexception with message 'no such table:dat.db(1)'.process stopped.Use step or run to contiune. 
      

  8.   

    我查看了万一老师的一些例子,没有我这样设计数据表的.hys_427设计的代码好像可以用,但编译后不显示树,也没提示错误,不知是什么原因?
      

  9.   

    http://blog.csdn.net/bdmh/archive/2010/09/02/5857236.aspx
    根据数据库结构生成TreeView 
      

  10.   

    数据表的结构可能与大家平时用的不一样,没有parentId字段,直接用数据表中的三个字段做三个层的结点.如果只有第一个字段有数据,那就是第一个结点,如果第二个字段有数据且第一个字段跟上面一个相同,那就是第一个结点的子结点,第三个字段也是这样.
      

  11.   

    数据表就像下面这样的:
        zgbm               bmmc       xm
        主管部门1         部门1
        主管部门1         部门1     职员1
        主管部门1         部门1     职员2
        主管部门1         部门2     职员3
        主管部门2         部门1     职员4
        主管部门2         部门2     职员5
        主管部门3         部门1     职员6
        主管部门3         部门2     职员7
      

  12.   

    主要使用Treeview中的ADD语句。
      

  13.   

    回复hys_427:
    按您的代码,数据已显示出来了,但把第三层的显示到了第二层的兄弟层中。不知道哪里出了问题?
      

  14.   

    终于搞定。在TreeView1.Items.AddChild的前面加“一个aNode:=”就可正确显示了。接下来,要搞在子窗口中添加数据了。