数据库表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;

本文转自 byteh 51CTO博客,原文链接:http://blog.51cto.com/byteh/53665,如需转载请自行联系原作者

数据库表TreeView树的快速生成相关推荐

  1. python亿级mysql数据库导出_Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法...

    本文实例讲述了python实现将MySQL数据库表中的数据导出生成csv格式文件的方法.分享给大家供大家参考,具体如下: #!/usr/bin/env python # -*- coding:utf- ...

  2. Java实现生成数据库表结构文档(生成工具screw的使用)

    目录 一.screw介绍 1.简介 2.特点 3.文档格式 二.生成方式 2.1 方式1:使用 Java 代码 2.1.1 引入依赖 2.1.2 编写代码 2.1.3 测试 2.2 方式2:使用 Sp ...

  3. oracle命令清空数据库表,Oracle中如何快速删除数据字典管理的表空间-数据库专栏,ORACLE...

    我的测试环境:hp rp7410主机,hp-unix11.11 os,oracle8.1.7.4的数据库,一个有90张表大约100g的测试表空间tbs_test. 问题的提出:oracle中在使用dr ...

  4. python批量创建数据库表_使用 Pymysql 批量生成数据表

    下笔原因 按照每个网页生成对应的数据表,结构一样, 但表名不同. 那么用 pymysql 批量生成应该比较容易, Google下,在stackoverflow和官方文档都没有找到完整示例, 自己动手吧 ...

  5. php表单生成器实验报告,PHP表单生成器,快速生成现代化的form表单,快速上手

    form-builder PHP表单生成器,快速生成现代化的form表单.包含复选框.单选框.输入框.下拉选择框等元素以及省市区三级联动.时间选择.日期选择.颜色选择.树型.文件/图片上传等功能. 本 ...

  6. 根据Excel表的配置,自动生成数据库表的CRUD以及相关的Winform列表和编辑界面程序文件,接上篇(自动生成实体类)

    本文仍然属于一个自动生成代码工具. 上一篇我们根据数据库表的信息,自动生成实体类.cs文件.这次我们根据Excel配置,直接生成CRUD以及窗体列表和编辑界面相关的程序源文件. 通过自动生成代码,这样 ...

  7. 数据库界的Swagger:一键生成数据库文档!你不了解一下?

    对于API的文档,我们有Swagger等工具来自动生成了.但有有一类文档还是常常困扰着我们,那就是数据库表结构的文档.相信很多同学都有过手写数据库表结构文档 的经历吧?常规操作就是一通无脑的 CV 大 ...

  8. DataFactory快速生成测试数据

    1.DataFactory配置连接MySQL 1)下载安装myodbc32驱动 2)DataFactory-->New-->ODBC-->DBC Administrator--> ...

  9. 没有form的表单验证_PHP动态生成表单,内置17种常用组件并且支持表单验证!

    FormBuilder 是一个开源的PHP表单生成器,可以快速生成现代化的form表单.还可以配合开源项目 xaboy/form-create 生成任何 Vue 组件 github | 文档 环境需求 ...

最新文章

  1. 工厂方法(Factory Method)模式
  2. 【中文】Joomla1.7扩展介绍之JoomSEF Free (搜索引擎友好)
  3. ZooKeeper:win7上安装单机及伪分布式安装
  4. 伸展树 Splay 模板
  5. 苹果春季发布会:库克绝不玩别人玩剩下的!
  6. JavaScript词法作用域和动态作用域
  7. 更换pip源,解决pip install安装包慢的问题
  8. 物联网卡在建筑行业的应用结果
  9. C#判断检测网络是否连接
  10. eigrp 负载均衡和非负载均衡实验
  11. plotting and saving over line in paraView
  12. angular 点菜_Vue2与Angular5实现无人点餐、无人收银系统项目实战视频教程【组合套餐】(大地)...
  13. FFMPEG+SDL播放音频流
  14. 交换机与路由器与猫的区别与联系
  15. 艾永亮:为什么良品铺子能在同质化的零食市场中突出重围?
  16. 播放器地址抓取 php,PHP实现使用优酷土豆视频地址获取swf播放器分享地址
  17. HEVC解码器HM源码阅读(二)解码器中类的介绍
  18. 我在著名的外企工作多年
  19. Virsh 虚拟机迁移
  20. 【论文理解】理解yolov3的anchor、置信度和类别概率

热门文章

  1. openoffice php com,nginx+php+openOffice
  2. java怎样实现数据库 选择列属性的select查询??_除了不要 SELECT * ,使用数据库还应知道的11个技巧!...
  3. html中怎么修改黑体,css怎样设置黑体?
  4. 20200225:最小路径和(leetcode64)
  5. 简述python3默认使用的编码标准_Python3.X默认使用的编码是
  6. java手写map,手写 RxJava ---- map 操作符
  7. mysql中毫秒的保存类型
  8. 如果降低sbus总线的传输速率/帧率,sbus怎样转UART,sbus接到4G
  9. LINUX/UNIX vi全屏幕编辑器
  10. 微软小冰学会画画了,堪称复活近代画家,还能命题作画