2017-05-09 6 views
1

何らかの理由で、ToolStripのProgressBarとLabelが他のスレッドから更新されません。多くの読書の後、私はこれを考え出しましたが、まだ動作していません(しかし、ボタンはOKですが、ステータスバーにはありません)。C#Toolstripのプログレスバーとラベルがクロススレッド操作から更新されない

public void GdmReaderMessageEvent(object sender, GdmMessagesEventArgs e) 
    { 
     Console.WriteLine(e.Message); 

     // error or abort 
     if (e.Message.StartsWith("Error:") || e.Message.StartsWith("Aborted")) 
     { 

      // cross thread crap 
      if (pb.GetCurrentParent().InvokeRequired) 
       pb.GetCurrentParent().Invoke(new MethodInvoker(delegate { pb.Visible = false; })); 

      if (lblStatus.GetCurrentParent().InvokeRequired) 
       lblStatus.GetCurrentParent().Invoke(new MethodInvoker(delegate { lblStatus.Text = e.Message; })); 

      btnImport.Invoke(new MethodInvoker(delegate { btnImport.Text = "Import"; })); 

      //lblStatus.Text = e.Message; 
      //btnImport.Text = "Import"; 
      //pb.Visible = false; 
     } 
    } 

編集、現在すべての機能が、これはBGWのスレッドからわずかのコールバックですが、私はそれはすでに明らかだと思いました。私がちょうどそれを使用する場合:

 lblStatus.Text = e.Message; // this is a Label inside Status 
     btnImport.Text = "Import"; // this is just a button on Form 
     pb.Visible = false;   // this is a Progress Bar inside Status  

クロススレッドエラーがスローされます。だからこそ私はInvoke()で使用しました。 今すぐボタンを更新できますが、ステータスバーのすべてのコントロールは更新されません。

希望がより明確になりました。

.NET 3.5、VS2008、Winformsを使用します。 どのような解決策ですか?

+0

あなたのプラットフォームは何ですか? winforms? wpf?ウェブフォーム?適切にタグを付けてください –

+2

条件を満たしていますか?私はそれが奇妙な質問だと知っていますが、私は全体の機能を見ないので、おそらくあなたはすでに呼び出しているか、何らかの理由で必須ではありません...ボタンは常に動作しています - InvokeRequiredのボタンはチェックされません。 .. 2つは壊れています。 – Aaron

+1

あなたの質問にAaronがおそらく答えました。私はちょうど追加したいと思う、あなたは別々にすべてのコントロールを呼び出す必要はありません。呼び出しは、コントロールが作成されたのと同じスレッドでコードが実行されていることを確認します。あなたのコントロールを名前で参照して、フォームの中にある可能性が最も高いので、フォームもコントロールです。そのため、単一の 'this.Invoke(...)'に簡略化し、すべてのGUI更新コードをそこに配置することができます。 – Fixation

答えて

0

わかりました。 @Fixation、ガイドのおかげでは "this"(私はフォーム自体を意味する)と書いてあります。私は働かないコントロールの呼び出しを使用しようとしていました。

また、この記事は unable to update progress bar with threading in C#

 this.BeginInvoke((Action)(() => pb.Visible = false)); 
     this.BeginInvoke((Action)(() => lblStatus.Text = e.Message)); 

完璧、おかげで有用でした。

関連する問題