delphi - 仅从父信息构建 TreeView
问题描述
我正在尝试建造一棵树。对于每个元素,我拥有的唯一信息是他所指的父级的 id。
我有三个不同的记录:
Type TRecord1 = Record
ID : Integer;
Name : String255;
Res : Array[1..500] Of Byte;
End;
//------------------------------------------------------------------------------
Type TRecord2 = Record
ID : Integer;
Parents : Array [0..4] of Integer;
Customer : String100;
Res : Array[1..500] Of Byte;
End;
//------------------------------------------------------------------------------
Type TRecord3 = Record
ID : Integer;
Parents : Array [0..4] of Integer;
Datas : String20;
Res : Array[1..500] Of Byte;
End;
对于数据存储:我有一个文件用于一种记录,它存储该记录的所有数据
Record1 始终没有父级。Record2 和 Record3 始终至少有 1 个父级(最多 5 个 => 父级数组)
Record2 可以是 Record2 的父节点,等等......它们之间没有层次结构,除了 Record1 始终是根节点。
如何有效地构建相关的树视图?
我可以首先构建 Record1 节点,这将是树的第一个节点。然后对于每个这个节点,我必须找到与这个节点相关联的 Record3 的 Record2,等等,等等......这似乎会花费太多时间。
任何想法从另一种方式创建树?
目前,我将 TreeView 保存在文本文件中,并在节点和相关记录之间建立了链接。但是我想从数据中创建 TreeView 而不是在一侧有一个 TreeView 而在另一侧有一个数据
解决方案
我猜您的记录项的 ID 是唯一的,因此可能会逐渐分配给每条记录。这意味着旧记录的 ID 号低于新记录。
因此,您可以先按 ID 对所有记录进行排序,然后从 ID 最低的记录开始,向 ID 最高的记录进行。
现在,如果您的所有记录都可能只有一个父记录,那么这肯定会假设您始终在其任何子记录之前创建父记录。
但是,由于您的记录可能有多个父项,因此您可能会遇到当前记录中的一个父项引用您尚未添加到树中的另一条记录的情况。
我猜您可以通过分两次执行此操作来避免这种情况,在第一次通过时,您尝试将当前记录的节点相对于第一个父节点定位。然后在第二遍中,为其余的父母添加连接。
推荐阅读
- android - 长按工具栏菜单图标显示灰色文本背景
- sql-server - 从 linux 上 docker 容器上的 .net 应用程序连接到 windows 机器上的 sql server
- python - 根据不同类型的值派生日期列
- android - 用于多测验的 Kotlin Toast
- json - 将对象与 json 模式进行比较,如果未设置,则用模式默认值填充它
- haskell - lifo 队列作为光学器件
- sql - ORA-01858: 在简单的选择查询中需要数字的地方发现了一个非数字字符
- javascript - 唯一地设置元素上的属性
- microsoft-edge - 传递边缘浏览器的 processId (idAttachTo) 时,AttachThreadInput 返回 0
- macos - 如何为 HEIC 图像添加平铺支持