2010-03-19 18 views
0

CONTEXTE: J'ai une application WindowForms v3.5 avec un ensemble StatusStrip à utiliser comme TooStripStatusLabel. Je lui pose beaucoup de mises à jour pendant une tâche en cours, mais il y a des périodes notables où il est BLANK. Il n'y a pas de points lorsque j'écris un blanc sur l'étiquette de la bande d'état.Winforms StatusStrip - Pourquoi y a-t-il des périodes où il est vide lorsque je le mets à jour?

QUESTION: Toutes les idées pourquoi je verrions période où l'étiquette de la bande d'état est vide, quand je ne pense pas que ce soit?

Comment mettre à jour le:

private void UpdateStatusStrip(string text) 
    { 

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

PS. Appeler Application.DoEvents() après le this.Update() ne semble pas aider. Je demande en fait ce via le contrôle BackgroundWorker, donc:

(a) Je commence le travailleur de fond:

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

(b) le travailleur de fond appelle les mises à jour:

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

(c) La classe business MyC l'utilise aussi, par exemple

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

(d) Cet événement, il capte:

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

(e) Et encore une fois la mise à jour d'état bande

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

Est-ce que cette aide?

+1

J'ai quelque chose de similaire. Il semble que l'étiquette soit vide lorsque le texte est trop long pour l'étiquette. Pas sûr d'une solution de contournement pour le moment. –

Répondre

1

La raison est peut-être dans l'appelant de cette fonction. Si vous l'appelez à partir d'un autre thread, utilisez Control.BeginInvoke au lieu d'un appel direct. Si vous l'appelez depuis le thread d'application principal pendant un traitement long, essayez Application.DoEvents après l'appel UpdateStatusStrip.

+0

merci - J'ai ajouté plus de clarté sur la façon dont je l'utilise - le "Control.BeginInvoke" serait-il nécessaire? Si oui, où pourrais-je mettre cela? J'ai essayé "Application.DoEvents après l'appel UpdateStatusStrip" mais cela n'a pas aidé – Greg