我有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中显示该学生的详细信息
请问如何实现???
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中显示该学生的详细信息
请问如何实现???
解决方案 »
- delphi 动态结构体数组 删除指定元素?
- ShockwaveFlash能加个onclick和mousemove事件吗
- 请问如何循环读入文本文件的内容???
- 打听一下:b/s和c/s到底采用那种比较合适?
- 文件传送
- 我是初学者,请问有关在客户端改变查询条件问题。
- 为什么每设一次listview.canavas就会消耗一些系统资源?
- 100分相送!!!!急急急,报表自动换行!
- delphi程序员oicq,Email通讯录,流言给分.
- 关于光标停留在BUTTON上时触发一个事件的问题!
- 如何实现这种分组
- 我用了themeengine这个组件,TeDBEdit在显示文字的时候光标总在文字的一半停留,急待解决??
编程能力还很低啊,有没有参考代码贴出来??
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;
仅供参考。
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.
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中显示该学生的详细信息”还不是举手之劳?
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;
你这样做查询班级岂不是很死,做不到表名动态化?
SQL.Add('Select name from T_Class1');//T_Class1' 要换成'''+TreeView1.Selected.Text+''''
我(xuancaoer(萱草儿))上面已经说的很清楚了
DBGrid显示查询数据应该不会有问题吧???
关键是班级名和姓名都要动态化
报错啊
这句报错,各位大哥进来关注下吧,今天要解决啊
----------------------------
上面回复的时候我就注意到了这个问题,将你字段名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;
有了根节点,再考虑循环生成子节点不迟