.NET TIPS

ボタンのClickイベントをシミュレートするには?

デジタルアドバンテージ 一色 政彦
2005/03/04

 Windowsアプリケーションでは、1つの機能に対して、2つ以上の操作方法を用意したい場合がある。例えば、次の画面で示すサンプル・アプリケーションでは、ボタンの色がランダムに変化する機能が1つあり、その機能を実行するための方法として、メニューバーのメニュー項目を選択する方法と、ボタンをクリックする方法の2つを提供している。

ボタンの色がランダムに変化するサンプル・アプリケーション
ボタンの色がランダムに変化するという1つの機能を実行する方法として、メニューバーのメニュー項目を選択する方法と、ボタンをクリックする方法の2通りが用意されている。
  メニューバーから[変更]−[ボタンの色]を選択すると、の[ボタンの色]ボタンの背景色が変更される。
  [ボタンの色]ボタンをクリックすると、と同様に、[ボタンの色]ボタンの背景色が変更される。

 このアプリケーションのように、メニューからの操作による処理が、ボタンがクリックされたときの処理とまったく同様な場合には、その処理を1つにまとめることができる。本稿ではそのような場合の実装方法について紹介する。

ランダムに色が変化するボタン・クラス

 このアプリケーションでは、ボタンの色がランダムに変化する機能を、そのボタンのクラス内に実装している(なお、ランダムに数値を生成する方法については、「TIPS:乱数を生成するには?」を参照してほしい)。

 具体的なボタン・クラスの実装コードは次のとおりだ。

using System;
using System.Drawing;

public class CustomButton : System.Windows.Forms.Button
{
  // ボタンがクリックされたときに呼び出される
  // OnClickメソッドのオーバーライド。
  protected override void OnClick(EventArgs e)
  {
    base.OnClick (e);
    // ボタンがクリックされると、背景色をランダムに設定。
    SetRandomBackColor();
  }

