简单的描述下:左边是TreeView,右边是DBGrid;现在通过ADOQuery、DataSource等控件把数据库(SQL)中的表d_Department和d_Employee(字段吧)放到TreeView和DBGrid中。TreeView中放的是部门(如财务部,研发部等),DBGrid中放的是其职员对应的信息。也就是点财务部,DBGrid就出现其对应的职员。明白吧?现在表d_Department和d_Employee中有字段id和Did,他们的关系是对应的。
求知道的帮帮忙,我是初学者啊,很多不是很了解的。这是截图,举个例子,大家应该懂的。

解决方案 »

  1.   

    treeview的每个节点有个data属性,可以保存指针,你做一个record里面是你要的信息,然后每创建一个节点,就添加一个reord指针,这样节点切换时,转换data到record,根据其中信息select记录
      

  2.   

    能不能不用指针,这个应该不是很难的。只是我对delphi不熟悉。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, ComCtrls, Grids, DBGrids, StdCtrls;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        ADOQuery1: TADOQuery;
        ADOQuery2: TADOQuery;
        TreeView1: TTreeView;
        DataSource1: TDataSource;
        procedure FormCreate(Sender: TObject);
        procedure TreeView1Click(Sender: TObject);
    //    procedure TreeView1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var
      str: String;
      m: TTreeNode;
    begin
      with ADOQuery1 do
        begin
          close;
          SQL.Clear;
          SQL.Add('SELECT * FROM d_Department WHERE parid = ''00000'' ');
          open;      First;
          m := TreeView1.Items.AddChild(nil, '所有部门');
          while not Eof do
            begin
              str := FieldByName('FullName').AsString;
              TreeView1.Items.AddChild(m, str);
              Next;
            end;    end;
    end;
    procedure TForm1.TreeView1Click(Sender: TObject);
    var
      GetStr: TTreeNode;
    begin
      GetStr := TreeView1.Selected;
      with ADOQuery2 do
        begin
          close;
          SQL.Clear;
          SQL.Add('SELECT * FROM d_Employee WHERE parid = ''00000'' ');
          //SQL.Add('SELECT * FROM d_Employee WHERE Did = X');
          //Parameters.ParamByName('X').Value := GetStr;
          open;
        end;
    end;end.这是代码,写得很烂,没实现功能。
    是这样的,以前我是用GetStr := TreeView1.Selected;这个来实现的,现在数据库里面没有对应的部门,而是改用Did和id,现在同过这个来建立关系。
    真的不知道怎么下手哦,烦呐……
      

  3.   

    首先。在创建部门树的时候。每个节点获取到部门的idwhile not Eof do
      begin
      str := FieldByName('FullName').AsString;
      strID :=  FieldByName('部门id').AsString;
      node := TreeView1.Items.AddChild(m, str);
      node.tag :=  strID;
      Next;
      end;然后,当点击部门树的时候获取到‘部门id’
    GetStr := TreeView1.Selected;
    strID := TreeView1.Selected.tag;最后。搜索的时候用 部门id 搜索
    SQL.text := 'SELECT * FROM d_Employee WHERE Did = '+strID;
      

  4.   

    不想用指针,可以利用控件属性tag来存储你需要的某个数据!  
      

  5.   

    用记录显然不是好办法,用类吧
    1.创建一个部门类 TDeptClas = Class(TObject)
    2.把部门数据从数据库中查出来,并把数据通过对象形式存到TreeView1中
    3.然后每次点击部门节点时,就可以根据部门ID并联出相应的数据到DBGRID了。如:
    Type
      TDeptClas = Class(TObject)
      private;
        FDeptId: string;
        FDeptName: string;
      protected;
      public;
      published;
        property DeptId: string write FDeptId read FDeptId;
        property DeptName: string write FDeptName read FDeptName;
    end;
    取数据:
    var
      Obj: TDeptClas;
    begin
      Qry.First;
      while not eof do
      begin
        Obj := TDept.Create;
        Obj.DeptId := Qry.FieldByName('DeptId').AsString;
        Obj.DeptName := Qry.FieldByName('DeptName').AsString;
        Tv.Items.AddObject(Obj,Obj.DeptName);
        Qry.Next;
      end;
    end;TV的onChange事件
    var
      Obj: TDeptClas;
      sSql: string;
    begin
      if TV.Selected = nil then Exit;
      if TV.Selected.data = nil then Exit;
      Obj := TDeptClas(TV.Selected.Data);
      sSql := 'Select * from d_Employee where parid ='+QuotedStr(Obj.DeptId);
      Qry.Close;
      Qry.SQL.Clear;
      Qry.SQL.Add(sSql);
      Qry.Open;
    end;
      

  6.   

    好吧,基本功能已经实现了。但是问题出现了,我是点击节点的名字,来与DBDrid里面的信息相连的。也就是说名字可能重复了,这样就会出错的。现在要用ID来与他连接。请问怎么解决楼上有说道用data,请问具体怎么实现。我把代码发下,能帮我改进么?unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, ComCtrls, Grids, DBGrids, StdCtrls;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        ADOQuery1: TADOQuery;
        ADOQuery2: TADOQuery;
        TreeView1: TTreeView;
        DataSource1: TDataSource;
        ADOQuery3: TADOQuery;
        procedure FormCreate(Sender: TObject);
        procedure TreeView1Click(Sender: TObject);
      private
        { Private declarations }
        procedure InitChild(Node:TTreeNode);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    {$R *.dfm}
    procedure query(ado: TADOQuery; sql: string); //过程声明,查询语句
    begin
      ado.Close;
      ado.SQL.Clear;
      ado.SQL.Add(sql);
      ado.Open;
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      Node: TTreeNode;
    begin
      //InitTree(TreeView1, ADOQuery1, ADOQuery2, '');  //过程调用
      Node := TreeView1.Items.AddChild(nil, '所有部门');
      InitChild(Node);
    end;procedure TForm1.InitChild(Node: TTreeNode);
    var
      strSQL: string;
      qry: TADOQuery;
      ANode: TTreeNode;
    begin
      strSQL := Format('SELECT * FROM d_Department WHERE ParID = ' +
                        '(SELECT ID FROM d_Department WHERE FullName = %s)', [QuotedStr(Node.Text)]);
      qry := TADOQuery.Create(nil);
      qry.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=金如意基础版开发;Data Source=FUCHUANG';
      query(qry, strSQL);
      qry.First;
      while not qry.Eof do
      begin
         ANode := TreeView1.Items.AddChild(Node, qry.FieldByName('FullName').AsString);
         InitChild(ANode);
         qry.Next;
      end;
    end;procedure TForm1.TreeView1Click(Sender: TObject);
    var
      GetStr: string;
    begin
      GetStr := TreeView1.Selected.Text;  //把值赋给GetStr
      with ADOQuery3 do
      begin
        ADOQuery3.close;
        ADOQuery3.SQL.Clear;
        ADOQuery3.SQL.Add('SELECT * FROM d_Employee WHERE Did = (SELECT id FROM d_Department WHERE FullName = ''' + GetStr + ''')');
        ADOQuery3.open;
      end;
    end;end.上面的GetStr就是通过text获取的,我现在要id。求解啊。