DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

イベントを捕捉する

イベントが発生した時にこれを捕捉し、それに応じた処理を行うようにするには、イベントハンドラ(メソッド)を作成して、これをイベントに追加(接続、登録)する必要があります。

ここでは具体的に、System.Windows.Forms名前空間のButtonコントロール「Button1」のClickイベントに、イベントハンドラ「Button1_Click」を追加する方法を説明します。なおすでにButton1はフォームに配置されているものとします。

Visual Studioを使用する方法

まずは、Visual Studioを使用して行う方法を紹介します。

VB.NET

  1. コードエディタの左上にあるコンボボックスから、「Button1」を選択します。
    「Button1」の選択
  2. コードエディタの右上にあるコンボボックスから、「Click」を選択します。
    「Click」の選択
  3. フォームクラスにButton1_Clickイベントハンドラメソッドが自動的に作成されます。Button1のClickイベントへの登録も自動的に行われます。
  4. 後は、Button1_Clickイベントハンドラメソッドに、Button1がクリックされた時の処理を記述してください。

Visual Studio 2005からは、C#での方法と同じように、プロパティウィンドウでイベントハンドラを作成することもできます。

C#

  1. フォームデザイナでButton1を選択します。(または、プロパティウィンドウの上部にあるコンボボックスからButton1を選択します。)
  2. プロパティウィンドウの上部にあるツールバーの「イベント」をクリックします。
    プロパティウィンドウ
  3. 表示されるリストから「Click」を探し、その項目をダブルクリックします。
  4. フォームクラスにButton1_Clickイベントハンドラメソッドが自動的に作成されます。Button1のClickイベントへの登録も自動的に行われます。
  5. 後は、Button1_Clickイベントハンドラメソッドに、Button1がクリックされた時の処理を記述してください。

手動で行う方法

次に、Visual Studioを使わずに、手動で行う方法を説明します。

