有一个Access数据表Student,字段有 姓名,专业, 参加协会。界面上有TreeView,DBgrid,单选钮控件。
   要利用Treeview显示一个树状结构:根节点为“学生”,下面一层节点根据单选钮选择,可以是字段“专业”或者是“参加协会”。
   如果这层节点为“专业”,则在DBgrid中显示与点中“专业”节点相符的学生的“姓名”和“参加协会”,点击根节点,则显示所有学生的“姓名”和“参加协会”;如果这层节点为“参加协会”,则在DBgrid中显示与点中“参加协会”节点相符的学生的“姓名”和“专业”,点击根节点,则显示所有学生的“姓名”和“专业”。
   请指点一下操作的关键点或者给个例子。谢谢
   
   学生
   |___计算机应用<          姓名      参加协会
   |___无线电               张方      羽毛球 
   |___.......              王南      围棋 
   |___专业n   学生
   |___羽毛球 <            姓名        专业
   |___围棋                张方      计算机应用 
   |___.......             刘伟      无线电 
   |___协会n

解决方案 »

  1.   

    主要就是个 Treeview.selected.text 的判断问题,
    建议先了解一下Treeview的相关属性.
      

  2.   

    遍历一遍treeview并修改节点的text属性就可以了,一条记录的所有字段都用结构保存到data指针里.如下例
    type
      PRec=^TRec;//定义结构指针
      TRec = record //定义结构
        FunctionID:Integer;
        ModelName:String;
        ModelType:Integer;//0 公共功能 1 需设置权限功能 3 管理员特殊功能
        ParentID:Integer;
        ImageIndex:Integer;
      end;
            New(PData);//分配指针内存
            PData^.FunctionID :=Qry_Data.FieldByName('FunctionID').AsInteger;
            PData^.ModelName  :=Qry_Data.FieldByName('ModelName').AsString;
            PData^.ModelType  :=Qry_Data.FieldByName('ModelType').AsInteger;
            PData^.ParentID   :=Qry_Data.FieldByName('ParentID').AsInteger;
            PData^.ImageIndex :=Qry_Data.FieldByName('ImageIndex').AsInteger;
    ANode:=FTree.Items.AddObject(nil,Qry_Data.FieldByName('ModelName').AsString,PData);
      

  3.   

    你去看看TTreeNode.Data属性的详细帮助吧,我上面给的已经够了
      

  4.   

    参考一下这个
    unit MainFrm;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, ComCtrls, ImgList, StdCtrls;type
       PNodedata=^TNodeData; //需要申明
        TNodeData = record
        id:integer;
        nodetype: integer;
        end;
      TMainForm = class(TForm)
        ADOQuery1: TADOQuery;
        TreeView1: TTreeView;
        ImageList1: TImageList;
        Edit1: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure TreeView1Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      MainForm: TMainForm;
    implementationuses Linkbank;{$R *.dfm}
    procedure TMainForm.FormShow(Sender: TObject);
    var
      RootNode, FirstDeptNode,SecondDeptNode,ThreeDeptNode: TTreeNode;
      PFirstDeptdata,PSecondDeptdata,ThreeDeptdata:PNodedata;
      FirstDeptName,SecondDeptname,ThreeDeptname:string;  
      ado1,ado2,ado3:Tadoquery;
    begin
      treeview1.Items.Clear;
      RootNode:=treeview1.Items.Add(nil,'我的树形结构');
      RootNode.ImageIndex := 0;
      RootNode.SelectedIndex := 0;
      ado1:=Tadoquery.Create(self);
      ado1.Connection:=dataform.conn;
      ado1.Close;
      ado1.SQL.Clear;
      ado1.SQL.Add('select * from tt'); //表结构为tt1 int,tt2 varchar;
      ado1.Open;
      ado1.First;
      while not ado1.Eof do
         begin
            PFirstDeptdata := new(PNodedata);
            PFirstDeptdata.id := ado1.fieldByName('tt1').AsInteger;
            PFirstDeptdata.nodetype := 0;
            FirstDeptName := ado1.FieldByName('tt2').AsString;
            FirstDeptNode := treeview1.Items.AddChildObject(RootNode, FirstDeptName,PFirstDeptdata);//注意展开时需要改成上一级的树的节点。
            ado1.Next;
                ado2:=Tadoquery.Create(self);
                ado2.Connection:=dataform.conn;
                ado2.Close;
                ado2.SQL.Clear;
                ado2.SQL.Add('select * from bb where bb1=:bb1');//表结构为:yy1 int,yy2 int,yy3 varchar;tt1与yy2关联。
                ado2.Parameters.ParamByName('bb1').Value:=PFirstDeptdata.id ;
                ado2.Open;
                ado2.First;
                while not ado2.Eof do
                       begin
                          if ado2.FieldByName('bb1').AsInteger=PFirstDeptdata.id then
                                  begin
                                         PSecondDeptdata := new(PNodedata);
                                         PSecondDeptdata.id := ado2.fieldByName('bb2').AsInteger;
                                         PSecondDeptdata.nodetype := 1;
                                         SecondDeptName := ado2.FieldByName('bb3').AsString;
                                         SecondDeptNode := treeview1.Items.AddChildObject(FirstDeptNode,SecondDeptName, PSecondDeptdata);
                                         ado2.Next;
                                           ado3:=Tadoquery.Create(self);
                                           ado3.Connection:=dataform.conn;
                                           ado3.Close;
                                           ado3.SQL.Clear;
                                           ado3.SQL.Add('select * from ss where ss0=:ss0 and ss1=:ss1');
                                           ado3.Parameters.ParamByName('ss0').Value :=PFirstDeptdata.id ;
                                           ado3.Parameters.ParamByName('ss1').Value :=PSecondDeptdata.id ;
                                           ado3.Open;
                                           ado3.First;
                                           while not ado3.Eof do
                                              begin
                                                if (ado3.FieldByName('ss0').AsInteger=PFirstDeptdata.id) and (ado3.FieldByName('ss1').AsInteger=PSecondDeptdata.id) then
                                                   begin
                                                    ThreeDeptdata:= new(PNodedata) ;
                                                    ThreeDeptdata.id:=ado3.fieldByName('ss2').AsInteger;
                                                    ThreeDeptdata.nodetype := 2;
                                                    ThreeDeptName := ado3.FieldByName('ss3').AsString;
                                                    ThreeDeptNode := treeview1.Items.AddChildObject(SecondDeptNode,ThreeDeptName, ThreeDeptdata);
                                                    ado3.Next;
                                                   end;
                                              end;
                                   end ;
                          end ;
                end ;
         RootNode.Expanded := true; //设置根目录默认打开
      end;