2010-03-19 1 views
0

ПРЕДПОСЫЛКИ: У меня есть приложение WindowForms v3.5 с набором StatusStrip, который будет использоваться как TooStripStatusLabel. У меня много обновлений для нее во время выполнения задачи, однако есть заметные периоды, когда она BLANK. Нет точек, когда я пишу пробел на этикетке с полосой статуса.Winforms StatusStrip - почему существуют периоды, когда он пуст, когда я его обновляю?

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

Как обновить:

private void UpdateStatusStrip(string text) 
    { 

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

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

(а) пускаю фона рабочего:

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

(б) фон работник требует обновления:

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); 
    } 

(е) и снова статус обновления полосы

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

Поможет ли это?

+1

У меня есть нечто похожее. Похоже, на ярлыке отображается пустое значение, когда текст слишком длинный для метки. Пока не уверен в обходном пути. – 2012-03-06 13:17:05

ответ

1

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

+0

спасибо - Я добавил еще немного ясности в отношении того, как я его использую - потребуется ли «Control.BeginInvoke»? Если да, где я буду это делать? Я попробовал «Application.DoEvents после вызова UpdateStatusStrip», однако это не помогло – Greg