数据库表TreeView树的快速生成
根据数据表的内容生成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;
数据库表TreeView树的快速生成相关推荐
- python亿级mysql数据库导出_Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法...
本文实例讲述了python实现将MySQL数据库表中的数据导出生成csv格式文件的方法.分享给大家供大家参考,具体如下: #!/usr/bin/env python # -*- coding:utf- ...
- Java实现生成数据库表结构文档(生成工具screw的使用)
目录 一.screw介绍 1.简介 2.特点 3.文档格式 二.生成方式 2.1 方式1:使用 Java 代码 2.1.1 引入依赖 2.1.2 编写代码 2.1.3 测试 2.2 方式2:使用 Sp ...
- oracle命令清空数据库表,Oracle中如何快速删除数据字典管理的表空间-数据库专栏,ORACLE...
我的测试环境:hp rp7410主机,hp-unix11.11 os,oracle8.1.7.4的数据库,一个有90张表大约100g的测试表空间tbs_test. 问题的提出:oracle中在使用dr ...
- python批量创建数据库表_使用 Pymysql 批量生成数据表
下笔原因 按照每个网页生成对应的数据表,结构一样, 但表名不同. 那么用 pymysql 批量生成应该比较容易, Google下,在stackoverflow和官方文档都没有找到完整示例, 自己动手吧 ...
- php表单生成器实验报告,PHP表单生成器,快速生成现代化的form表单,快速上手
form-builder PHP表单生成器,快速生成现代化的form表单.包含复选框.单选框.输入框.下拉选择框等元素以及省市区三级联动.时间选择.日期选择.颜色选择.树型.文件/图片上传等功能. 本 ...
- 根据Excel表的配置,自动生成数据库表的CRUD以及相关的Winform列表和编辑界面程序文件,接上篇(自动生成实体类)
本文仍然属于一个自动生成代码工具. 上一篇我们根据数据库表的信息,自动生成实体类.cs文件.这次我们根据Excel配置,直接生成CRUD以及窗体列表和编辑界面相关的程序源文件. 通过自动生成代码,这样 ...
- 数据库界的Swagger:一键生成数据库文档!你不了解一下?
对于API的文档,我们有Swagger等工具来自动生成了.但有有一类文档还是常常困扰着我们,那就是数据库表结构的文档.相信很多同学都有过手写数据库表结构文档 的经历吧?常规操作就是一通无脑的 CV 大 ...
- DataFactory快速生成测试数据
1.DataFactory配置连接MySQL 1)下载安装myodbc32驱动 2)DataFactory-->New-->ODBC-->DBC Administrator--> ...
- 没有form的表单验证_PHP动态生成表单,内置17种常用组件并且支持表单验证!
FormBuilder 是一个开源的PHP表单生成器,可以快速生成现代化的form表单.还可以配合开源项目 xaboy/form-create 生成任何 Vue 组件 github | 文档 环境需求 ...
最新文章
- 工厂方法(Factory Method)模式
- 【中文】Joomla1.7扩展介绍之JoomSEF Free (搜索引擎友好)
- ZooKeeper:win7上安装单机及伪分布式安装
- 伸展树 Splay 模板
- 苹果春季发布会:库克绝不玩别人玩剩下的!
- JavaScript词法作用域和动态作用域
- 更换pip源,解决pip install安装包慢的问题
- 物联网卡在建筑行业的应用结果
- C#判断检测网络是否连接
- eigrp 负载均衡和非负载均衡实验
- plotting and saving over line in paraView
- angular 点菜_Vue2与Angular5实现无人点餐、无人收银系统项目实战视频教程【组合套餐】(大地)...
- FFMPEG+SDL播放音频流
- 交换机与路由器与猫的区别与联系
- 艾永亮:为什么良品铺子能在同质化的零食市场中突出重围?
- 播放器地址抓取 php,PHP实现使用优酷土豆视频地址获取swf播放器分享地址
- HEVC解码器HM源码阅读(二)解码器中类的介绍
- 我在著名的外企工作多年
- Virsh 虚拟机迁移
- 【论文理解】理解yolov3的anchor、置信度和类别概率
热门文章
- openoffice php com,nginx+php+openOffice
- java怎样实现数据库 选择列属性的select查询??_除了不要 SELECT * ,使用数据库还应知道的11个技巧!...
- html中怎么修改黑体,css怎样设置黑体?
- 20200225:最小路径和(leetcode64)
- 简述python3默认使用的编码标准_Python3.X默认使用的编码是
- java手写map,手写 RxJava ---- map 操作符
- mysql中毫秒的保存类型
- 如果降低sbus总线的传输速率/帧率,sbus怎样转UART,sbus接到4G
- LINUX/UNIX vi全屏幕编辑器
- 微软小冰学会画画了,堪称复活近代画家,还能命题作画