2012-03-27 11 views
19

任意のオブジェクトメソッドに対してカスタムイベントを作成できますか?カスタムイベントの作成

private void btRunProcessAndRefresh_Click(object sender,EventArgs e) 
    { 
     myProcess =new Process(); 
     myProcess.StartInfo.FileName = @"c:\ConsoleApplication4.exe"; 
     myProcess.Exited += new EventHandler(MyProcessExited); 
     myProcess.EnableRaisingEvents =true; 
     myProcess.SynchronizingObject =this; 
     btRunProcessAndRefresh.Enabled =false; 
     myProcess.Start(); 
    } 
+2

[MSDNの例](http://msdn.microsoftをチェックしてください。com/en-us/library/aa645739(VS.71).aspx)のイベントも同様に – Default

+0

にありますので、 'myProcess.Exited + = MyProcessExited;'で十分です。 – Default

+0

@Default ahhhh ....だから、私は 'myProcess.Exited + = new EventHandler(MyProcessExited);"か、イベントを宣言してから 'myProcess.Exited + = MyProcessExited;'を使うことができましたか? – whytheq

答えて

16

はいあなたはこのように行うことができます。

Creating advanced C# custom events

または

The Simplest C# Events Example Imaginable

public class Metronome 
    { 
     public event TickHandler Tick; 
     public EventArgs e = null; 
     public delegate void TickHandler(Metronome m, EventArgs e); 
     public void Start() 
     { 
      while (true) 
      { 
       System.Threading.Thread.Sleep(3000); 
       if (Tick != null) 
       { 
        Tick(this, e); 
       } 
      } 
     } 
    } 
    public class Listener 
    { 
     public void Subscribe(Metronome m) 
     { 
      m.Tick += new Metronome.TickHandler(HeardIt); 
     } 

     private void HeardIt(Metronome m, EventArgs e) 
     { 
      System.Console.WriteLine("HEARD IT"); 
     } 
    } 
    class Test 
    { 
     static void Main() 
     { 
      Metronome m = new Metronome(); 
      Listener l = new Listener(); 
      l.Subscribe(m); 
      m.Start(); 
     } 
    } 
+22

私にとって最も単純な例のようには見えません。 – Default

+0

@Default - 最も簡単な例を持つ最初のリンクを確認してください –

+0

それはより良いでしょう:) – Default

1

あなたはmyObjectというのクラスであなたのイベントを宣言する必要があります:

この私は、次の構文を使用しますか?:

myObject.myMethod +=new EventHandler(myNameEvent); 

次のコードは、この質問を促した操作を行うに

public event EventHandler<EventArgs> myMethod; //you should name it as an event, like ObjectChanged. 

myNameEventはイベントを処理するためのコールバックであり、他のクラスでも使用できます。

+0

でも問題は分析しているコードに触発されています。私は質問にコードを追加します。私は宣言を見ることができません。 – whytheq

+0

[定義に移動]をクリックすると、イベントでなければならず、処理コードがMyProcessExitedになります。 – MBen

22

イベントを含むクラスを宣言します。

class MyClass { 
    public event EventHandler MyEvent; 

    public void Method() { 
     OnEvent(); 
    } 

    private void OnEvent() { 
     if (MyEvent != null) { 
      MyEvent(this, EventArgs.Empty); 
     } 
    } 
} 

はこのようにそれを使用します:

MyClass myObject = new MyClass(); 
myObject.MyEvent += new EventHandler(myObject_MyEvent); 
myObject.Method(); 
+3

+1すてきな簡単な例 - ありがとう – whytheq

11

はい、ここに例があります。あなたがオブジェクト定義へのアクセス権を持っているし、カスタムイベントに

public event EventHandler<EventArgs> ModelChnaged; 

を宣言すると、通常、あなたが呼び出すために内部的に使用される秘密の方法でこれをバックアップしたい、それを変更することができます提供

public class Foo 
{ 
    public delegate void MyEvent(object sender, object param); 
    event MyEvent OnMyEvent; 

    public Foo() 
    { 
     this.OnMyEvent += new MyEvent(Foo_OnMyEvent); 
    } 

    void Foo_OnMyEvent(object sender, object param) 
    { 
     if (this.OnMyEvent != null) 
     { 
      //do something 
     } 
    } 



    void RaiseEvent() 
    { 
     object param = new object(); 
     this.OnMyEvent(this,param); 
    } 
} 
+1

提供されている他の例をいくつか見ていますが、それらは "代理人"を含んでいません - – whytheq

+2

の前に遭遇したことはありません。 – daryal

+0

を展開するには、['EventHandler'](https://msdn.microsoft.com/en-us/library/system.eventhandler(v)に使用されているパラメータと異なるパラメータが必要な場合のみ、カスタムイベントハンドラデリゲートを使用してください。 = vs.110).aspx)または['EventHandler <>'](https://msdn.microsoft.com/en-us/library/db0etb8x(v = vs.110).aspx)を参照してください。詳細は、[here](http://csharpindepth.com/Articles/Chapter2/Events.aspx)を参照してください。 – kdbanman

4

はい、イベント:

private void OnModelChanged(EventArgs e) 
{ 
    if (ModelChnaged != null) 
     ModelChnaged(this, e); 
} 

あなたのコードは、単にたびに呼び出さなるだろうと宣言myMethodイベント(あなたはまた、コンストラクタを削除することができます)、のハンドラを宣言しますオブジェクトがイベントをトリガーします。

myObject.myMethod += myNameEvent; 

同様に、あなたは

myObject.myMethod -= myNameEvent; 

を使用してハンドラを切り離しまた、あなたはときにイベントが発生し、特定のデータを提供するために、独自のsubclass of EventArgsを書くことができます。

+0

シンプルでエレガント。 –

+0

私は好きでしたが、イベントは発生しませんでした – user688

2

@のiondenの回答に基づいて、デリゲートの呼び出しは、C#6.0以降ヌル伝播を使用して簡単にすることができます。

あなたのコードは、単純に次のようになります。

class MyClass { 
    public event EventHandler MyEvent; 

    public void Method() { 
     MyEvent?.Invoke(this, EventArgs.Empty); 
    } 
} 

はこのようにそれを使用します。

MyClass myObject = new MyClass(); 
myObject.MyEvent += new EventHandler(myObject_MyEvent); 
myObject.Method(); 
関連する問題