我有一个应用程序可以检查一些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();
}
答案 0 :(得分:5)
问题是,当UI线程有时间执行此操作时,用户界面将更新,但您声明了UI线程。有两种方法可以解决这个问题:
答案 1 :(得分:4)
插入项目后尝试拨打listBox1.Update()
:
listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director");
listBox1.Update();
答案 2 :(得分:3)
在列表中插入任何内容后,请在列表中调用Update()
。这将强制更新。
所以而不是
listBox1.BeginUpdate();
listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director");
listBox1.EndUpdate();
DO
listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director");
listBox1.Update();