2012-04-18 24 views
0

私がしようとしているのは、別のクラスからtextBox(この場合はtxtInit)を更新することです。私は、UIスレッドがどう変わるか、そしてディスパッチャーを使う方法についてたくさんのことを読んできました。私は近くに見えた、ここで答えを見つけましたが、私はそれが私のために働くことを得るcouldntの...それはライン使ってみてくださいと言わ:私のサーバー側クラスでC#別のクラスからTextBoxを更新

MainForm.Dispatcher.Invoke(new Action(delegate() {MainForm.myInstance.txtInit.Text = "Text"};); 

を、私は文字列を送信する必要があります私のMainFormのtxtInitテキストボックス..それはすべて私がする必要がある..すべての助けをありがとう。

+2

あなたはデスクトップアプリケーション(WPF、リサイズ)またはWebアプリケーション(ASP.Net)でC#を使用しているかどうかを示すタグを追加してください。 – DOK

+0

これはデスクトップアプリケーションです。Visual Studioを使用していますが、それはまったく重要です...私はそれがわからないのです。 – Ramrod

答えて

1

クラスは(今、あなたの問題である)のスレッドとは何の関係もありません。 各コントロールには、正しいスレッド同期を行うInvokeメソッドがあります。 だから、あなたは(あなたが同じスレッドにいる場合は基本的にあなたに伝えている)Control.IsInvokeRequiredプロパティをテストすることができ、パフォーマンスを向上させるために

MainForm.myInstance.txtInit.Invoke((sender, args) => (sender as TextBox).Text = "text"); 

を行うことができます。それを行うには

もう一つの方法は、私はおそらく国民を作成することになりますがSynchronizationContext.Currentからフォームのコンストラクタでキャプチャし

syncContext.Send((obj) => MainForm.myInstance.txtInit.Text = "Text", null); 
+0

私のメインフォームのインスタンスを作成するにはどうすればいいですか?私は使用したコードを知っていますが、何をどのように使用するかはわかりません。 – Ramrod

+0

ah - MainFormクラスに静的フィールドを入れてそこにインスタンスを格納する - これはシングルトンパターン – Bond

1

を行う必要があり、UIスレッドのSynchronizationContextを使用することですメソッドを使用して、文字列を渡して、そのメソッドがテキストボックスのテキストを設定できるようにします。 Invokeコール(別のスレッド)が必要かどうかを制御して、他の領域でコーディングすることを心配する必要がなくなります。メソッドを呼び出して文字列を渡すだけです。ここで

は一例です:

public partial class Form1 : Form 
    { 
     public delegate void UpdateText(string text); 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     public void SetTextBoxText(string text) 
     { 
      // Check to see if invoke required - (from another thread) 
      if(textBox1.InvokeRequired) 
      { 
       textBox1.Invoke(new UpdateText(this.SetTextBoxText), 

        new object[]{text}); 
      } 
      else 
      { 
       textBox1.Text = text; 
      } 
     } 
    } 
+0

と呼ばれますが、メソッドを使用するためにMainFormにアクセスできない場合、他のスレッドからメソッドを呼び出すことはできません...私はこれについて正しく考えていると思う。私のサーバークラスでは、私は言うことができません: MainForm.updateText( "Text"); – Ramrod

+0

メインフォームへの参照が必要です。したがって、ShowDialog()を呼び出す前に別のフォームを起動する場合は、子フォームにプロパティを設定するか、コンストラクタを介してメインフォームに参照を渡す必要があります。 – tsells

+0

さて、私は他のフォームを立ち上げていません。 公共のMainForm() \t \t { \t \t \tのInitializeComponent(); \t \t} \t \t \t \t [STAThread] \t \t公共の静的な無効メイン(文字列[]引数) \t \t { Application.EnableVisualStyles()。 Application.SetCompatibleTextRenderingDefault(false); \t \t \t Application.Run(new MainForm()); \t \t 「名前を付ける」必要があるのは分かりませんが、私のメインフォーム。 – Ramrod

関連する問題