【问题标题】:Immediately updating a listbox立即更新列表框
【发布时间】:2012-01-19 07:35:10
【问题描述】:

我有一个应用程序可以检查多个 7zip 档案(如果它们没有损坏),并且我想在列表框中编写每个操作,但我的问题是当我添加项目时列表框不会显示每一行它,它在完成时更新,并将所有项目放在我的操作结束时,即使我使用属性 .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();
}

【问题讨论】:

    标签: c# winforms listbox


    【解决方案1】:

    问题在于,当 UI 线程有时间执行此操作但您正在声明 UI 线程时,用户界面将得到更新。有两种方法可以解决:

    1. 使用 listBox1.Update() 强制更新 UI 或
    2. 使用后台线程 (BackgroundWorker) 进行处理并将其进度报告给 UI 线程。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        所以不是

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

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

        【讨论】:

          猜你喜欢
          • 2011-04-23
          • 2011-02-21
          • 1970-01-01
          • 2023-01-03
          • 2013-01-06
          • 1970-01-01
          • 1970-01-01
          • 2016-08-06
          • 1970-01-01
          相关资源
          最近更新 更多