2011-06-28 23 views
4

次のコードを使用して、アプリケーションのメインUIスレッドにあるコントロールを呼び出しています。ステータスストリップにあるプログレスバーにはInvokeRequiredがありません。何とかSystem.Windows.Forms.ToolStripProgressBarを呼び出す必要があります。ステータスストリップで進行状況バーを呼び出す方法は?

if (txtbox1.InvokeRequired) 
{ 
txtbox1.Invoke(new MethodInvoker(delegate { txtbox1.Text = string.Empty; })); 
} 
+1

@Sevをコントロールとコントロールから派生して、ISynchronizeInvokeインターフェイスを実装します。 –

+0

System.Windows.Forms.ToolStripProgressBarを使用しています – Sev

+0

この単一のコントロールのためだけにbackgroundWorkerを使用できますか?私はスレッドコード全体をやり直したいとは思わない – Sev

答えて

7

この便利な拡張メソッドに落下してみ

if (toolStripProgressBar1.Parent.InvokeRequired) 
{ 
    toolStripProgressBar1.Parent.Invoke(new MethodInvoker(delegate { toolStripProgressBar1.Value= 100; })); 
} 
+4

ありがとうございますが、親はありません。代わりに私はこれをしました prgBarMain.GetCurrentParent()。InvokeRequired – Sev

+1

'Parent'は' ToolStringProgressBar'のプロパティの下にリストされていますhttp://msdn.microsoft.com/en-us/library/system.windows.forms.toolstripprogressbar.aspx。なぜあなたはそれを持っていないか分かりません。 –

+3

親プロパティは.net 4.5の内部です –

2

のToolStripなくToolStripProgressBarを起動してみてください。

delegate void ToolStripPrograssDelegate(int value); 
    private void ToolStripPrograss(int value) 
    { 
     if (toolStrip1.InvokeRequired) 
     { 
      ToolStripPrograssDelegate del = new ToolStripPrograssDelegate(ToolStripPrograss); 
      toolStrip1.Invoke(del, new object[] { value }); 
     } 
     else 
     { 
      toolStripProgressBar1.Value = value; // Your thingy with the progress bar.. 
     } 
    } 

私はそれが動作しますが、それに撮影を与えるかわかりません。

この文句を言わない仕事はこれをしようとした場合

delegate void ToolStripPrograssDelegate(int value); 
    private void ToolStripPrograss(int value) 
    { 
     if (this.InvokeRequired) 
     { 
      ToolStripPrograssDelegate del = new ToolStripPrograssDelegate(ToolStripPrograss); 
      this.Invoke(del, new object[] { value }); 
     } 
     else 
     { 
      toolStripProgressBar1.Value = value; // Your thingy with the progress bar.. 
     } 
    } 

「この」それは自己のフォームでなければなりません。

+0

次のメソッドで、progressbarにステップを追加します。ここでコードを使用するにはどうすればいいですか? public void AddProgressBarValue(int _step) { prgBarMain.Value + = _step; } – Sev

1

を試してみてください。今、あなたはちょうどこの行うことができます

public static class ControlEx 
{ 
    public static void Invoke(this System.Windows.Forms.Control @this, Action action) 
    { 
     if (@this == null) throw new ArgumentNullException("@this"); 
     if (action == null) throw new ArgumentNullException("action"); 
     if (@this.InvokeRequired) 
     { 
      @this.Invoke(action); 
     } 
     else 
     { 
      action(); 
     } 
    } 
} 

txtbox1.Invoke(() => toolStripProgressBar1.Value = value); 

をそれが安全にUIスレッド上でアクションを呼び出します実際のコントロールから呼び出すことができます。

+0

これは非常に便利な拡張です。どうもありがとう。 – Siva

+0

あなたが質問に答えなかったpittyは、要求された進行状況バーを使って例を見ることができます。 – scott

+1

@scott - プロセスバーを使用した例が私の答えにあります。 – Enigmativity

0

あなたはどのコントロール呼び出すように設計されたAutomating the InvokeRequired code patternから一般的な呼び出し元を変更することができますのToolStripに

//Neat generic trick to invoke anything on a windows form control class 
//https://stackoverflow.com/questions/2367718/automating-the-invokerequired-code-pattern 
//Use like this: 
//object1.InvokeIfRequired(c => { c.Visible = true; }); 
//object1.InvokeIfRequired(c => { c.Text = "ABC"; }); 
//object1.InvokeIfRequired(c => 
// { 
//  c.Text = "ABC"; 
//  c.Visible = true; 
// } 
//); 
public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control 
{ 
    if (c.InvokeRequired) 
    { 
     c.Invoke(new Action(() => action(c))); 
    } 
    else 
    { 
     action(c); 
    } 
} 

オブジェクトはのToolStripItemであり、何のInvokeRequiredを持っていません。しかし、親があり、上記の親.Invoke()を使用して書き換えることができます:それはあるので、あなたがSystem.Windows.Forms.Controls.ProgressBarを使用している場合、それはInvokeRequeiredメソッドが含まれています

public static void InvokeIfRequiredToolstrip<T>(this T c, Action<T> action) where T : ToolStripItem 
{ 
    if (c.GetCurrentParent().InvokeRequired) 
    { 
     c.GetCurrentParent().Invoke(new Action(() => action(c))); 
    } 
    else 
    { 
     action(c); 
    } 
}