Winforms StatusStrip - почему бывают периоды, когда он пуст, когда я обновляю его? - PullRequest
0 голосов
/ 19 марта 2010

ФОН : у меня есть приложение WindowForms v3.5 с установленным StatusStrip для использования в качестве TooStripStatusLabel. Я выпускаю довольно много обновлений для него во время выполнения задачи, однако бывают заметные периоды, когда она ЗАПУСКАЕТСЯ. Там также нет смысла, когда я пишу пробел на метку строки состояния либо.

ВОПРОС : Есть идеи, почему я вижу период, когда метка строки состояния пуста, а я не ожидаю, что это будет?

Как мне его обновить:

    private void UpdateStatusStrip(string text)
    {

        toolStripStatusLabel1.Text = text;
        toolStripStatusLabel1.Invalidate();
        this.Update();
    }

PS. Вызов Application.DoEvents () после this.Update (), похоже, не помогает. Я на самом деле вызываю это через элемент управления backgroundworker, так что:

(а) Я запускаю фонового работника:

    private void Sync_Button_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
        DisableUpdateButtons();
    }

(b) фоновый работник вызывает обновления:

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
  backgroundWorker1.ReportProgress(1, "Example string");
  MainForm.MyC.SyncFiles(sender);
}

(c) Бизнес-класс MyC также использует его, например,

public void SyncFiles(object sender)
{
    BackgroundWorker bgw = (System.ComponentModel.BackgroundWorker) sender;
    bgw.ReportProgress(1, "Starting sync...");
.
.
.
}

(d) Это событие подхватывает:

    private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
    {
        UpdateStatusStrip((string)e.UserState);
    }

(e) И снова полоса обновления состояния

private void UpdateStatusStrip(string text)
{
    toolStripStatusLabel1.Text = text;
    toolStripStatusLabel1.Invalidate();
    this.Update();
}

Помогает ли это?

1 Ответ

1 голос
/ 19 марта 2010

Возможно, причина в вызывающей функции. Если вы вызываете его из другого потока, используйте Control.BeginInvoke вместо прямого вызова. Если вы вызываете его из основного потока приложения во время длительной обработки, попробуйте Application.DoEvents после вызова UpdateStatusStrip.

...