我想做一个树形结构的查询功能,就是像CSDN一样的,我用了 ADODataSet控件连接SQL数据库,但是我的全面显示,没有下一级的
procedure TForm_department_staff.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 department ORDER BY id';
ADODataSet1.Open;
pNodes[0] := nil;
TreeView1.Items.Clear;
with ADODataSet1.Recordset do
while not Eof do
begin
lpID := Fields['id'].Value;
lpName := Fields['department'].Value;
nLevel := Length(lpID) div ID_DEPT;
pNodes[nLevel] := TreeView1.Items.AddChild(pNodes[nLevel - 1], lpName);
MoveNext;
end;
end;
表department中有:01,财务部;02,销售部;0101,五精仓库;0201,成品仓库;010101,五精一队;我想显示成:
财务部
五精仓库
五精一队
销售部
成品仓库但是显示的结果是:
财务部
五精仓库
五精一队
销售部
成品仓库全部在一级上,请各位大哥帮忙看看,还有就是我在点击显示结果的时候怎么把点击的数据传给一个文本
procedure TForm_department_staff.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 department ORDER BY id';
ADODataSet1.Open;
pNodes[0] := nil;
TreeView1.Items.Clear;
with ADODataSet1.Recordset do
while not Eof do
begin
lpID := Fields['id'].Value;
lpName := Fields['department'].Value;
nLevel := Length(lpID) div ID_DEPT;
pNodes[nLevel] := TreeView1.Items.AddChild(pNodes[nLevel - 1], lpName);
MoveNext;
end;
end;
表department中有:01,财务部;02,销售部;0101,五精仓库;0201,成品仓库;010101,五精一队;我想显示成:
财务部
五精仓库
五精一队
销售部
成品仓库但是显示的结果是:
财务部
五精仓库
五精一队
销售部
成品仓库全部在一级上,请各位大哥帮忙看看,还有就是我在点击显示结果的时候怎么把点击的数据传给一个文本
var
List:TStringList;
Node:TTreeNode;
Index:Integer;
------------------------
cdstree.commandtext:= "SELECT * from TABLE ORDER BY 上级ID,ID "
TreeView.Items.BeginUpdate;
try
TreeView.Items.Clear; List:= TStringList.Create;
try
List.Sorted:= True;
cdsTree.First;
while not cdsTree.Eof do
begin
//如果是顶接点
if cdsTree.FieldByName( "你的上级ID ").AsInteger= 0 then
begin
Node:=TreeView.Items.AddChild(nil, cdsTree.FieldByName(mName).AsString)
end else
begin
Index:= List.IndexOf(cdsTree.FieldByName( "你的上级ID ").AsString);
Node:= TreeView.Items.AddChildFirst(TTreeNode(List.Objects[index]),
cdsTree.FieldByName( "你的字段名称 ").AsString);
end;
List.AddObject(cdsTree.FieldByName( "ID ").AsString, Node);
cdsTree.Next;
end;
finally
List.Free;
cdsTree.Close;
end;
finally
TreeView.Items.EndUpdate;
end;
const
ID_DEPT = 2;
var
nLevel: Integer;
pNodes: array[0..1023] of TTreeNode;
lpID, lpName: string;
begin
ADODataSet1.Close;
ADODataSet1.CommandText := "SELECT * FROM department ORDER BY id ";
ADODataSet1.Open;
pNodes[0] := nil;
TreeView1.Items.Clear;
with ADODataSet1.Recordset do
while not Eof do
begin
lpID := Fields[ "id "].Value;
lpName := Fields[ "department "].Value;
edit1.text:=lpid;
nLevel := Length(trim(edit1.text)) div ID_DEPT;
pNodes[nLevel] := TreeView1.Items.AddChild(pNodes[nLevel - 1], lpName);
MoveNext;
end;
end; 我已经解决了,发给大家,这个可以创建多层次的,代码也少,也易懂