[C#]イベント徹底解説|WindowsFormアプリケーションでのイベント登録方法・ラムダ式での記述方法
![[C#]イベント徹底解説|WindowsFormアプリケーションでのイベント登録方法・ラムダ式での記述方法](https://www.fenet.jp/dotnet/column/wp-content/uploads/2020/08/pixta_58766801_M-1024x682.jpg)
エンジニア
マネージャー
[C#]イベント徹底解説
今回は、C#でのイベントの扱い方について説明します。Windows Formアプリケーションでのイベント登録方法、ラムダ式での記述方法について紹介します。また、イベントのキャンセル方法や削除方法についても紹介します。
C#でのイベントの扱い方に興味のある方はぜひご覧ください。
イベント登録
C#でのイベント登録方法について紹介します。ここでは、ソースコードからイベント登録します。実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; using System.Windows.Forms; using System.Drawing; namespace WindowsFormsApp1 { public partial class Form1 : Form { Button button; public Form1() { // ボタン button = new Button(); button.Location = new Point(10, 10); button.Text = "button"; // イベント登録 button.Click += Button1_Click; this.Controls.Add(button); } // ボタンクリックイベント private void Button1_Click(object sender, EventArgs e) { MessageBox.Show("ボタンがクリックされました。"); } } } |
実行すると、ボタンクリック時にイベントが発行されて、MessageBoxで「ボタンがクリックされました。」が表示されることが分かります。また、デザイン画面のプロパティ設定画面からでも、ボタンクリックイベントを登録できます。
ラムダ式
C#では、ラムダ式でイベント登録できます。ラムダ式で記述することで、ソースコードがシンプルになります。実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Windows.Forms; using System.Drawing; namespace WindowsFormsApp1 { public partial class Form1 : Form { Button button; public Form1() { // ボタン button = new Button(); button.Location = new Point(10, 10); button.Text = "button"; // イベント登録 button.Click += (sender, e) => { MessageBox.Show("ボタンがクリックされました。"); }; this.Controls.Add(button); } } } |
Button1_Clickメソッドがなくなり、シンプルに記述できます。このようにC#では、ラムダ式でイベント登録できます。
イベントキャンセル
C#でのイベントキャンセル方法について紹介します。ここでは、セーブしないままアプリケーションを終了しようとすると、終了をキャンセルする流れとします。実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
using System; using System.Windows.Forms; using System.Drawing; using System.ComponentModel; namespace WindowsFormsApp1 { public partial class Form1 : Form { Button button; bool isSaved = false; public Form1() { // ボタン button = new Button(); button.Location = new Point(10, 10); button.Text = "save"; // イベント登録 button.Click += (sender, e) => { MessageBox.Show("Saved!"); isSaved = true; }; this.Controls.Add(button); this.Closing += new CancelEventHandler(this.Form1_Closing); } private void Form1_Closing(Object sender, CancelEventArgs e) { // 未saveの場合 if (!isSaved) { // イベントをキャンセルする e.Cancel = true; MessageBox.Show("Please save."); } // save済みの場合 else { e.Cancel = false; } } } } |
「save」ボタンをクリックせずに×ボタンで終了しようとすると、「Please save.」というメッセージが表示され、アプリケーションを終了できません。「e.Cancel = true;」でイベントをキャンセルしています。
「save」ボタンクリック後であれば、×ボタンでアプリケーションを終了できます。このようにC#では、イベントのキャンセルができます。
イベント削除
C#でのイベント削除方法について紹介します。「button1.Click +=」でイベントを登録できますが、「button1.Click -=」でイベントを削除できます。実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
using System; using System.Windows.Forms; using System.Drawing; namespace WindowsFormsApp1 { public partial class Form1 : Form { Button button1, button2; public Form1() { // ボタン button1 = new Button(); button1.Location = new Point(10, 10); button1.Text = "button1"; // イベントハンドラ EventHandler handler1 = (sender, e) => { MessageBox.Show("ボタン1がクリックされました。"); }; // イベント登録 button1.Click += handler1; this.Controls.Add(button1); // ボタン button2 = new Button(); button2.Location = new Point(10, 40); button2.Text = "button2"; // イベントハンドラ EventHandler handler2 = (sender, e) => { MessageBox.Show("ボタン1のイベントハンドラを削除します。"); // イベント削除 button1.Click -= handler1; button2.Enabled = false; }; // イベント登録 button2.Click += handler2; this.Controls.Add(button2); } } } |
「button1」をクリックするとMessageBoxが表示されますが、button2をクリックするとhandler1が削除されるので、ボタンクリックイベントが削除されます。「button1」をクリックしてもMessageBoxは表示されなくなります。
エンジニア
マネージャー
まとめ
いかがでしたでしょうか。C#でのイベントの扱い方について説明しました。
Windows Formアプリケーションでのイベント登録方法、ラムダ式での記述方法について紹介しました。また、イベントのキャンセル方法や削除方法についても紹介しました。
ぜひご自身でC#のソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


C#新着案件New Job
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅)システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅)デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅)デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅)基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅)基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)