Treeview控件是一个很常用的控件,用于展示资源或者组织结构的时候很方便,通常会在系统启动时进行资源的加载和节点目录的初始化,但在资源较多和层级较深的情况下,所有节点加载出来会耗费太多时间,影响体验,而用户并非每次都关注所有节点,于是想到了一个简单的优化方法:节点的延迟加载...

解决思路:

1.在节点加载时,对于下级资源(下级节点)较多的父节点,不必立即添加所有子节点,只需要添加一个无关的空节点,同时显示一个“虚假的”加号(+)效果;

2.待用户双击该父节点或者是点击节点前的+号,展开该节点的时候,立即去刷新和加载该节点的下级资源。

实现代码摘录:

 List<smBusinessDB> allList = smBusinessDB.GetAll();
resourcePad.DataTree.BeginUpdate();
foreach (smBusinessDB businessDB in allList)
{
//根据业务库属性来决定是否延迟加载
bool IsToLoadAll = !businessDB.BusinessDBInfo.IsLazyLoad;
businessDB.LoadSubResource(IsToLoadAll);
resourcePad.AddNode(null, businessDB as IDataResource);
}
resourcePad.DataTree.EndUpdate(); /// <summary>
/// 添加资源节点(自动递归添加下级资源节点)
/// </summary>
/// <param name="parentNode">父节点</param>
/// <param name="resource">资源对象</param>
public void AddNode(TreeNode parentNode, IDataResource resource)
{
if (resource == null)
return;
//在资源节点中不显示图层和图层目录
if (resource is smMapLayerDirectory || resource is smMapLayer || resource is smMapBookmark)
return;
//如果不是成果数据源(过程数据源或历史数据源),也不在面板中显示
if (resource is smDatasource && (resource as smDatasource).IsProdectDatasource == false)
return;
TreeNode oNode = CreateNode(resource);
if (parentNode == null)
this.tvResource.Nodes.Add(oNode);
else
parentNode.Nodes.Add(oNode);
foreach (IDataResource sub in resource.SubResource)
{
AddNode(oNode, sub);
//展开第一级节点
if (parentNode == null)
oNode.Expand();
}
//-------- 如果节点未加载下级资源,则添加空节点,以形成“虚假的”+号效果 ----------
if (resource.SubResource.Count == && resource.IsLoadTopChild == false)
{
TreeNode emptyNode = new TreeNode();
oNode.Nodes.Add(emptyNode);
}
} ....
//节点展开事件(如果下级未加载,则加载并刷新)
this.tvResource.BeforeExpand += new TreeViewCancelEventHandler(tvResource_BeforeExpand); void tvResource_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
TreeNode selNode = e.Node;
IDataResource nodeResource = selNode.Tag as IDataResource;
if (nodeResource == null)
return;
if (!nodeResource.IsLoadTopChild)
{
nodeResource.LoadSubResource(false);
RefreshNode(nodeResource, true);
selNode.Expand();
}
}

问题和待改进之处:

1.这样的解决方法,在本身无下级节点的时候,也会显示一个“虚假的”+号在节点前面,当用户点击的一瞬间才会消失,有点儿被“欺骗”的感觉,哈哈,但似乎也只能这样,否则不符合延迟加载;

2.在特别大的数据量的时候,如果某个节点下的子节点非常多,仍然会使加载和刷新该节点时候系统开销增大,影响流畅性,可考虑使用异步或者多线程。

欢迎补充和拍砖:)

 

