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