给个循环添加符合要求的记录不就行了?树的顶节点为年级,第二级节点为班级,第三节点为姓名~~ 给你个简单的二级节点添加方法看看: 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;
一个比较简练的算法: 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 澳大利亚
分级显示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;
给你个简单的二级节点添加方法看看:
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;
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 澳大利亚
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;