Обновление ToolStripProgressBar и ToolStripStatusLabel вместе с действием - PullRequest
2 голосов
/ 16 июня 2010

В форме Windows у меня есть окно поиска, которое запускает событие для поиска в удаленной базе данных и отображения некоторых результатов.Запрос выполняется довольно быстро, обычно всего за доли секунды, но в случае заметной задержки в строке состояния формы отображается индикатор выполнения и метка.Когда пользователь нажимает «Поиск», должна появиться метка состояния, а индикатор выполнения показывает некоторый прогресс.Затем, когда результат возвращается, метка должна исчезнуть, а индикатор выполнения должен быть заполнен.Довольно простой ответ.

Проблема в том, что я не могу заставить эти действия происходить в таком порядке.Используя приведенный ниже код, я нажимаю «Поиск», ничего не происходит, пока не отобразятся результаты, а затем индикатор выполнения заполняется от 0 до 100. Метка никогда не появляется.Я даже добавил команду сна сразу после события, чтобы убедиться, что я ее не пропустил, но как будто первые два оператора не выполняются.Что я тут не так делаю?

 private void searchButton_Click(object sender, EventArgs e)
    {
        toolStripStatusLabel1.Visible = true;
        toolStripProgressBar1.Value = 20;
        m_changeRequestedEvents.Fire<String>("SearchTerm", searchTextBox.Text);
        toolStripProgressBar1.Value = 100;
        toolStripStatusLabel1.Visible = false;
    }

1 Ответ

1 голос
/ 17 октября 2010

Предоставленный код изменяет атрибуты пользовательского интерфейса, но поток не может перерисовать пользовательский интерфейс до тех пор, пока searchButton_Click не вернется.Таким образом, изменения, сделанные до события, никогда не применяются, потому что они переопределяются изменениями, внесенными после, которые затем применяются, когда метод возвращает.

Вместо этого обновите атрибуты пользовательского интерфейса перед запуском события:

searchButton.Enabled = false;
toolStripProgressBar1.Value = 0;
toolStripStatusLabel1.Visible = true;
m_changeRequestedEvents.Fire<String>("SearchTerm", searchTextBox.Text);

и из обработчика событий запустите запрос в отдельном потоке (BackgroundWorker), чтобы пользовательский интерфейс мог обновиться за это время:

private void View_OnSearchTermChangeRequest(Object sender, PropertyChangeRequestEventArgs<String> args)
{
    m_search_bgw = new BackgroundWorker();
    ...
    m_DBHandler.current_worker = m_search_bgw;
    m_search_bgw.RunWorkerAsync(args.RequestedValue);
}

, а затем снова обновите пользовательский интерфейс вметод, который вызывается при завершении потока BackgroundWorker:

void UpdateView(DataView projects)
{
    dataGridView1.DataSource = projects;
    ...
    toolStripProgressBar1.Value = 100;
    toolStripStatusLabel1.Visible = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...