Как обновить флажки в .NET checkListBox? - PullRequest
0 голосов
/ 24 июня 2010

Я столкнулся с проблемой, когда я хочу отобразить список элементов в checkListBox и программно отмечать их по одному, когда каждый процесс, который я отслеживаю, завершается.

Я постараюсь довести мой код до самого необходимого, чтобы каждый мог легко понять, что происходит.

for (int i = 0; i < 10; i++)
{
    SOME_FUNCTION();
    progressBar.Value++;
    checkListBoxItems.SetItemCheckState(i, CheckState.Checked);
}

Это по сути то, что делает мой код. Индикатор выполнения обновляется во время работы цикла, но все флажки не проверяются, пока цикл не завершится, и все они проверены одновременно.

Это, очевидно, отрицательно сказывается на цели отображения флажков, и мне было любопытно, не было ли чего-то, что мне не хватало, чтобы можно было обновить элемент управления checkListBox, или что-то подобное.

Я прошу прощения, если этот вопрос кажется расплывчатым, у меня, кажется, эта проблема довольно часто здесь.

Ответы [ 3 ]

2 голосов
/ 24 июня 2010

Это стандартное поведение для любого приложения с графическим интерфейсом Windows, обновления экрана не происходят, пока поток пользовательского интерфейса не перейдет в режим ожидания, чтобы Windows могла доставить событие Paint. Одна из самых худших вещей, которые вы можете сделать, это вызвать Application.DoEvents (). Да, это доставит событие Paint. Но это также позволяет вашему пользователю закрыть форму. Это создает Big Kaboom, когда элемент управления, который вы пытаетесь обновить, внезапно исчезает. Ваш цикл все еще работает, но форма больше не существует.

Что вы, должно быть, заметили, так это то, что индикатор выполнения действительно обновился, а CheckedListBox - нет. Это связано с тем, что ProgressBar часто используется для отображения прогресса, когда код находится в цикле, поэтому он гарантирует, что при изменении свойства Value он немедленно раскрашивает себя, не дожидаясь, пока Windows сообщит, что его нужно перекрасить. Грязный трюк, очень запутанный.

Но вы также можете воспользоваться этим трюком, это легко. Измените свой код следующим образом:

for (int i = 0; i < 10; i++)
{
    SOME_FUNCTION();
    progressBar.Value++;
    checkListBoxItems.SetItemCheckState(i, CheckState.Checked);
    checkListBoxItems.Update();
}

Метод Update () означает «нарисуйте себя, когда это необходимо». То есть вы изменили состояние проверки элемента. Никогда на вас не действует Big Kaboom, пользователь не может внезапно заставить управление исчезнуть.

Если SOME_FUNCTION () занимает много времени, например, более 10 x 0,3 секунды или около того, вам следует подумать об использовании потоков.

0 голосов
/ 24 июня 2010
for (int i = 0; i < 10; i++)
{
    SOME_FUNCTION();
    progressBar.Value++;
    checkListBoxItems.SetItemCheckState(i, CheckState.Checked);
    Application.DoEvents();
}
0 голосов
/ 24 июня 2010

Вы можете позвонить Invalidate() на элемент управления, который необходимо перекрасить.

Так что-то подобное каждый раз, когда вы обновляете галочку в списке:

checkListBoxItems.Invalidate();

Наслаждайтесь!

...