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);}}

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

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年9月20日
下一篇 2022年9月20日

相关推荐

  • 大国重器中国北斗卫星再传捷报:国内手机已基本覆盖完成

    大国重器中国北斗卫星再传捷报:国内手机已基本覆盖完成 北斗卫星,算是我国的重器之一,是继GPS、GLONASS之后的第三个成熟的卫星导航系统,自从商用以来,迅速发展,已经成为全国乃…

    2022年6月21日
  • 市场主体十年净增超1亿户

    本报北京10月10日电 (记者孔德晨)记者10日从国家市场监督管理总局获悉,十年来,中国市场主体总量实现历史性突破。截至今年8月底,登记在册市场主体达1.63亿户,相比2012年底…

    2022年10月11日
  • 37分13篮板!火箭队17号秀德鲁联赛闪耀全场,媲美詹姆斯啊

    火箭真的捡到宝了! 今年的德鲁联赛,因为詹姆斯前几天加盟,热度直线飙升。所以这段时间,媒体和球迷的关注度基本上都在这个联赛中,大大小小的球员都打算去德鲁联赛展示一下自己的能力。(德…

    2022年7月26日
  • 三年亏了10个亿,Keep上市失败,大把烧钱还不如刘耕宏的一个月

    Keep作为全球最大的健身平台,它也收获了过亿的用户量,数据显示,截至2021年3月,Kepp的用户量已经突破了3亿大关,但用户量的庞大并不能代表Keep能到赚到大把的钱。 可以看…

    2022年9月5日
  • 中国基建还能搞几年 基建还能搞几年?

    众所周知,2022年是中国经济结构转型之年。转型的关键就是用新的经济发展引擎替代国民支柱性行业房地产,关于这一点,相信已是共识。 关键问题是,在现在这个过渡阶段,疫情和俄乌危机两只…

    2022年6月28日
  • 绿水青山

    【大美中国】 7月23日,位于湖南省常宁市洋泉镇的洋泉水库,绿水青山,美景如画。 刘东华摄/光明图片 《光明日报》( 2022年07月25日01版) 来源: 光明网-《光明日报》

    2022年8月7日
  • 极氪001的车机有救了?吉利收购魅族,以后买车送手机是标配?

    最近,车圈和科技圈有一个大新闻——吉利收购魅族。根据公示信息显示,星纪时代拟收购珠海魅族79.09%的股权,魅族创始人黄章的股份降至9.79%,而星纪时代的实际控制人为李书福,相当…

    2022年6月17日
  • 亚洲银行家2022中国未来金融峰会即将于北京召开

    8月25日,亚洲银行家将于北京瑞吉酒店举办第二十一届“中国未来金融峰会”。本次会议将以“聚焦可持续,共创新未来”为主题,共同讨论中国金融业如何加速转型,更好地服务国内实体经济的高质…

    2022年8月24日
  • 玖月奇迹:相爱12年却熬不过2年婚姻,分开4年后两人都过得如何

    提起国内的男女音乐组合,很多人都会想到两个组合,一个是凤凰传奇,一个就是玖月奇迹。 可以说,凤凰传奇是大家都希望能够在一起,但是两人却没有在一起。 而玖月奇迹,是大家都以为不会在一…

    2022年7月1日
  • 新奥特曼上线流媒体(新出的奥特曼电视)

    ©️真探AlphaSeeker原创 作者 | 祖杨 尽管市场对用户增长放缓已有预期,但Netflix还是交出了一份令人措手不及、大跌眼镜的财报。 财报显示,2022年一季度Netf…

    2022年10月25日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息