しかし、時には似たような処理をする時、それぞれに異なるハンドラを用意しなくてもよい場合があります。
どのメニュー項目がクリックされたかは、ハンドラのobject senderを調べるとわかります。 では、簡単な例を見てみましょう。
// menu04.cs using System; using System.Drawing; using System.Windows.Forms; class menu04 { public static void Main() { Form fm = new Form(); fm.Text = "猫でもわかるプログラミング"; fm.BackColor = SystemColors.Window; EventHandler evh = new EventHandler(OnEvent); MenuItem miNew = new MenuItem("新規(&N)", evh, Shortcut.CtrlN); MenuItem miOpen = new MenuItem("開く(&O)", evh); MenuItem miExit = new MenuItem("終了(&X)", evh); MenuItem[] mis = new MenuItem[]{miNew, miOpen, miExit}; MenuItem miFile = new MenuItem("ファイル(&F)", mis); fm.Menu = new MainMenu(new MenuItem[]{miFile}); Application.Run(fm); } static void OnEvent(object sender, EventArgs e) { MenuItem mi = (MenuItem)sender; MessageBox.Show(mi.Text, "猫でもわかるプログラミング", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }このプログラムは、クリックされたメニュー項目のテキストをメッセージボックスで表示するものです。
「新規」「開く」「終了」のメニュー項目に関連づけられたイベントハンドラはOnEventメソッドのみです。
OnEventメソッドでは、senderをMenuItemにキャストしています。これが、クリックされたMenuItemオブジェクトを表しています。
実行結果は次のようになります。
「新規」をクリックすると・・・
「新規(&N)」というように、&がそのまま表示されてしまいますね。
Update 05/Nov/2006 By Y.Kumei