2017-02-22 8 views
0

これは私の最初のファイル、Form1.csを次のとおりです。イベントと委譲モデルを使用して、ファーストクラスのメソッドから別のクラスへの出力を渡すにはどうすればよいですか?

namespace EventsNDelegates 
    { 
    public delegate void DelEventHandler(); 

    public partial class Form1 : Form 

    { 
    public event DelEventHandler add; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     add += new DelEventHandler(Initiate); 
     //invoke the event 
     add(); 
    } 
    public void Initiate() 
    { 
     textBox1.Text = "Hello"; 
    } 
    } 
} 

と、これは私の第二のファイルのClass1.csです:

namespace EventsNDelegates 
{ 
class Class1 
{ 

} 
} 

と、これは私のフォームデザインである:

enter image description here

今すぐボタンをクリックすると、イベントがフォーム1で発生しています。

私が必要とするのは、イベントがclass1.csのボタンform1.csをクリックして出力され、出力がform1のテキストボックスに表示されることです。

+0

class1にform1への参照がない場合は、直接行うことはできません。しかし、私は両方のクラスの参照を保持する別のクラス(おそらく単にプログラム)があると仮定します。情報を転送するには、このクラスで作業する必要があります。 – Kilazur

+1

私は理解していません。あなたはclass1からform1のイベントを呼び出す、またはclass1のイベントを購読し、これをform1で呼び出すとしますか? –

+0

これらのクラスは両方とも同じ名前空間の下にあります。フォームはform1.csにあります。ここにはテキストボックスとボタンもあります。今form1.csのボタンをクリックすると、class1.csのイベントが発生し、そのイベント(1から20までのカウンタのような)でループが実行され、1から20までのすべての値が表示されます。 form1.cs @Kilazurのテキストボックス –

答えて

0

あなたが別のクラスからのイベントにサブスクライブする必要があるし、Form1クラスのショーの結果ならば、あなたはこれを試すことができます。

public class Class1 
{ 
    public void Foo(Form1 form) // Method with your cycle in class1 
    { 
     for(int i = 0; i < 100; i++) 
     { 
      var str = i.ToString(); // Write iterator in local inloop variable for correct capture in lambda 
      form.add +=() => // subscribe on form1 event 
      { 
       Thread.Sleep(10); 
       return str; 
      }; 
     } 
    } 
} 

public delegate string DelEventHandler(); // change return type to string 

public partial class Form1 : Form 
{ 
    public event DelEventHandler add; 
    public Class1 class1; 

    public Form1() 
    { 
     InitializeComponent(); 
     class1 = new Class1(); 
     class1.Foo(this); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     foreach (var handler in add.GetInvocationList().Cast<DelEventHandler>()) // Get all subscribers for correct invoke 
     { 
      textBox1.Text = handler(); // invoke all subscribers and write result to textBox1 
      Refresh(); 
     } 
    } 
} 

あなたは、そのイベントにサインアップするにはclass1でForm1のインスタンスを渡すことができます。また、単にイベントを呼び出すべきではありません。フォーム1ボタンをクリックするとcall all subscribers of eventになるはずです。クラス1のサイクルでincorrect operationsを避けるために、ループ内のキャプチャでイテレータをコピーすることを忘れないでください。

+0

すべてが良いですが、0から99まで一緒に出力されます。私が必要とするのはカウンターです。 0のように1が来て99まで続いて停止する。 –

+0

私は自分の答えを更新しました。遅延をシミュレートするための 'Thread.Sleep'を追加しました。フォームを再描画するための 'Refresh'メソッドが追加されました。しかし、このような場合は非同期呼び出しを使用する方が良いです。あなたはそれを意味する? –

+0

ああ@イワンキッシュチェンコそれはリフレッシュされますが、古いコンテンツは行っていません。 出力は 0となり、次にとなります。 。 最後にテキストボックスに100のみ 0 1 2 3 ... 100すべて一緒に –

関連する問題