首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

请教Treeview和数据表树状结构实现的有关问题

2012-02-19 
请问Treeview和数据表树状结构实现的问题有一个Access数据表Student,字段有姓名,专业,参加协会。界面上有Tr

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

      学生
      |___羽毛球   <                         姓名                 专业
      |___围棋                                 张方             计算机应用  
      |___.......                           刘伟             无线电  
      |___协会n


[解决办法]
遍历一遍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);
[解决办法]
参考一下这个
unit MainFrm;

interface

uses
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;
implementation

uses 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;

热点排行