VB.NET

  1. Button1をVisual Studioのフォームデザイナで作成せずに、自分で作成した場合は、Button1の宣言にWithEventsを使用します。具体的には、例えば、次のようになります。
    VB.NET
    コードを隠すコードを選択
    Friend WithEvents Button1 As System.Windows.Forms.Button
    
  2. ButtonクラスのClickイベントのイベントハンドラとして適当なシグネチャを持つメソッドを作成します。どのようなメソッドを作成すればよいかを知るには、ヘルプやMSDNでButtonクラスのメンバClick イベントのページを見てみます。実際に見てみると、EventHandlerデリゲートと同じシグネチャのメソッドが必要であることが分かります。具体的には、次のようなメソッドをフォームクラスに作成します。
    VB.NET
    コードを隠すコードを選択
    Private Sub Button1_Click(ByVal sender As Object, _
        ByVal e As System.EventArgs)
    
    End Sub
    
  3. 作成したメソッドにHandles句を付け、Button1のClickイベントに関連付けます。具体的には、先に作成したButton1_Clickメソッドを次のように変更します。
    VB.NET
    コードを隠すコードを選択
    Private Sub Button1_Click(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Button1.Click
    
    End Sub
    
  4. 後は、Button1_Clickイベントハンドラメソッドに、Button1がクリックされた時の処理を記述してください。

C#の場合

  1. ButtonクラスのClickイベントのイベントハンドラとして適当なシグネチャを持つメソッドを作成します。どのようなメソッドを作成すればよいかを知るには、ヘルプやMSDNでButtonクラスのメンバClick イベントのページを見てみます。実際に見てみると、EventHandlerデリゲートと同じシグネチャのメソッドが必要であることが分かります。具体的には、次のようなメソッドをフォームクラスに作成します。
    C#
    コードを隠すコードを選択
    private void Button1_Click(object sender, EventArgs e)
    {
    
    }
    
  2. +=演算子を使用して、Button1のClickイベントにButton1_Clickを追加します。具体的には、次のようなコードを記述します。このコードは、フォームのLoadイベントハンドラや、フォームクラスのコンストラクタ(InitializeComponentメソッドを呼び出した後)などに記述すればよいでしょう。
    C#
    コードを隠すコードを選択
    Button1.Click += new EventHandler(Button1_Click);
    
  3. 後は、Button1_Clickイベントハンドラメソッドに、Button1がクリックされた時の処理を記述してください。
補足:Visual Studio 2005からは、コードエディタに「Button1.Click +=」と記述したところでTabキーを押すことにより、「new EventHandler(Button1_Click);」が自動的に書き足されます。この直後、「Button1_Click」の部分が選択状態になりますが、もしButton1_Clickメソッドが存在しなければ、ここでもう一度Tabキーを押すことにより、Button1_Clickを自動的に作成することができます。この方法でイベントハンドラを作成すれば、いちいちイベントハンドラのシグネチャを調べる必要がなく、簡単です。

実行時にイベントハンドラを追加する

最後に、プログラムが実行時にイベントにイベントハンドラを追加する方法を説明します。

VB.NET

  1. 手動で行う方法」と同様に、ButtonクラスのClickイベントのイベントハンドラとして適当なシグネチャを持つメソッドを作成します。具体的には、次のようなメソッドをフォームクラスに作成します。
    VB.NET
    コードを隠すコードを選択
    Private Sub Button1_Click(ByVal sender As Object, _
        ByVal e As System.EventArgs)
    
    End Sub
    
  2. AddHandlerステートメントを使用して、Button1のClickイベントにButton1_Clickを追加します。具体的には、次のようなコードを記述します。このコードは、フォームのLoadイベントハンドラなどに記述すればよいでしょう。
    VB.NET
    コードを隠すコードを選択
    AddHandler Button1.Click, AddressOf Button1_Click
    
    'または、次のようにする
    'AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
    
  3. 後は、Button1_Clickイベントハンドラメソッドに、Button1がクリックされた時の処理を記述してください。

C#

手動で行う方法」と同じです。

一つのイベントに複数のイベントハンドラを追加する

これには、「実行時にイベントハンドラを追加する」で紹介した方法を使用します。

例えば次のようにすると、Button1のClickイベントが発生した時に、Button1_ClickとButton1_1_Clickイベントハンドラの両方が呼び出されます。

VB.NET
コードを隠すコードを選択
AddHandler Button1.Click, AddressOf Button1_Click
AddHandler Button1.Click, AddressOf Button1_1_Click
C#
コードを隠すコードを選択
Button1.Click += new EventHandler(Button1_Click);
Button1.Click += new EventHandler(Button1_1_Click);

同じイベントハンドラを複数追加すると、追加した回数だけそのイベントハンドラが呼び出されます。例えば次のようにすると、Button1が一回クリックされると、Button1_Clickが2回呼び出されます。

VB.NET
コードを隠すコードを選択
AddHandler Button1.Click, AddressOf Button1_Click
AddHandler Button1.Click, AddressOf Button1_Click
C#
コードを隠すコードを選択
Button1.Click += new EventHandler(Button1_Click);
Button1.Click += new EventHandler(Button1_Click);

一つのイベントハンドラに複数のイベントを関連付ける

例えば、複数のButtonコントロールのClickイベントを一つのイベントハンドラに関連付けることができます。また、デリゲートが同じであれば、複数の別々のイベントを一つのイベントハンドラに関連付けることもできます。

これも、「実行時にイベントハンドラを追加する」で紹介した方法を使用します。

Button1またはButton2がクリックされた時にButton1_Clickが呼び出されるようにするには、次のようにします。

VB.NET
コードを隠すコードを選択
AddHandler Button1.Click, AddressOf Button1_Click
AddHandler Button2.Click, AddressOf Button1_Click
C#
コードを隠すコードを選択
Button1.Click += new EventHandler(Button1_Click);
Button2.Click += new EventHandler(Button1_Click);

VB.NETの場合は、「手動で行う方法」で紹介したHandlesを使用して、次のようにすることもできます。

VB.NET
コードを隠すコードを選択
Private Sub Button1_Click(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click

End Sub

C#と、Visual Studio 2005以降のVB.NETの場合は、「Visual Studioを使用する方法」を使用することもできます。

プロパティウィンドウで「Click」を探し、右側のコンボボックスからイベントハンドラを選択します(イベントハンドラはすでに存在している必要があります)。例えば、Button2のClickイベントにButton1_Clickイベントハンドラを追加するには、このコンボボックスから「Button1_Click」を選択します。

イベントハンドラを削除する

イベントに追加されているイベントハンドラを削除するには、VB.NETではRemoveHandlerステートメントを、C#では-=演算子を使用します。

Button1のClickイベントからButton1_Clickイベントハンドラを削除して、Button1をクリックしてもButton1_Clickが呼び出されないようにするには、次のようにします。

VB.NET
コードを隠すコードを選択
RemoveHandler Button1.Click, AddressOf Button1_Click
C#
コードを隠すコードを選択
Button1.Click -= new EventHandler(Button1_Click);

イベントにイベントハンドラが複数追加されている場合は、その数だけ削除しないと、イベントハンドラは呼び出されてしまいます。

イベントからイベントハンドラが完全に削除されている時に上記の方法でイベントハンドラを削除しようとしても、エラーが発生することはありません。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。