WinForm(九)UI加载“大”数据

由于WinForm的UI是绘制的,所以在加载大量数据数据时会有一定的延时,本篇就讨论几个减少延时的方法。

在加载有规律数据时,可以考虑用递归,简单方便快捷来加载数据,如下,把一个文件夹下的所有文件或文件夹加载到树形菜单上,以树形展示,代码实现如下。

var rootPath = "d://abc/bcd";
var rootNode = treeView1.Nodes.Add(rootPath, Path.GetFileName(rootPath));
LoadFile(rootNode);void LoadFile(TreeNode node)
{foreach (var file in Directory.GetFiles(node.Name)){node.Nodes.Add(file, Path.GetFileName(file));}foreach (var dir in Directory.GetDirectories(node.Name)){var childNode = node.Nodes.Add(dir, Path.GetFileName(dir));LoadFile(childNode);}
}

上面的是练了个手,接下来我们加载一个大点的数据,一个全国的行政区划表,有省,市 ,县,乡镇四级,一共49000多条数据,数据字段有sid,pid,name。本篇我们主要是看从内存list到UI上,所以加载数据不是重点,可以是数据库,也可以是文件中,最终数据会在内存的list中。

class Province
{public string sid { get; set; }public string pid { get; set; }public string name { get; set; }
}
var rootNode = treeView1.Nodes.Add("0", "中国");
LoadProvince(rootNode);void LoadProvince(TreeNode node)
{foreach (var item in list.Where(s => s.pid == node.Name)){var childNode = node.Nodes.Add(item.sid, item.name);LoadProvince(childNode);}
}

如果直接用递归加载,速度太慢,为了加快速度,就得并行加载了,于时就增加Task.Run,因为是大多线程中异步操作UI,所以还得用this.Invoke,代码如下。运行,会看到,速度显然快了不了,但还不是理想结果,理想是无感。

var rootNode = treeView1.Nodes.Add("0", "中国");
LoadProvince(rootNode);
void LoadProvince(TreeNode node)
{Task.Run(() =>{foreach (var item in list.Where(s => s.pid == node.Name).OrderBy(s => s.sid)){this.Invoke(() =>{node.Nodes.Add(item.sid, item.name);if (node.Level == 0){node.Expand();}});}foreach (TreeNode childNode in node.Nodes){LoadProvince(childNode);}});
}

后来又想到,可不可以把树形菜单给序列化,窗体启动时,返序列化回来,用BinaryFormatter来实现(现在官方不鼓励用),首先TreeView不支持序列化,只能换成TreeView的Nodes属笥来序列化。窗体启动时,它的加载速度与上面的异步递归差不多,没有明显改善。

即然一次加载大量数据不行,就再换一下思路,一次加载少一些,因为是UI,用户肯定有交互,利用用户的交互来触发加载他想要看的数据,这个少量多少为好,对于树形控件来说,如果想看不出来,那就是两级,用户点开第二级的时候再加载两级,这样用户始终感觉用数据。

private void Form1_Load(object sender, EventArgs e)
{var rootNode = treeView2.Nodes.Add("0", "中国");LoadProvince(rootNode, 1);this.treeView2.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.treeView2_BeforeExpand);
}
private void treeView2_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{if (e.Node != null & e.Node.Nodes != null &&e.Node.Nodes.Count > 0){e.Node.Nodes.Clear();LoadProvince(e.Node, 1);}
}

性能的问题永远没有最好,也没有一种方式能就通吃各种场景,得一个个换思路来解决,不过上面的思路肯定不是最好的,如果你有一次性加载全部更快的解决方案,请告我,我实现,然后再分享给更多的人。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QuillEditor 图片添加缩放功能

安装插件 npm install --save quill-blot-formatter 使用&#xff1a; 添加 :modules"modules" <template><QuillEditorref"refEditor"theme"snow":toolbar"toolbarOptions"contentType"html"enable:content…

关于电商购物车与订单

选好一个商品&#xff0c;点击加入购物车的时候&#xff0c;你要把商品的id和用户的id放入购物车表里面&#xff0c;如果还有其他重要的标志性信息也可以放进去&#xff0c;这样用户就是退出商城&#xff0c;下次进入的时候&#xff0c;系统加载也可以去检索购物车表信息&#…

Servlet 应用程序事件、监听器

Web容器管理Servlet/JSP相关的生命周期&#xff0c;若对HttpServletRequest对象、HttpSession对象、ServletContxt对象在生成、销毁或相关属性设置发生的时机点有兴趣&#xff0c;可以实现对应的监听器(Listener)。 一、ServletContext事件、监听器 与ServletContext相关的监听…

BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解

https://www.lydsy.com/JudgeOnline/problem.php?id4596 https://www.luogu.org/problemnew/show/P4336#sub 四年一度的幻想乡大选开始了&#xff0c;最近幻想乡最大的问题是很多来历不明的妖怪涌入了幻想乡&#xff0c;扰乱了幻想乡昔日的秩序。但是幻想乡的建制派妖怪&#…

巴川数据科学炼成记_智橡树智能英语好不好有哪些功能?提出的科学学习思想是什么?...

智橡树智能英语与真人老师英语教学的最大区别就是解决老师课堂上不擅长、学生课后难坚持的单词、听力、口语、阅读重复训练问题&#xff0c;是辅助老师课堂教学的最佳搭档&#xff01;智橡树智能英语基于人工智能及大数据技术&#xff0c;专注音标、单词、听力、阅读、语法、口…

