根据数据库结构生成RzCheckTree
1 2 3 | 现在大多数的方法是采用递归,但这种操作会频繁的去 select 数据库,降低了执行效率,稍微改动一些,效果会好不少,这里介绍一种方法,即一次性 select 出所有数据,然后按照ParentID排序,逐条添加到TreeView,添加前,先遍历TreeView,查找他的上一级节点,遍历Treeview可比 select 数据快啊,下面看代码: 数据表结构,最顶级parentid值我用的是-1,大家也可以用其他值,但要保证最顶级parentid值最小,层次越深, |
procedure TUIOperate.FillTree(RzCheckTree: TRzCheckTree); var findq: TADOQuery; node: TTreeNode; //这个方法是根据记录的id字段值,查找RzCheckTree上的父节点 function FindParentNode(id:Integer):TTreeNode; var i:Integer; begin Result := nil; for i := 0 to RzCheckTree.Items.Count - 1 do begin //比较Node的Data值和记录的id值 if Integer(RzCheckTree.Items[i].Data) = id then begin Result := RzCheckTree.Items[i]; Break; end; end; end; begin findq := TADOQuery.Create(nil); findq.Connection := controler.DataConnect.Connection; //这里的Connection指向你的数据连接 try RzCheckTree.Items.BeginUpdate; RzCheckTree.Items.Clear; //选出所有记录,并按parentid排序,这样可以保证先添加顶级节点,在下级记录添加时,总能找到父节点 findq.SQL.Text := 'SELECT * FROM [Catalog] order by parentid,id'; findq.Open; while not findq.Eof do begin //如果是最顶级,直接添加到RzCheckTree if findq.FieldByName('parentid').AsInteger = -1 then //将id值,保存在Node的Data中,以便查找用 RzCheckTree.Items.AddObject(nil,findq.FieldByName('CatalogName').AsString,Pointer(findq.FieldByName('id').AsInteger)) else begin //查找上级节点 node := FindParentNode(findq.FieldByName('parentid').AsInteger); if node <> nil then RzCheckTree.Items.AddChildObject(node,findq.FieldByName('CatalogName').AsString,Pointer(findq.FieldByName('id').AsInteger)); end; findq.Next; end; finally findq.Free; RzCheckTree.Items.EndUpdate; end; end;
本文来自博客园,作者:liessay,转载请注明原文链接:https://www.cnblogs.com/liessay/p/7771980.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?