C# 如何将项目从文本文件加载回listView控件,并在每个项目附近添加复选框?
在这种方法中,我从硬盘读取一个文本文件,并将这些项添加到listView中 我还在listView的form1设计器中将属性复选框更改为true 现在,当我运行我的程序时,大概需要10-15秒才能全部加载 form1构造函数:C# 如何将项目从文本文件加载回listView控件,并在每个项目附近添加复选框?,c#,.net,winforms,C#,.net,Winforms,在这种方法中,我从硬盘读取一个文本文件,并将这些项添加到listView中 我还在listView的form1设计器中将属性复选框更改为true 现在,当我运行我的程序时,大概需要10-15秒才能全部加载 form1构造函数: LoadtoListView(); 以及LoadtoListView的方法: private void LoadtoListView() { int countit = 0; using (StreamRe
LoadtoListView();
以及LoadtoListView的方法:
private void LoadtoListView()
{
int countit = 0;
using (StreamReader sr = new StreamReader(@"c:\listviewfile\databaseEN.txt"))
{
while (-1 < sr.Peek())
{
try
{
string name = sr.ReadLine();
string email = sr.ReadLine();
var lvi = new ListViewItem(name.Substring(name.IndexOf(":") + 1));
lvi.SubItems.Add(email.Substring(email.IndexOf(":") + 1));
listView1.Items.Add(lvi);
countit++;
}
catch (Exception) { }
}
sr.Close();
numberofforums = countit;
}
}
private void LoadtoListView()
{
int countit=0;
使用(StreamReader sr=new StreamReader(@“c:\listviewfile\databaseEN.txt”))
{
而(-1
要加载547个项目和547个复选框
我现在测试了如果我在设计器中将复选框的listView属性再次更改为false,它将快速加载约1-2秒
但一旦我把复选框的这个属性变为真,它需要10-15秒才能加载
我想问题是,画所有的复选框需要时间
有什么方法可以让一切都变得更快吗?有几种方法可以让一切变得更快。事实上,你可以让它非常快,复选框或没有复选框 您的代码需要在这里和那里进行一些调整,您必须考虑可重用性、关注点分离和参数化 例如,方法名
LoadToListView
已经做了太多的工作。它加载内容,并填充listview
有三种成分可以让你进入涅盘
首先
考虑创建一个预先实现的ListViewItem
实例列表,更具体地说,创建一个基本数组,如下所示(顺便说一下,我还将在此过程中介绍一些其他良好实践,尽管不是缺少这些实践导致了延迟):
这已经给了你的应用程序额外的速度,你一直在寻找,但即使下一步不会使你的应用程序优雅,它肯定会有帮助
第三种:异步
如果在调用LoadItems
方法时用户界面没有冻结,那就太棒了
这种“非冻结”功能可以通过多种方式实现,但最现代、最酷的方式是使用.NET 4.5和C#5.0中引入的Task
和async
和wait
操作符
如果你不知道这些东西是什么,只需享受前两种成分,但不要犹豫,了解我提到的实体
基本上,您需要做的是:
- 请确保您不可能两次调用
,因为我们将要做的是使这成为可能。因此,如果您有一个按钮的事件处理程序,例如,它正在调用SomeOtherPlace()
,那么我们应该禁用该按钮,并在完成后重新启用它SomeOtherPlace
- 我们将使
方法成为SomeOtherPlace()
方法,它允许async
等待任务
- 我们将在一个单独的线程上运行
代码,所有这些代码都很好地包装在一个LoadItems
中,并在GUI线程上等待它Task
public void SomeOtherPlace() {
变成
public async void SomeOtherPlace() {
其次,我们禁用我提到的按钮:
public async void SomeOtherPlace() {
this.button1.Enabled = false;
...
this.button1.Enabled = true;
}
第三,我们转向这条线:
ListViewItem[] items = LoadItems(filePath);
为此:
ListViewItem[] items = await Task.Factory.StartNew(() => LoadItems(filePath));
现在,您的方法应该如下所示:
public async void SomeOtherPlace() {
string filePath = @"....";
ListViewItem[] items = await Task.Factory.StartNew(() => LoadItems(filePath));
this.listView1.Items.AddRange( items );
}
希望我没有忘记什么。
祝你好运,不要满足于不了解引擎盖下的工作原理 使用listView1.Items.AddRange,而不是一次添加一个ListViewItem。这将缩短您的加载时间。您是否有代码处理ItemCheck事件?Puropoix no.我应该如何处理?
文件。ReadAllLines()
您可以将文件作为字符串[]
@HarimAbdu查看。
ListViewItem[] items = await Task.Factory.StartNew(() => LoadItems(filePath));
public async void SomeOtherPlace() {
string filePath = @"....";
ListViewItem[] items = await Task.Factory.StartNew(() => LoadItems(filePath));
this.listView1.Items.AddRange( items );
}