廊坊网站建设廊坊,cms开源系统,代理ip免费软件,山西省煤炭厅基本建设局网站由于WinForm的UI是绘制的#xff0c;所以在加载大量数据数据时会有一定的延时#xff0c;本篇就讨论几个减少延时的方法。在加载有规律数据时#xff0c;可以考虑用递归#xff0c;简单方便快捷来加载数据#xff0c;如下#xff0c;把一个文件夹下的所有文件或文件夹加载…由于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多条数据数据字段有sidpidname。本篇我们主要是看从内存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);}
}性能的问题永远没有最好也没有一种方式能就通吃各种场景得一个个换思路来解决不过上面的思路肯定不是最好的如果你有一次性加载全部更快的解决方案请告我我实现然后再分享给更多的人。