Немедленное обновление списка - PullRequest
1 голос
/ 19 января 2012

У меня есть приложение, которое проверяет количество архивов 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();
}

Ответы [ 3 ]

5 голосов
/ 19 января 2012

Проблема в том, что интерфейс пользователя будет обновляться, когда поток пользовательского интерфейса успеет это сделать, но вы запрашиваете поток пользовательского интерфейса. Есть два способа решить это:

  1. Используйте listBox1.Update () для принудительного обновления пользовательского интерфейса или
  2. Используйте фоновый поток (BackgroundWorker), чтобы выполнить обработку, и пусть он сообщает о своем прогрессе потоку пользовательского интерфейса.
4 голосов
/ 19 января 2012

Попробуйте позвонить listBox1.Update() после вставки элемента:

listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director");
listBox1.Update();
3 голосов
/ 19 января 2012

После того, как вы добавите что-либо в свой список, наберите 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...