.NET 调整图片尺寸(Resize)各种方法

前言调整图片尺寸最常用的场景就是生成缩略图&#xff0c;一般为保持纵横比缩小&#xff0c;如果图片放大会使图片变得模糊&#xff0c;如果确实有这方面的需求&#xff0c;可以寻找开源的AI放大图片的方法。1.ImageSharp开源地址&#xff1a;https://github.com/SixLabors/Ima…

vite解决警告: You are running the esm-bundler build of vue-i18n. It is recomme

(转载请删除括号里的内容) 解决方法&#xff1a;在vite.config.js加入以下代码 resolve: { alias: {vue-i18n: vue-i18n/dist/vue-i18n.cjs.js} }--------------------- 作者&#xff1a;BY_BC 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/BY_BC/article…

MongoDB 设置权限认证

1、以未添加auth 的方式启动 mongoDb /mongodb/bin/mongod --dbpath /mongodb/data/db 2、添加用户 /mongodb/bin/mongo a、管理员账户用户名 use admin db.addUser(admin,admin) b、annaDb(其他数据库)账户用户名 use annaDb db.addUser(xxx,xxx) c、新版本添加用户方法 db.cr…

设计师要懂布局(一)

2019独角兽企业重金招聘Python工程师标准>>> 页面版式的好坏给了用户第一印象&#xff0c;好不好用&#xff0c;想不想看页面的内容&#xff0c;要不要收藏这个页面&#xff0c;在设计中都起到了决定性作用。 在互联网时代&#xff0c;我们接触最多的就是手机和电脑…

ES6入门之Symbol

ES5对象属性名都是字符串容易造成属性名的冲突。 eg:var a { name: lucy};a.name lili;这样就会重写属性 ES6引入了一种新的原始数据类型Symbol&#xff0c;表示独一无二的值。 重新复习下新知识&#xff1a;基本数据类型有6种&#xff1a;Undefined、Null、布尔值&#xff0…

mac safari无法连接服务器_宇航员乘坐SpaceX飞船返航中iPad上Safari出现“无法连接到网络”错误...

罗伯特贝恩肯(Robert Behnken)和道格拉斯赫尔利(Douglas Hurley)在完成轨道实验室任务后&#xff0c;于今天搭乘 SpaceX 公司的"Crew Dragon"飞船离开国际空间站&#xff0c;为他们历史性的国际空间站飞行画上句号。两名宇航员在位于美国德克萨斯州休斯顿和加利福尼亚…

Vue 大量数据展示卡顿解决方案(长列表优化)

需求分析&#xff08;长列表展示&#xff09; 页面某处需要渲染 1w 条数据&#xff0c;并需要滚动展示&#xff0c;这时如果直接把这些数据渲染到页面上&#xff0c;会导致系统内存大量被占用&#xff0c;导致页面卡顿或崩溃 我们都知道&#xff0c;每次 DOM 修改&#xff0c;浏…

Blazor University (47)依赖注入 —— Singleton 依赖

原文链接&#xff1a;https://blazor-university.com/dependency-injection/dependency-lifetimes-and-scopes/singleton-dependencies/Singleton 依赖Singleton 依赖是一个由依赖它的每个对象共享的单个对象实例。在 WebAssembly 应用程序中&#xff0c;这是在浏览器的当前选项…

nginx log_format详解

nginx服务器日志相关指令主要有两条&#xff0c;一条是log_format&#xff0c;用来设置日志格式&#xff0c;另外一条是access_log&#xff0c;用来指定日志文件的存放路径、格式和缓存大小&#xff0c;一般在nginx的配置文件中日记配置(/usr/local/nginx/conf/nginx.conf)。 n…

Django-admin管理工具

admin组件使用 Django 提供了基于 web 的管理工具。 Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它&#xff1a; # Application definitionINSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contr…

mybatis报错invalid types () or values ()解决方法

报错信息&#xff1a;org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.org.tfkj.bean.AppFile.T_contactList with invalid types () or values (). Cause: java.lang.NoSu…

[转]mysql的sql优化工具

原标题&#xff1a;DBA的五款最佳SQL查询优化工具&#xff0c;收藏了 一般来说&#xff0c;SQL查询优化器分析给定查询的许多选项&#xff0c;预估每个选项的成本&#xff0c;最后选择成本最低的选项。如果查询优化器选择了错误的计划&#xff0c;则性能差异可能从几毫秒到几分…

log4j 新建日志 重启_Log4j 动态修改日志级别,不用重启服务器

生产环境正常情况下 只需要打印Info级别的日志就够了&#xff0c;碰到有问题的时候&#xff0c;或者在开发过程中 需要把debug 级别的日志打印出来。把下面的代码放到一个 Controller 里&#xff0c;通过页面一个的按钮调用即可。//修改全局LogManager.getLoggerRepository().s…

.NET 7 中的 HttpResult 接口

.NET 7 中的 HttpResult 接口Intro在前面的文章中&#xff0c;我们提到了 .NET 7 引入了 Endpoint Filter 来支持 Endpoint 的过滤器&#xff0c;有了这个接口就想着把之前的统一 API response 的 filter 改造一下支持 endpoint filter&#xff0c;然而这个一直等到了 .NET 7 P…

5、Hive的自定义UDF函数

2019独角兽企业重金招聘Python工程师标准>>> 1、pom.xml引入依赖及打包 <dependencies><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1.1.0</version></depende…