浅析TreeView绑定效率

虚幻引擎Pak文件解析与UnrealPakViewer工具实战指南 在游戏开发与资源管理中,资源打包与解析是核心技术环节。Pak文件作为虚幻引擎的资源容器格式,采用自定义的二进制结构,包含文件数据块、索引区及Mount Point记录。理解其解析原理,需要掌握二进制文件读取、偏移量定位及压缩算法处理等底层技术。这种技术对于优化游戏包体、分析资源依赖、进行Mod开发或逆向工程具有重要价值。在实际应用场景中,开发者常需快速透视Pak内部结构、定位冗余资源或提取特定内容。本文聚焦的UnrealPakViewer工具,正是为解决这些痛点而生的可视化解决方案,它通过图形界面实现目录树 阅读详情

浅析TreeView绑定效率

 

在WinForm或WebFrom中都会使用到TreeView控件来显示组织机构信息、目录结构信息及其他信息,不可避免的要与数据库连接,动态的生成树,有的是两节树,有的是三节树,然而随着数据库数据的不断增加,绑定TreeView的效率就成为了不可忽视的问题。如何高效的绑定TreeView就成为了开发人员一个比较关心的问题?日前,我之前参与的项目也使用到了TreeView,也同样的遇到了这个问题。下面就来分析我的解决方案,供大家参考,不足之处敬请原谅!

 

设计数据库:

数据表:工程信息表(ProjectInfo)、建筑物信息表(BuildingInfo)、点表(Point)

具体字段参考实际表

 

 

WinForm项目

开发环境:VS2008 + Access

机器配置:2G内存,2.31GHz,AMD Athlon(tm)64 X2 Dual Core Processor 4400+

测试数据:工程(30)、建筑物(每个工程30个建筑物)、点(1个)

 

思路
第一种思路:

1、  先从数据库中查询所有工程信息,依次添加工程节点;

2、  根据绑定的工程节点查询所有对应建筑物信息,依次添加建筑物节点;

3、  根据绑定的建筑物节点查询所有对应点信息,依次添加点节点

 

第一种思路不是本文具体讨论的思路,不做详细的解释。利用以上测试数据绑定TreeView所花时间为10s左右。枪毙第一种思路,数据量越大所花时间越多,这是不能接受的。

 

第二种思路:

1、先从数据库中查询所有工程信息,依次添加工程节点,绑定TreeView;

2、在TreeView上点击选择工程节点,根据工程节点依次绑定建筑物节点;

3、待建筑物节点绑定完毕后,再点击选择建筑物节点,根据建筑物节点依次绑定点节点;

 

第二种思路绑定TreeView的时间的确减少不少,但是这种思路仅供大家参考,本人在实际项目开发过程中根据业务需求没有使用这种方法。所以也不做具体的解释。

 

经分析利用第一中思路之所以所花时间这么长,是因为对数据库的操作太过频繁,连接数据库、打开数据库、执行命令次数太多(900次)。基于这一点,我和公司的同事讨论了下,我们最后的方案是:用空间换时间。具体怎么换请参考第三种思路:

 

第三种思路:

1、  依次查询出所有的工程信息、建筑物信息、点信息;

2、  建立数据集(DataSet)添加信息结果表(proTable)、建筑物信息结果表(bulTable)、点信息结果表(potTable);

3、  建立关系(DataRelation)

经过以上三步之后我们所需要的所有数据都装载在DataSet集合中,根据业务需求直接从DataSet取数据,减少操作数据库的次数(3次)

4、  依次绑定绑定工程节点;

5、  根据工程结果表与建筑物结果表的关系,依次绑定工程所对应的建筑物信息;

6、  根据建筑物结果表与点结果表的关系,依次绑定建筑物所对应的点信息;

 

核心步骤大致是这几个步骤,同样的利用上面的测试数据进行测试,绑定整个树的时间能控制在1s以内(大约是0.4s)。为什么会这样呢,因为这样的思路我们只对数据库一次性操作了3次,我们所需的绑定数据都是从DataSet中直接存储,再也不直接操作数据库了,大家可能就有疑惑了,具体的这么直接操作DataSet呢,这不急我们第三种思路的5、6两步不是为结果表建立了关系吗,我们直接通过关系(好比数据库中的主外键)来操作DataSet,其实我的理解是这样操作与我们第一种思路操作数据的原理是一样,只不过一个是在数据库,而另一个则是DataSet,我们直接在程序中操作DataSet。但是有个问题是这样的思路增加内存的消耗。这样,程序就实现了空间换时间的效果。

 

Code:

 

//为绑定树形控件提供数据

private DataSet GetTableInfo()

