Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将项目从文本文件加载回listView控件,并在每个项目附近添加复选框?_C#_.net_Winforms - Fatal编程技术网

C# 如何将项目从文本文件加载回listView控件,并在每个项目附近添加复选框?

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

在这种方法中,我从硬盘读取一个文本文件,并将这些项添加到listView中

我还在listView的form1设计器中将属性复选框更改为true

现在,当我运行我的程序时,大概需要10-15秒才能全部加载

form1构造函数:

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
    代码,所有这些代码都很好地包装在一个
    Task
    中,并在GUI线程上等待它
我们走吧。第一个变化是:

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