表结构如下:
CREATE TABLE Table1 (
ID INTEGER NOT NULL,
ParentID INTEGER NOT NULL,
Caption VARCHAR(100),
ImageIndex INTEGER,
);我的填充算法如下:
procedure FillChildNodes(ATable:TABSDataSet; ATreeView:TTreeView; AParentNode:TTreeNode);
var
Node: TTreeNode;
begin
Node := nil; ATable.First;
while not ATable.Eof do
begin
Node:=ATreeView.Items.AddChild(AParentNode,ATable.FieldByName('Caption').AsString);
Node.Data:=Pointer(ATable.FieldByName('ID').AsInteger);
Node.ImageIndex := ATable.FieldByName('ImageIndex').AsInteger;
ATable.Next;
end; while Node <> nil do
begin
ATable.Filtered := False;
ATable.Filter := 'ParentID = ' + IntToStr(Integer(Node.Data));
ATable.Filtered := True;
if not ATable.IsEmpty then
FillChildNodes(ATable, ATreeView, Node);
Node := Node.getPrevSibling;
end;
end;
//------------------------------------------
Table1.TableName := 'Table1';
Table1.Open;
Table1.Filtered := False;
Table1.Filter := 'ParentID = 0';//ParentID=0表示第一级节点
Table1.Filtered := True;
myTree.Items.BeginUpdate; //myTree要填充的TreeView控件
try
FillChildNodes(Table1, myTree, nil);
finally
myTree.Items.EndUpdate;
end;
CREATE TABLE Table1 (
ID INTEGER NOT NULL,
ParentID INTEGER NOT NULL,
Caption VARCHAR(100),
ImageIndex INTEGER,
);我的填充算法如下:
procedure FillChildNodes(ATable:TABSDataSet; ATreeView:TTreeView; AParentNode:TTreeNode);
var
Node: TTreeNode;
begin
Node := nil; ATable.First;
while not ATable.Eof do
begin
Node:=ATreeView.Items.AddChild(AParentNode,ATable.FieldByName('Caption').AsString);
Node.Data:=Pointer(ATable.FieldByName('ID').AsInteger);
Node.ImageIndex := ATable.FieldByName('ImageIndex').AsInteger;
ATable.Next;
end; while Node <> nil do
begin
ATable.Filtered := False;
ATable.Filter := 'ParentID = ' + IntToStr(Integer(Node.Data));
ATable.Filtered := True;
if not ATable.IsEmpty then
FillChildNodes(ATable, ATreeView, Node);
Node := Node.getPrevSibling;
end;
end;
//------------------------------------------
Table1.TableName := 'Table1';
Table1.Open;
Table1.Filtered := False;
Table1.Filter := 'ParentID = 0';//ParentID=0表示第一级节点
Table1.Filtered := True;
myTree.Items.BeginUpdate; //myTree要填充的TreeView控件
try
FillChildNodes(Table1, myTree, nil);
finally
myTree.Items.EndUpdate;
end;
解决方案 »
- 如何把过滤的结果集赋值给DataSet
- 请问 在窗体中插入一个表格用那个组件?
- 高手帮忙啊~~~~~~为什么老是弹出用户名错误, gotokey出问题吗!!!
- 在TDXDBGRID中怎么显示两个表的内容。标题行是一个X表,内容列是另一个Y表,急,回答给100分
- 在delphi6中,自动代码完成可以使用ctrl+空格的方式,在delphi7中怎么就不行了?
- 如何将数据库的数据转换成*.doc文件?
- 在XP下怎样使一个受限用户完全控制某个文件夹?急呀~~!~~~~~~
- ???如何刷新FileListBox的内容,我用FileListBox.Refresh怎么没反应啊???
- delphi Indy新手问题
- 我做的恢复误删除文件的软件,大家帮忙测试一下!
- 用ADO连数据库为何DBCombobox设置DataField后运行出错?
- 求用表数据填充TreeView的最佳算法(在线等待)!
然后一条条寻找父节点为ParentID的节点作为其子节点
这样不太好的,有时用户调整了节点的关系,ParentID的顺序就没有意义了。
应该没没问题吧
或者用DBTree控件更快更简单