我有5张表,T_Node , T_Class1,T_Class2,T_Class3,T_Class4分别存放4个班级的学生信息。
T_Node的结构是这样的
ID     Name      Code
1      Class1    01
2      Class2    02
3      Class3    03
4      Class4    04
现在我在窗体左边分上下放了两个树,treeview1和treeview2.右边放了一个DBGridEh1
我想达到的效果:窗体onshow时,treeview1中显示表_T_Node内容,如下:
+学校名称
   -class1
   -class2
   -class3
   -class4
然后我随即点中其中一个班级,在treeview2中显示该班级的所有学生姓名,比如
我点class1,则在treeview2中显示T_Class1中所有学生的姓名,
再当我点treeview2中随即一位学生姓名时,在DBGridEh中显示该学生的详细信息
请问如何实现???

解决方案 »

  1.   

    Tree的相关存在指针里,显示数据的时候,用某项作为参数生成SQL语句来显示数据
      

  2.   

    取出TreeView.selected.text用Sql做查找就可以了。
      

  3.   

    取出TreeView.selected.text用Sql做查找就可以了。这个想法我也知道,我就是不会写代码啊,
    编程能力还很低啊,有没有参考代码贴出来??
      

  4.   

    最好的方法是通过指针将TreeView相关节点的信息以记录的形式保存,显示数据的时候用其中的一项信息做SQL语句中的参数即可。例:(1)声明记录指针:
    Type
      PICItemInfo=^TICItemInfo;
      TICItemInfo=Record
        FItemID:Integer;
        FName,FNumber:string;
      end;
    (2)构建TreeView的过程
    var
      MyItem:PICItemInfo;
      MyNode:TTreeNode;
    begin
      if OpenDataSet(DM.ADOTemp,vSQL) then
      begin
        with DM.ADOTemp do
        begin
          while not Eof do
          begin
            New(MyItem);
            MyItem.FName:=FieldByName('FName').AsString;
            MyItem.FNumber:=FieldByName('FNumber').AsString;
            MyItem.FItemID:=FieldByName(FieldName).AsInteger;
            MyNode:=TTreeView(Sender).Items.AddObject(Nil,MyItem.FName,MyItem);
            if FieldByName('FDetail').AsBoolean then
              MyNode.ImageIndex:=2
            else MyNode.ImageIndex:=1;
            AddNextLevel(TTreeView(Sender),IntToStr(MyItem.FItemID),vSQL2,FieldName,MyNode);
            Next;
          end;
        end;
      end;
    end;
    仅供参考。
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, ComCtrls;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        TreeView2: TTreeView;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        ADOQuery1: TADOQuery;
        ADOQuery2: TADOQuery;
        ADOQuery3: TADOQuery;
        procedure TreeView1DblClick(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure TreeView2DblClick(Sender: TObject);
      private
         classInfo:string;
         studentInfo:string;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.TreeView1DblClick(Sender: TObject);
    var
      aclass:string;
    begin
      treeview2.Items.Clear;
      classInfo:=TreeView1.Selected.Text;
      aclass:=classInfo;
      with ADOQuery3 do
        begin
          close;
          sql.Clear;
          sql.Add('select 姓名 from 学生信息');
          sql.Add('where 所属班级='''+aclass+'''');
          try
            open;
            while not Eof do
            begin
    //………………把数据库里的信息添加到根节点下显示…………………………………
              treeview2.Items.Add(nil,FieldByname('姓名').AsString);
              Next;
            end;
          except
             close;
          end;
          //TreeView2.Items[0].Expanded:=true;
        end;
    end;procedure TForm1.FormShow(Sender: TObject);
    var
      i:integer;
      schoolInfo:TTreeNode;
      //classInfo:TTreeNode;
    begin
      treeview1.Items.Clear;
     // treeview2.Items.Clear;
      schoolInfo:=treeview1.Items.Add(nil,'#学校#'); //对显示角色名是,在treeview1建立的根节点
      with ADOQuery2 do
        begin
          close;
          sql.Clear;
          sql.Add('select 班级名称 from 班级');
          try
            open;
            while not Eof do
            begin
    //………………把数据库里的信息添加到根节点下显示……………………
              treeview1.Items.AddChild(schoolInfo,FieldByname('班级名称').AsString);
              Next;
            end;
          except
             close;
          end;
          TreeView1.Items[0].Expanded:=true;
        end;
    end;procedure TForm1.TreeView2DblClick(Sender: TObject);
    var
      astudent:string;
    begin
      studentInfo:=TreeView2.Selected.Text;
      astudent:=studentInfo;
      with ADOQuery1 do
        begin
          close;
          sql.Clear;
          sql.Add('select * from 学生信息');
          sql.Add('where 姓名='''+astudent+'''');
          try
            open;
          except
            close;
          end;
        end;
    end;end.
      

  6.   

    随便看一下楼主的要求,应该是比较easy的东西,上次我遇到过类似的问题……
    TreeView1的实现:
    procedure TForm1.FormCreate(Sender: TObject);
    var
    RootNode,ChiNode:tTreeNode;
    begin
      Query1.Close;
      Query1.SQL.Clear;
      Query1.SQL.Add('select name from T_Node);
      Query1.Open;
      if Query1.RecordCount > 0 then begin
        Query1.First;
        RootNode:=TreeView1.Items.AddFirst(nil,'学校名称);
        while not Query1.Eof do begin
          ChiNode := TreeView1.Items.Add(RootNode,Query1.FieldByName('name').AsString);
          Query1.Next;
        end;
      end;
    end;
    上面的程序你完全照搬都可以了(但我不清楚你的name字段等会不会关键字冲突)TreeView2的实现:这里不给完整代码,但给关键的部分
    Query1.SQL.Add('select 学生姓名 from '''+TreeView1.Selected.Text+''''(即是选定的具体班级表))
    然后按照查询结果生成你的TreeView2,这一步完全可以根据上面给出的TreeView1的生成一样写TreeView2都生成了,要“在DBGridEh中显示该学生的详细信息”还不是举手之劳?
      

  7.   

    谢谢,TreeView1的功能我实现了,但是treeview2的功能还是有点问题,我的代码是这样的:
    var
      mynode:TTreenode;
      str:string;
    begin
      mynode:=Treeview1.Selected;
      str:=mynode.Text;
      if mynode.Level=1  then
      begin
        if str='Class1'then
        begin
          with Frm_Data.Qry_Temp do
          begin
            Close;
            SQL.Clear;
            SQL.Add('Select name from T_Class1');
            Open;
          end;
          while not Frm_Data.Qry_Temp.Eof do
          begin
            treeview2.Items.Add(treeview2.TopItem,'Frm_Data.Qry_Temp.FieldByName('name').asstring');  
            Qry_Temp.Next;
          end;
        end;
      end;
    end;
    各位帮忙修正一下,还有,treeview2如果显示出了class1班的所有学生姓名后,我在treeview2中
    点任意一个学生姓名,DBGridEh中要显示该生的详细信息:
    with Qry_student do
    begin
      Close;
      sql.clear;
      SQl.Add(select * from T_Class1 where name='''+treeview2.Selected.Text+'''');
      Open;
    end;
    这样能ok吗???
    end;
      

  8.   

    为什么不可以,试试不就知道了
    你这样做查询班级岂不是很死,做不到表名动态化?
    SQL.Add('Select name from T_Class1');//T_Class1' 要换成'''+TreeView1.Selected.Text+''''
    我(xuancaoer(萱草儿))上面已经说的很清楚了
    DBGrid显示查询数据应该不会有问题吧???
    关键是班级名和姓名都要动态化
      

  9.   

    楼上的大哥说得是,现在系统这句treeview2.Items.Add(treeview2.TopItem,'Frm_Data.Qry_Temp.FieldByName('name').asstring'); 
    报错啊
      

  10.   

    treeview2.Items.Add(treeview2.TopItem,'Frm_Data.Qry_Temp.FieldByName('name').asstring'); 
    这句报错,各位大哥进来关注下吧,今天要解决啊
      

  11.   

    上面的程序你完全照搬都可以了(但我不清楚你的name字段等会不会关键字冲突)
    ----------------------------
    上面回复的时候我就注意到了这个问题,将你字段名name先改了试试
    然后还一点要注意:生成树之前请先生成要节点!
    将你那句换成这样绝无问题:
        Query1.First;
        RootNode:=TreeView1.Items.AddFirst(nil,'学校名称);//先生成要节点!!!
        while not Query1.Eof do begin
          ChiNode := TreeView1.Items.Add(RootNode,Query1.FieldByName('name').AsString);
          Query1.Next;
        end;
      

  12.   

    你的TreeView2根节点在哪,我实在看不出来……
    有了根节点,再考虑循环生成子节点不迟