{

     DataTable proTable = Null;

     DataTable bulTable = Null;

     DataTable potTable = Null;

        //准备数据集

     DataSet ds = new DataSet();

     //准备SQL语句

     string str_sql1 = "select * from ProjectInfo ";

     string str_sql1 = "select * from BuildingInfo ";

     string str_sql1 = "select * from Point ";

 

     //执行命令返回数据表

     proTable = OledbHelper.ExecuteDataTable(Unlity.OledbHelper.str_connectionString, CommandType.Text, str_sql1, null);

     proTable.TableName = "pro";        //为了防止dataset里存在相同的表

     bulTable = OledbHelper.ExecuteDataTable(Unlity.OledbHelper.str_connectionString, CommandType.Text, str_sql2, null);

     bulTable .TableName = "bul";        //为了防止dataset里存在相同的表

     potTable = OledbHelper.ExecuteDataTable(Unlity.OledbHelper.str_connectionString, CommandType.Text, str_sql3, null);

     potTable.TableName = "pot";        //为了防止dataset里存在相同的表

        

     //添加结果表到ds

        ds.Tables. AddRange (new Table[]{pro_table.Copy(),table1.Copy(),table2.Copy() });

 

     //为结果表建立关系工程与建筑物关系

DataRelation pro_bul=new DataRelation(“proBuilding”,ds.Tables[“pro”].Columns[“project_Id”]

,ds.Tables[“bul”].Columns[“project_id”],false);

       //false:代表关系不创建约束

       //为结果表建立关系建筑物与点关系

DataRelation bul_pot=new DataRelation(“bulPoint”,ds.Tables[“bul”].Columns[“buling_Id”]

,ds.Tables[“pot”].Columns[“buling_Id”],false);

 

       //添加关系到ds

       ds.Relations.AddRange(new DataRelation[]{pro_bul , bul_pot);

 

       //返回ds

    retrun ds;

}

 

//绑定TreeView

Private void DataBindTv()

{

if (tv.Nodes.Count > 0)

     {

         tv.Nodes.Clear();

     }

 

DataSet ds = GetTableInfo();

TreeNode proNode,bulNode,potNode;

If(ds.Tables[pro].Rows.Count > 0)

{

  //绑定工程节点

  proNode = new TreeNode();

  foreach(DataRow proDr in ds.Tables[pro].Rows.)

   {

       If(proDr.ItemArray[0].ToString().Trim()!=””)

       {

                 //添加工程节点的text

           pro_node.Text = pro_dr.ItemArray[2].ToString().Trim();

//添加工程节点的tag

pro_node.Tag = pro_dr.ItemArray[0].ToString().Trim();  

//添加工程节点

tv.Nodes.Add(pro_node); 

 

//根据工程与建筑物对应关系查询出工程对应的所有建筑物的信息foreach(DataRow bulDr in proDr.GetChildRows(“proBuilding”))

{

    //判断建筑物编号不为空

       If(bulDr.ItemArray[0].ToString().Trim()!=””)

    {

              bulNode = new TreeNode();

        //建筑物节点文本

        bulNode.Text = bulDr.ItemArray[1].ToString().Trim();

              //建筑物节点tag

              bulNode.Tag = bulDr.ItemArray[0].ToString().Trim();

              //为工程添加建筑物节点

              proNode.Nodes.Add(bulNode);

              //根据建筑物与观测点对应的关系查询出建筑物对应所有的观测点信息

              foreach(DataRow potDr in bulDr.GetChildRows(“bulPoint”))

{

       if(potDr.ItemArray[0].ToString().Trim() !=””)

       {

              potNode = new TreeNode();

              //点节点文本

              potNode.Text = potDr.ItemArray[0].ToString().Trim();

              //点节点Tag

              proNode.Tag = potDr.ItemArray[1].ToString().Trim();

              bulNode.Nodes.Add(potNode);

       }

}

    }

}

         }

  }

}

 

备注:程序中ItemArray[0]  ItemArray[1]的0和1代表是相应的列的值(一个是名称,另一个是编号)

 

纵观整段代码:核心代码只有几段

第一:数据结果表建立关系

 

第二:根据关系查询关系所对应的结果信息

 

核心代码基本就这么多,大家可以根据自己的需要来优化代码,如果大家有什么更好的方法大家可以一起讨论讨论

合并数组与非合并数组——SystemVerilog 合并型数组(packed): — 合并型数组可以实现连续的存储,赋值时不需要用 '{ }。 //合并型数组 bit [3] [7:0] b_pack // 表示3行 x 8列的数组,[3]是高维度(高维度),[7:0]是低维度(第一维) 数组中,数据排列为{b_pack[3],b_pack[2],b_pack[1],b_pack[0]},其中每个b_pack为8个bit; bit是二值逻辑,每位bit只占据1位。故24位bit只占据一个word(一般一个word为32bit)的存储空间 阅读详情

相关推荐

DySAT+: Enhancing Dynamic Graph Representation Learning with Multi-Head Self-Attention and Temporal-

本文深入探讨了DySAT+模型在动态图表示学习中的创新应用,通过多头时空注意力机制和层级信息融合策略,有效解决了动态图数据中的时间维度信息捕捉和结构演变动态适应问题。该模型在社交网络异常检测和金融交易网络分析等场景中表现出色,显著提升了预测准确率和响应速度。

weixin_29035405的博客 335

解决treeview节点数据过多加载过慢

treeview子节点有4000多个,导致展开树时需要加载20秒以上,用户体验极差。

Z_W_H_的博客 1131

告别CAPL编程!用Matlab/Simulink+CANoe实现复杂ECU仿真的5个技巧

本文介绍了如何利用Matlab/Simulink与CANoe进行联合仿真,以替代复杂的CAPL编程,高效实现复杂ECU仿真。文章分享了5个核心技巧,涵盖信号映射、模型编译集成、实时参数调整、性能优化及数据分析,帮助算法工程师构建稳定强大的仿真环境,显著提升开发与测试效率。

rgv234567的博客 296

winform中treeview的一些使用心得

1.使用treeview往往会使得加载过慢,可以使用分次加载的方法,第一次只加载第一层目录,以后点击在加载。2.Node的selectImageIndex属性默认为0号图片,在加载结点时要将其改变,不然会有问题。

zyizyizyi的专栏 1959

拯救者R7000用户实测:用华为电脑管家11.0版搞定MatePad Pro多屏协同(附驱动与显卡避坑指南)

本文详细介绍了如何在非华为笔记本联想拯救者R7000上安装华为电脑管家11.0版,实现与MatePad Pro的多屏协同功能。从驱动优化到显卡配置,提供了全面的避坑指南和实用技巧,帮助用户解决连接失败等常见问题,提升跨设备生产力体验。

weixin_30788619的博客 398

Ubuntu安装pytorch3d的最便捷方法【原创】

Ubuntu安装pytorch3d的最便捷方法

qq_54900679的博客 2924

asp.net中TreeView的大数据加载速度优化

由于数据量太大,加载树时间很长,所以进行了优化 前台 .aspx <asp:Panel ID="Panel2" runat="server" Height="600px" ScrollBars="Auto"> <asp:TreeView ID="TreeView1" runat="server&

weixin_34178244的博客 338

FFmpeg + Qt 实现摄像头采集与 MP3 背景音乐 RTSP 推流

在直播或视频监控场景中,我们经常需要将摄像头画面与背景音乐混合后推送到 RTSP 服务器。本文将详细介绍如何使用Qt框架结合摄像头实时采集(Windows 下使用dshow,Linux 使用v4l2视频预览(显示为 QImage)视频 H.264 编码 + RTSP 推流从 MP3 文件读取音频,重采样为 AAC 编码并推流循环播放音频文件解决中文文件路径打开失败的问题文章将剖析每个技术环节的关键代码,并给出完整的类实现。

weixin_45397344的博客 504

浅析动态添加、删除、修改TreeView节点

 接着上一篇浅析TreeView绑定效率>>继续讲讲TreeView。在实际项目过程中,TreeView往往会动态的绑定数据,操作界面一旦新添加、修改、删除节点数据,在TreeView中要时时反映新添、被修改、被删除的节点,有的人会采取的方式是直接把树形控件重新加载一遍,这样是可以解决问题,但是随着数据量的增加,重新加载的付出代价很大!有没有好的方法只"刷新"单独新添加的、修改的、删除的节点,

WTPMCheng的专栏 7943

第八届传智杯WPS智能办公能力挑战赛练习题库

本文是关于WPS Office软件操作知识的选择题汇总,内容涵盖WPS文字、表格和演示三大组件的常用功能。主要包括:云文档协同编辑、文本框插入、幻灯片打印设置、数据排序与筛选、函数应用(如SUMIF、COUNT)、动画效果设置、格式刷使用、页眉页脚设置、单元格引用类型等基础操作要点。同时涉及计算机基础概念如二进制、ROM存储器等。题目以单选和多选形式呈现,附带详细答案解析,全面检验用户对WPS办公软件的功能掌握程度和实际操作能力,适用于办公软件技能培训和水平测试。

qq_73044452的博客 1432

11、基于多阵列电极的表面肌电信号运动估计

本文介绍了一种基于多阵列电极的表面肌电信号运动估计技术,旨在实现对手腕和手指运动的高精度估计,解决传统人机接口在操控多自由度机器人时的局限性。通过多阵列电极系统采集前臂肌肉活动信号,结合独立成分分析(ICA)和非负矩阵分解(NMF)等信号处理方法,提取肌肉协同作用,进而生成运动指令以控制机器人或假肢手。文章对比了多阵列电极与传统电极的优势,展示了运动估计算法的整体流程,并以假肢手控制为例说明其实际应用。最后探讨了该技术在测量精度、应用拓展、智能化和便携化等方面的未来发展方向。该技术为假肢控制、康复训练和人机

ik678901234的博客 87

asp.net中TreeView异步延迟加载

   在使用TreeView控件的时候,如果数据量太大,这个TreeView控件加载会很慢,有时甚至加载失败,为了更好的使用TreeView控件加载大量的数据,采用异步延迟加载TreeView。在TreeView每个结点的前面都有个"+"号,点击这个”+“号触发的事件是OnTreeNodeExpanded="TreeView1_TreeNodeExpanded" ,在刚开始加载TreeView的时候,如果结点下面还有子节点的话,只加载一个子节点;在点击”+“号,触发OnTreeNodeExpanded事件的

wl_ldy的专栏 5169

CATIA文件的网页预览方案

CATIA是工业设计中广泛使用的专业软件,产出`.CATPart`或 `.CATProduct`等文件类型,当资产数量较大时,我们希望快捷预览这些文件,就有了`CATPart`文件网页预览的需求 但我们知道,网页上无法直接渲染`CATPart`这种复杂的文件, CATIA生成的文件(如 `CATPart` 和 `CATProduct`)不仅包含三维几何信息(例如点、线和曲面),还涵盖了丰富的元数据与专业设计特征。 那有没有办法,能实现CATIA文件在网页上的便捷预览?

weixin_44211633的博客 1449

关于C# winform treeview 的两个问题(点击空白处的时间响应和复选框选择问题)

这段时间正在研究这个控件,摸出了一些东西,给大家看看。1:点击空白处的问题。处理鼠标Up事件 private void Tree_MouseUp(object sender, MouseEventArgs e){            Point p = new Point(e.X, e.Y);            TreeNode selectNode = AuthTree.GetNode

alalals的专栏 2403

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

如何快速开发树形列表和分页查询整合的WInform程序界面

我在做Winform界面的时候,一般都是统一化处理,界面顶部放置一些字段条件供查询,下面就是分页查询列表,展示相关的数据。但有时候碰到一些表字段内容分类比较多,有一些特别重要,如果放在一个树形列表来进行快速分类查询,用户体验应该更好。本篇随笔主要介绍如何快速实现树形列表和分页查询整合的WInform程序界面。 1、标准WInform列表界面 标准的查询条件+列表数据展示的WInform界面如下...

weixin_30419799的博客 287

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

TreeView数据的延迟加载

  使用TreeView时,很多人都应该遇到过当数据项特别多的时候,界面加载很慢的情况,用户体验很差,为了解决这个问题,这里我想到使用延时加载子项的方法去实现,即:我们显示的数据项,用户不一定所有项都很用到,初始化时,我们只加载根节点数据显示在界面,当展开根节点时,只加载根节点子项的数据,子项的子项数据不加载,依次类推,这样就解决了一次加载很多数据,界面初始化需要很长时间的问题。   最近在看X...

weixin_34192732的博客 633

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WPF TreeView叶子太多时显示很慢的解决办法

在WPF中使用DataGrid时当数据过多时

porenasckx的专栏 6868

winform TreeView的一些用法以及异步加载

今天,主要弄了一下对于树型控件的一些方法,以及异步加载。参考: http://www.cnblogs.com/greatverve/archive/2012/03/23/winform-treeview.html 下面是TreeView的一些用法 private void BindTreeView() { treeView1.LabelEdit = false;//不可编...

weixin_33832340的博客 230

TreeView添加节点应该使用Node.Add() 还是 Node.AddRange()

给树加5000个节点,有两种方法,不知道那种性能更高。第一种 是单个单个的Add.TreeView treeView = new TreeView(); for (int i = 0; i < 5000;i++ ) { TreeNode node = new Tree...

weixin_30925411的博客 352

[C#]TreeView操作汇总

用到树,自然而然要想到递归 下面的例子是带CheckBox的TreeView,根据Datasource中的isvisible字段来确定是否勾选 加载,构造树形结构: private void bindTree() { TreeNode RootNode = new TreeNode("总节点"); t

流云追风 6924

关于TreeView使用Node.Add() 还是 Node.AddRange()添加节点的答案

上次提了个 TreeView添加节点使用Node.Add() 还是 Node.AddRange() 的问题今天自己做了个不是很精确的测试。。 Code1privatevoidbutton3_Click(objectsender,EventArgse)2{3//清空树节点。4treeView1.Node...

weixin_30765319的博客 789
上一篇: 你要做鸡头,还是凤尾?
下一篇: 浅析动态添加、删除、修改TreeView节点
WTPMCheng
博客等级 码龄18年 51粉丝 19原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值