Treeview控件的Node节点延迟加载的更多相关文章

  1. 给C#的treeview控件的部分节点添加checkbox

    一.先初始化treeview this.treeView1.CheckBoxes = true; this.treeView1.ShowLines = false; this.treeView1.Dr ...

  2. 循环访问 TreeView 控件的所有节点

    创建测试每个节点的递归过程 . private void PrintRecursive(TreeNode treeNode) { // Print the node. System.Diagnosti ...

  3. ASP.Net中的TreeView控件中对节点的上移和下移操作

    Web中的TreeView中的没有PreNode和NextNode属性. 但它的集合属性中有一个IndexOf属性,从而能够找到它的前一个节点知后一个节点. TreeView中要么只有一个根节点:要么 ...

  4. C# TreeView 控件的综合使用方法

    1.概述 该篇文章开发使用的语言c#,环境visualstudio2010,sql数据库.主要内容包括: (1)treeView控件添加根节点.子节点的基本方法,节点的删除. (2)把treeView ...

  5. TreeView控件使用

    treeView1.SelectedNode = treeView1.Nodes[0];  //选中当前treeview控件的根节点为当前节点添加子节点:  TreeNode tmp; tmp = n ...

  6. WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

    本文转载:http://www.cnblogs.com/umplatform/archive/2012/08/29/2660240.html 在B/S开发中,对TreeView控件要改变当前选中节点的 ...

  7. ASP.NET - TreeView控件,只操作最后一级节点

    效果: 使用母板页进行,左右页面进行跳转. 绑定TreeView控件:http://www.cnblogs.com/KTblog/p/4792302.html 主要功能: 点击节点的时候,只操作最后一 ...

  8. Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼

    Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼标签: winform treeview drawnode Treeview控 ...

  9. Treeview控件如何获得子节点的所有父节点的名称

    Delphi或c++ 的treeview控件,比如一个节点上面有个父节点,这个父节点上面还有一个父节点,如何获得这两个父节点的名字呢?请给出实现代码 先定义一个nodevarnode:TTreeNod ...

随机推荐

  1. C语言socket编程--每日签到

    前几天写了个python的每日签到,你运行还得借助crontab,很是不爽.....正好前几天看了个关于c编写daemon进程,加上自己那点可怜的socket知识,于是我们重操旧页,C语言版的每日签到 ...

  2. poj 3415 Common Substrings 后缀数组+单调栈

    题目链接 题意:求解两个字符串长度 大于等于k的所有相同子串对有多少个,子串可以相同,只要位置不同即可:两个字符串的长度不超过1e5; 如 s1 = "xx" 和 s2 = &qu ...

  3. iOS中为网站添加图标到主屏幕以及增加启动画面

    虽然没有能力开发Native App,但还是可以利用iOS中Safari浏览器的特性小小的折腾一下,做一个伪Web App满足下小小的虚荣心的. 既然是在iOS中的Safari折腾的,那么代码中利用到 ...

  4. kappa 一致性系数计算实例

    kappa系数在遥感分类图像的精度评估方面有重要的应用,因此学会计算kappa系数是必要的 实例1 实例2

  5. itext 落雨 out of membery Memory Optimization

    Memory Optimization If a document deals with a lot of data or large elements, such as images, it is ...

  6. Nagios Apache报Internal Server Error错误的解决方法

    今天配置Nagios的时候遇到了一些麻烦,前面的步骤都一切顺利,nagios运行后,可以看到nagios的主页,但点击左边的菜单时总是提示Internal Server Error错误.错误如下: v ...

  7. ZOJ 3778 Talented Chef

    题目链接 题意 : 这个人需要做n道菜,每道菜Ai步,他可以同时做M道不同的菜的其中一步,问你最少需要多少时间能做完所有的菜. 思路 : 这个题比赛的时候禁锢思路了,根本没想出来,就是当M > ...

  8. linux更改shell

    1.查看机器安装了哪些shell? 有两种方法可以查看. 第一种: 使用env命令查看环境变量里面的shell信息第二种: $ cat /etc/shells 2.查看当前正在使用的shell是哪个? ...

  9. codeforces #309 div1 A

    先说我的解法吧 首先设f(i,j)表示选了前i个球且j种颜色都已经选完了的方案数 这显然是可以随便转移的 #include<cstdio> #include<cstring> ...

  10. Let's go! (Ubuntu下搭建Go语言环境)

    自2009年Go语言发布以来,我一直在关注Go语言,如今Go语言已经发展到1.2版本,而且也收到越来越多的人关注这门语言.Go语言设计的目的就是为了解决执行数度快但是编译数度并不理想(如C++)以及编 ...