数据库表TreeView树的快速生成
来源:互联网 发布:淘宝需要交保证金吗 编辑:程序博客网 时间:2024/06/13 03:34
根据数据表的内容生成TreeView树状结构,通常的做法就是从顶级开始,然后逐项递归查询遍历生成。这种方法在实现上容易做到,也很容易想到,但是效率比较低,因为数据库的检索(SQL语句需要解释执行,而且是对数据库文件进行操作)还是比较耗时的,尤其是树的层次较多,节点较多的情况。这里我要介绍的方法是以空间换取时间,只进行一次数据库检索,提取出全部数据,然后一次生成TreeView树状结构。通过SQL语句,让返回的记录按照父节点ID、节点ID进行排序,这样保证每次当前要添加的节点记录的父节点都已经添加到了TreeView树中,剩下的工作就是如何在TreeView树中找到父节点。这里我采用了一个排序的TStringList列表,通过排序列表采用二分查找的快速性能,就能够很快地查找到当前要添加节点的父节点,从而插入到TreeView树的正确位置。
源代码如下(假定数据表名称为FTree,字段有ID, ParentID, Name):
procedure MakeTree(Query: TQuery; TreeView: TTreeView);
var
List: TStringList;
Node: TTreeNode;
Index: Integer;
begin
TreeView.Items.BeginUpdate;
try
TreeView.Items.Clear;
List := TStringList.Create;
try
List.Sorted := True;
while not Query.Eof do
begin
if Query.FieldByName('ParentID').AsInteger = 0 then { ParentID=0,顶层节点 }
Node := TreeView.Items.AddChild(nil, Query.FieldByName('Name').AsString)
else
begin
Index := List.IndexOf(Query.FieldByName('ParentID').AsString);
Node := TreeView.Items.AddChild(TTreeNode(List.Objects[Index]),
Query.FieldByName('Name').AsString);
end;
List.AddObject(Query.FieldByName('ID').AsString, Node);
Query.Next;
end;
finally
List.Free;
end;
finally
TreeView.Items.EndUpdate;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
T: DWORD;
begin
T := GetTickCount;
Query1.SQL.Text := 'SELECT * FROM FTree ORDER BY ParentID, ID';
Query1.Open;
MakeTree(Query1, TreeView1);
Label1.Caption := Format('MakeTree所用时间: %d ms', [GetTickCount - T]);
end;
源代码如下(假定数据表名称为FTree,字段有ID, ParentID, Name):
procedure MakeTree(Query: TQuery; TreeView: TTreeView);
var
List: TStringList;
Node: TTreeNode;
Index: Integer;
begin
TreeView.Items.BeginUpdate;
try
TreeView.Items.Clear;
List := TStringList.Create;
try
List.Sorted := True;
while not Query.Eof do
begin
if Query.FieldByName('ParentID').AsInteger = 0 then { ParentID=0,顶层节点 }
Node := TreeView.Items.AddChild(nil, Query.FieldByName('Name').AsString)
else
begin
Index := List.IndexOf(Query.FieldByName('ParentID').AsString);
Node := TreeView.Items.AddChild(TTreeNode(List.Objects[Index]),
Query.FieldByName('Name').AsString);
end;
List.AddObject(Query.FieldByName('ID').AsString, Node);
Query.Next;
end;
finally
List.Free;
end;
finally
TreeView.Items.EndUpdate;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
T: DWORD;
begin
T := GetTickCount;
Query1.SQL.Text := 'SELECT * FROM FTree ORDER BY ParentID, ID';
Query1.Open;
MakeTree(Query1, TreeView1);
Label1.Caption := Format('MakeTree所用时间: %d ms', [GetTickCount - T]);
end;
- 数据库表TreeView树的快速生成
- 根据数据库表生成TREEVIEW
- 根据数据库结构生成TreeView
- 根据数据库结构生成TreeView
- 利用.net 2.0中的TreeView控件与数据库绑定,生成无限级的树目录
- C# TreeView生成树的方法
- TreeView的用法,生成文件目录树
- TreeView的生成
- PB 使用Treeview调用数据库生成多级树
- .net的TreeView控件绑定数据库表建立树架构
- TreeView递归生成树(普通加载和快速加载、最快的是点一级加载子节点)
- TreeView递归生成树
- TreeView (树视图)遍历数据库的方法
- TreeView (树视图)遍历数据库的方法
- treeview 数据库的结合
- 快速清除TreeView的内容
- [C#]读取数据库,动态生成TreeView[递归]
- 编写Powerdesigner脚本,快速生成数据库表
- TPM工作流程设计器的编写
- delphi TREEVIEW的简单使用
- Maximo与TPM的集成
- php5-static的问题
- el表达式不起作用的解决方案
- 数据库表TreeView树的快速生成
- zend framework 初次尝试
- 模糊数学(Fuzzy mathematics)
- Select语句介绍
- 理解矩阵[转]
- QQ相册加密?!
- 获取CPU的ID号
- 下一步需要努力的方向
- 众