Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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# 立即更新列表框_C#_Winforms_Listbox - Fatal编程技术网

C# 立即更新列表框

C# 立即更新列表框,c#,winforms,listbox,C#,Winforms,Listbox,我有一个应用程序,它可以检查许多7zip arhive是否已损坏,我想在列表框中写入每个操作,但我的问题是,当我向列表框添加项目时,列表框不会显示每一行,它会在完成时更新,并将所有项目放在我操作的末尾,即使我使用了属性。StartUpdate()和EndUpdate() 这是我代码的一部分: foreach (string director in foldere) { if (director.ToLower().Contains("cluj") || director.ToLower(

我有一个应用程序,它可以检查许多7zip arhive是否已损坏,我想在列表框中写入每个操作,但我的问题是,当我向列表框添加项目时,列表框不会显示每一行,它会在完成时更新,并将所有项目放在我操作的末尾,即使我使用了属性。StartUpdate()和EndUpdate()

这是我代码的一部分:

foreach (string director in foldere)
{
    if (director.ToLower().Contains("cluj") || director.ToLower().Contains("craiova") || director.ToLower().Contains("timisoara"))
    {
        String[] zipFile = Directory.GetFiles(director, "*.7z");
        foreach (string zip7 in zipFile)
        {
            //check arhive
            SevenZipExtractor zipfile = new SevenZipExtractor(zip7);
            if (zipfile.Check())
            {
                String[] fisFaraArhiva = Directory.GetFiles(director, "*.*");
                foreach (string fisere in fisFaraArhiva)
                {
                    if (fisere != zip7)
                    {
                        File.Delete(fisere);
                    }
                }
                listBox1.Items.Insert(0, "A fost sters fisierele din directorul " + director);
                string[] fisComanda = Directory.GetFiles(utilizator, "*" + id + "*");
                foreach (string cmd in fisComanda)
                {
                    File.Move(cmd, Path.Combine(director, Path.GetFileName(cmd)));
                    listBox1.BeginUpdate();
                    listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director");
                    listBox1.EndUpdate();
                }
            }
            else
            {
                MessageBox.Show("Arhiva nu este ok");
                listBox1.BeginUpdate();
                listBox1.Items.Insert(0, "Arhiva " + zip7 + " NU este OK");
                listBox1.BackColor = Color.Red;
                listBox1.EndUpdate();
            }
        }
    }
}
if (listBox1.BackColor != Color.Red)
{
    listBox1.BeginUpdate();
    listBox1.BackColor = Color.Green;
    listBox1.EndUpdate();
}

插入项目后,尝试调用
listBox1.Update()

listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director");
listBox1.Update();
listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director");
listBox1.Update();

插入项目后,尝试调用
listBox1.Update()

listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director");
listBox1.Update();
listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director");
listBox1.Update();

问题是,当UI线程有时间更新用户界面时,用户界面将得到更新,但您正在声明UI线程。有两种方法可以解决这个问题:

  • 使用listBox1.Update()强制更新UI或
  • 使用后台线程(BackgroundWorker)进行处理,并让它向UI线程报告其进度

  • 问题是,当UI线程有时间更新用户界面时,用户界面将得到更新,但您正在声明UI线程。有两种方法可以解决这个问题:

  • 使用listBox1.Update()强制更新UI或
  • 使用后台线程(BackgroundWorker)进行处理,并让它向UI线程报告其进度

  • 在列表中插入任何内容后,在列表中调用
    Update()
    。这将强制更新

    所以不是

    listBox1.BeginUpdate();
    listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director");
    listBox1.EndUpdate();
    


    在列表中插入任何内容后,在列表中调用
    Update()
    。这将强制更新

    所以不是

    listBox1.BeginUpdate();
    listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director");
    listBox1.EndUpdate();