  // 背景色をランダムに設定するメソッド。
  public void SetRandomBackColor()
  {
    Random rnd = new Random();
    int red = rnd.Next(256);
    int green = rnd.Next(256);
    int blue = rnd.Next(256);
    this.BackColor = Color.FromArgb(red, green, blue);
  }
}
ボタンの色をランダムに変化させる機能を持つボタン・クラス(C#)
このCustomButtonクラスは、標準のButtonクラスを継承したクラスで、オーバイライドしたOnClickメソッドで、SetRandomBackColorメソッドを呼び出して背景色を変更している。SetRandomColorメソッドに、背景色をランダムに変化させる機能が実装されている。
 
Public Class CustomButton
  Inherits System.Windows.Forms.Button

  ' ボタンがクリックされたときに呼び出される

  ' OnClickメソッドのオーバーライド。

  Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
    MyBase.OnClick(e)
    ' ボタンがクリックされると、背景色をランダムに設定。
    SetRandomBackColor()
  End Sub

  ' 背景色をランダムに設定するメソッド。

  Public Sub SetRandomBackColor()
    Dim rnd As Random = New Random
    Dim red As Integer = rnd.Next(256)
    Dim green As Integer = rnd.Next(256)
    Dim blue As Integer = rnd.Next(256)
    Me.BackColor = Color.FromArgb(red, green, blue)
  End Sub

End Class
ボタンの色をランダムに変化させる機能を持つボタン・クラス(VB.NET)
このCustomButtonクラスは、標準のButtonクラスを継承したクラスで、オーバーライドしたOnClickメソッドで、SetRandomBackColorメソッドを呼び出して背景色を変更している。SetRandomColorメソッドに、背景色をランダムに変化させる機能が実装されている。

 上記コードでは、ボタンがクリックされたときに呼び出されるOnClickメソッドをオーバーライドし、そのメソッド内でCustomButtonクラスのSetRandomBackColorメソッドを呼び出してボタンの背景色を変更している。

 メニューからもこの処理を実行するには、ボタンをクリックしたときと同じように、メニュー項目のClickイベント・ハンドラ内でCustomButtonオブジェクトのSetRandomColorメソッドを呼び出してもよいが、そうせずにそのまま「ボタンがクリックされたことに」してしまうのも1つの手だ。つまり、ボタン・クリックをシミュレートするわけだ。

ボタン・クリックをシミュレートするメソッド

 これを行うメソッドが、Buttonクラス(System.Windows.Forms名前空間)のPerformClickメソッドである。このメソッドを呼び出すことにより、ボタンがクリックされたときの処理を別の個所から実行することができる。

 ちなみに、同様のクリック・シミュレート機能を持つPerformClickメソッドは、RadioButtonコントロール(System.Windows.Forms名前空間)やMenuItemクラス(System.Windows.Forms名前空間)にも存在する。

 それでは、このPerformClickメソッドを使って、メニュー項目を選択するとボタンの色がランダムに変化する機能を実装したサンプル・コードを次に示そう。

using System;
using System.Windows.Forms;

public class Form1 : System.Windows.Forms.Form
{
  ……中略……
  private void menuItem2_Click(object sender, System.EventArgs e)
  {
     button1.PerformClick();
  }
}
ボタン・クリックをシミュレートするサンプル・プログラム(C#)
メニュー項目のClickイベント・ハンドラ内で、CustomButtonオブジェクトのPerformClickメソッドを呼び出している。これにより、ボタンのクリック操作がシミュレートされ、本稿の例ではボタンの色がランダムに変更されることになる。
 
Public Class Form1
  Inherits System.Windows.Forms.Form

  ……中略……
  Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click
    Button1.PerformClick()
  End Sub

End Class
ボタン・クリックをシミュレートするサンプル・プログラム(VB.NET)
メニュー項目のClickイベント・ハンドラ内で、CustomButtonオブジェクトのPerformClickメソッドを呼び出している。これにより、ボタンのクリック操作がシミュレートされ、本稿の例ではボタンの色がランダムに変更されることになる。

PerformClickメソッドを利用するメリットとは?

 上記コードのようなボタン・クリックのシミュレートは、ボタンが押されたときに実行される機能を抽象化する、つまりPerformClickメソッドがその機能を実行するための「窓口」(=一般的な意味でのインターフェイス)となって具体的な内部動作や内部構造を隠ぺいするのに役立つ。これにより次のようなメリットが生まれてくる。

1. ボタンが押されたときの詳しい内部動作を知る必要がなくなる。

 本稿の例では、ボタンが押されたときの機能として、ボタンの色を変更するためのSetRandomBackColorメソッドを呼び出さなければならないが、その機能を利用するフォームなどの外部クラスは、ボタン・クリックをシミュレートすれば(=PerformClickメソッドを利用すれば)、そこで実行される機能の内部仕様(ボタンの色を変更するためにSetRandomBackColorメソッドを呼び出すこと)を知る必要がなくなる。

2. そのため、ボタンが押されたときの機能仕様が変更されても、その利用方法を変える必要がなくなる。

 例えばボタンが押されたときに、背景色(BackColor)ではなく文字の色(ForeColor)が変化するように機能仕様を変更するとしても、CustomButtonクラスのClickイベント・ハンドラ内で呼び出すメソッドをSetRandomBackColorメソッドから、SetRandomForeColorメソッド(仮のメソッド名。文字の色を変えるためのメソッド)に変更するだけで、その機能を利用するフォームなどの外部クラスではその利用方法を変える必要がない。つまり、ボタン・クリックをシミュレートする(PerformClickメソッドを利用する)方のコードは何も変更する必要がない。

 ボタン・クリック時に実行される機能の「窓口」を実現する手段はいくつか考えられるが、.NET Frameworkにあらかじめ用意されているこのPerformClickメソッドを使えば手軽で便利だ。End of Article

カテゴリ:Windowsフォーム 処理対象:Buttonコントロール
カテゴリ:Windowsフォーム 処理対象:RadioButtonコントロール
使用ライブラリ:Buttonコントロール
使用ライブラリ:RadioButtonコントロール
使用ライブラリ:MenuItemクラス(System.Windows.Forms名前空間)
関連TIPS:乱数を生成するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]DataGridコントロールの列にボタンを表示するには?
[ASP.NET]DataGridコントロールに選択ボタンを追加するには?
[ASP.NET]DataGridコントロールに削除ボタンを追加するには?
[ASP.NET]DataGridコントロールで編集を可能にするには?
[ASP.NET]DataGridコントロールの削除ボタンで確認メッセージを表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間