一个关于树的使用问题

yixiao386 2006-07-28 09:02:02
数据库中是学生的信息,包括姓名,班级,年级,怎么让这写数据在数中显示,可按年级、班级最后学生姓名这样展开。谢谢
...全文
119 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Blakhawk 2006-08-02
  • 打赏
  • 举报
回复
晕死,怎么这么多人问同样的问题.
frankzhenglei 2006-08-01
  • 打赏
  • 举报
回复
分级显示

procedure TForm.FormShow(Sender: TObject);
var
TreeCaption :string;
Node :TTreeNode;
begin
ADOQuery := TADOQuery.Create(nil);
ADOQuery.Connection := ADOConnect;
ADOQuery.SQL.Add(''select distinct 年级 from table order by 年级');
try
ADOQuery.Open;
except
on E:Exception do
begin
ShowMessage(E.Message);
ADOQuery.Free;
Exit;
end;
end;
Node := TreeView1.Items.Add(nil,'年级');
while not ADOQuery.Eof do
begin
TreeCaption := ADOQuery.FieldByName('年级').AsString+' ';
TreeView1.Items.AddChild(Node,TreeCaption);
TreeView1.Refresh;
ADOQuery.Next;
end;
ADOQuery.Free;
DataTree.FullExpand;
end;

procedure TForm.TreeView1DblClick(Sender: TObject);
var
aCommandText,aStr,aValue :string;
begin
if not DataTree.Selected.HasChildren then
begin
ADOQuery := TADOQuery.Create(nil);
ADOQuery.Connection := ADOConnect;
ADOQuery.SQL.Clear;
case TreeView1.Selected.Level of
1:
aCommandText := 'Select 班级 From table Where 年级=:nj '
2:
aCommandText := 'Select 学生姓名 From table Where 班级=:bj '
end;
ADOQuery.SQL.Add(aCommandText);
aStr := Trim(TreeView.Selected.Text);
if DataTree.Selected.Level=1 then
begin
ADOQuery.Parameters.ParamByName('nj').Value := aStr;
end;
if DataTree.Selected.Level=2 then
begin
ADOQuery.Parameters.ParamByName('bj').Value := aSort;
end;
try
ADOQuery.Open;
except
on E:Exception do
begin
ShowMessage(E.Message);
ADOQuery.Free;
Exit;
end;
end;
while not ADOQuery.Eof do
begin
if TreeView1.Selected.Level=1 then aVaule := ADOQuery.FieldByName('班级').AsString;
if TreeView1.Selected.Level=2 then aVaule := ADOQuery.FieldByName('学生姓名').AsString;
TreeView1.Items.AddChild(TreeView1.Selected,aStr);
end;
ADOQuery.Next;
end;
TreeView1.Selected.Expand(True);
ADOQuery.Free;
end;
end;


DouZHlang 2006-08-01
  • 打赏
  • 举报
回复
一个比较简练的算法:
procedure TForm1.Button1Click(Sender: TObject);
const
ID_DEPT = 2;
var
nLevel: Integer;
pNodes: array[0..1023] of TTreeNode;
lpID, lpName: string;
begin
ADODataSet1.Close;
ADODataSet1.CommandText := 'SELECT * FROM [国家] ORDER BY [编号]';
ADODataSet1.Open;
pNodes[0] := nil;
TreeView1.Items.Clear;
with ADODataSet1.Recordset do
while not Eof do
begin
lpID := Fields['编号'].Value;
lpName := Fields['名称'].Value;
nLevel := Length(lpID) div ID_DEPT;
pNodes[nLevel] := TreeView1.Items.AddChild(pNodes[nLevel - 1], lpName);
MoveNext;
end;
end;

数据库示例
编号 名称
01 中国
0101 吉林省
010101 长春市
010102 吉林市
0102 江苏省
010201 南京市
010202 常州市
02 美国
0201 密歇根州
020101 底特律市
0202 华盛顿州
020201 温哥华市
020202 西雅图市
03 澳大利亚
andyzhou1101 2006-07-28
  • 打赏
  • 举报
回复
建议LZ
如果数据太多
不要一次性加载所有数据
可以分级加载

-_-
mdejtod 2006-07-28
  • 打赏
  • 举报
回复
给个循环添加符合要求的记录不就行了?树的顶节点为年级,第二级节点为班级,第三节点为姓名~~
给你个简单的二级节点添加方法看看:
ado_add:=tadoquery.Create(nil);
ado_add.Connection:=datamodule1.ADOConnection1;
ado_temp.SQL.Clear;
ado_temp.SQL.Text:='select distinct 年级 from table ;
ado_temp.Open;
while not ado_temp.Eof do
begin
node:=treeview1.Items.AddChild(nil,ado_temp.fieldbyname('年级').AsString);
begin
ado_add.Close;
ado_add.SQL.Text:='select distinct 班级 from table where 年级='''+ado_temp.fieldbyname('年级').AsString+'''';
ado_add.Open;
while not ado_add.Eof do
begin
treeview1.Items.AddChild(node,ado_add.fieldbyname('班级').AsString);
ado_add.Next;
end;
end;
ado_temp.Next;
end;

5,390

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