2009-04-28 8 views
1

私はフォームからフォーム上のテキストボックスを操作する方法を知っていますが、CLASSからテキストボックスを操作する方法はわかりません。C#では、作成したカスタムクラスからフォームを操作するためにデリゲートを使用する方法はありますか?

私は代理人&コールバックを書く方法を教えてもらえますか?クラスから別のファイルのメソッドを呼び出すだけで、テキストボックスの内容を別のフォームに変更できますか?

私はそれがどんなに優れているかを私がどのように説明できるかわかりません。助けてくれてありがとう!

+0

これは、次のようなものです。http://stackoverflow.com/questions/717454/accessing-class-members-with-invoke-from-a-different-thread-in-c、http://stackoverflow.com/質問/ 717264/c-accessible-form-members-from-another-class、http://stackoverflow.com/questions/717074/how-to-access-form-objects-from-another-cs-file-in- c – Groo

+0

彼らは似ているが、彼らはまだ本当に私を助けていない。しかし、助けてくれてありがとう、うまくいけば誰かがすぐに答えを投げることができます。 – OneShot

答えて

3

クラスはフォームを変更しないでください。

ただし、クラス内にデリゲートまたはイベントを作成して、何らかのアクションを実行する必要がある場合にクラスでそのイベントを発生させることができます。 フォームはこのイベントにイベントハンドラを添付し、適切な処置を実行できます。例えば

class MyClass 
{ 
    public event EventHandler DoSomething; 

    public void DoWork() 
    { 
     // do some stuff 

     // raise the DoSomething event. 
     OnDoSomething(EventArgs.Empty); 
    } 

    protected virtual void OnDoSomething(EventArgs args) 
    { 
     // This code will make sure that you have no IllegalThreadContext 
     // exceptions, and will avoid race conditions. 
     // note that this won't work in wpf. You could also take a look 
     // at the SynchronizationContext class. 
     EventHandler handler = DoSomething; 
     if(handler != null) 
     { 
      ISynchronizeInvoke target = handler.Target as ISynchronizeInvoke; 

      if(target != null && target.InvokeRequired) 
      { 
       target.Invoke (handler, new object[]{this, args}); 
      } 
      else 
      { 
       handler(this, args); 
      } 
     } 
    } 
} 

そして、自分のフォームでは、あなたがこれを行う:

MyClass c = new MyClass(); 
c.DoSomething += new EventHandler(MyClass_DoSomething); 
c.DoWork(); 

private void MyClass_DoSomething(object sender, EventArgs e) 
{ 
    // Manipulate your form 
    textBox1.Text = " ... "; 
} 

あなたのフォームにあなたのクラスからいくつかのデータを渡したい場合は、あなたが利用することができますジェネリックなEventHandlerデリゲートを作成し、独自のEventArgsクラスを作成します。このクラスには、フォームに必要な情報が含まれています。

public class MyEventArgs : EventArgs 
{ 
    public string SomeData 
    { get; 
     private set; 
    } 

    public MyEventArgs(string s) 
    { 
     this.SomeData = s; 
    } 
} 

はその後offcourse、あなたのクラスで一般的なのEventHandlerを使用する必要があり、そしてあなた自身のEventArgsクラスのコンストラクタに適切なデータを渡します。 イベントハンドラでは、このデータを使用することができます。

+0

これは既にスレッドセーフですか、それともtodoなのですか?スレッドセーフでも必要ですが、そこに戻っても構いませんか? – OneShot

+0

スレッドセーフにするには、イベントハンドラを呼び出すかどうかを調べる必要があります。 コードを修正します... –

+0

ありがとうございました!私は今それを動作させることができる場合は表示されます。 – OneShot

関連する問題