C#でのFormのLoadイベントの特徴について詳しく解説!

エンジニア
マネージャー
C#でのFormのLoadイベントについて
今回は、C#でのFormのLoadイベントについてご説明していきます。
Loadイベントと、他のイベントとの順序性や、Loadイベントの特徴について説明します。C#でのFormのLoadイベントに興味のある方はぜひご覧ください。
Loadイベント
C#でFormのLoadイベントを作成するには、以下のようにします。
実際のソースコードを見てみましょう。
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; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { this.Load += Form1_Load; } private void Form1_Load(object sender, EventArgs e) { Console.WriteLine("Form1_Load"); } } } |
起動時にコンソールに”Form1_Load”が出力されることが分かります。
起動時のイベント順序
Form起動時には、Loadイベント・Shownイベント・Activatedイベントがあります。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 46 47 48 49 50 51 52 53 54 55 56 57 |
using System; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { this.Load += Form1_Load; this.Activated += Form1_Activated; this.Shown += Form1_Shown; this.Deactivate += Form1_Deactivate; this.FormClosing += Form1_FormClosing; this.FormClosed += Form1_FormClosed; } private void Form1_Load(object sender, EventArgs e) { Console.WriteLine(DateTime.Now + " Form1_Load"); } private void Form1_Activated(object sender, EventArgs e) { Console.WriteLine(DateTime.Now + " Form1_Activated"); } private void Form1_Shown(object sender, EventArgs e) { Console.WriteLine(DateTime.Now + " Form1_Shown"); } private void Form1_Deactivate(object sender, EventArgs e) { Console.WriteLine(DateTime.Now + " Form1_Deactivate"); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { Console.WriteLine(DateTime.Now + " Form1_FormClosing"); } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { Console.WriteLine(DateTime.Now + " Form1_FormClosed"); } } } |
起動後に、別のWindowを選択したりFormを選択したりしてFormを終了させると、コンソールには以下のような出力結果となります。
1 2 3 4 5 6 7 8 9 10 |
2020/07/05 13:35:53 Form1_Load 2020/07/05 13:35:53 Form1_Activated 2020/07/05 13:35:53 Form1_Shown 2020/07/05 13:36:02 Form1_Deactivate 2020/07/05 13:36:03 Form1_Activated 2020/07/05 13:36:04 Form1_Deactivate 2020/07/05 13:36:06 Form1_Activated 2020/07/05 13:36:07 Form1_FormClosing 2020/07/05 13:36:07 Form1_FormClosed 2020/07/05 13:36:08 Form1_Deactivate |
Loadイベントは、Formが初めて表示される直前に発生します。(1回のみ)Activatedイベントは、FormがActivateになると発生します。
Shownイベントは、Formが初めて表示されるときに発生します。(1回のみ)起動時は、Load→Activated→Shownの順に発生します。
その後、別のWindowにFocusを移動するとDeactivateイベントが発生します。Formの終了時には、FormClosing→FormClosed→Deactivateの順に発生します。
C#では、このような順でイベントが発生します。
Loadのタイミング
C#でのLoadイベントは、Formが初めて表示される直前に発生します。
実際にFormの表示前にイベントが発生していることを確認してみましょう。
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
using System; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { this.Load += Form1_Load; this.Shown += Form1_Shown; this.Activated += Form1_Activated; this.Deactivate += Form1_Deactivate; this.FormClosing += Form1_FormClosing; this.FormClosed += Form1_FormClosed; } private void Form1_Load(object sender, EventArgs e) { Console.WriteLine(DateTime.Now + " Form1_Load"); MessageBox.Show("Form1_Load"); } private void Form1_Shown(object sender, EventArgs e) { Console.WriteLine(DateTime.Now + " Form1_Shown"); MessageBox.Show("Form1_Shown"); } private void Form1_Activated(object sender, EventArgs e) { Console.WriteLine(DateTime.Now + " Form1_Activated"); } private void Form1_Deactivate(object sender, EventArgs e) { Console.WriteLine(DateTime.Now + " Form1_Deactivate"); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { Console.WriteLine(DateTime.Now + " Form1_FormClosing"); } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { Console.WriteLine(DateTime.Now + " Form1_FormClosed"); } } } |
実行すると、”Form1_Load”のMessageBoxが表示され、OKボタンをクリックするとFormが表示されることが分かります。
その後、”Form1_Shown”のMessageBoxが表示されます。
Loadのタイミング その2
C#でのLoadイベント発生時はFormが表示されていないため、やらないほうが良いことがあります。
例えば、Form起動時に特定のコントロールにFocusを当てたい場合、Loadイベントではやるべきではありません。
実際のソースコードで確認してみましょう。
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 46 47 |
using System; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { Button button1, button2; public Form1() { button1 = new Button(); button1.Location = new Point(10, 10); button1.Text = "button1"; button2 = new Button(); button2.Location = new Point(10, 40); button2.Text = "button2"; this.Load += Form1_Load; this.Shown += Form1_Shown; this.Controls.Add(button1); this.Controls.Add(button2); } private void Form1_Load(object sender, EventArgs e) { Console.WriteLine(DateTime.Now + " Form1_Load"); // button2.Focus(); // ここでFocus()しても反映されない } private void Form1_Shown(object sender, EventArgs e) { Console.WriteLine(DateTime.Now + " Form1_Shown"); button2.Focus(); // ここでFocus()すれば反映される } } } |
この場合、ShownイベントでFocusすると、button2にFocusされることが分かります。
Loadイベントでbutton2.Focus()を実行しても、button1にFocusがある状態です。
C#では、Loadイベントはコントロールの初期処理、Shownイベントは時間のかかる初期処理を実施するとよいです。
ボタンイベントでFormLoad実行
イベントハンドラも関数なので、ボタンのClickイベントでLoadイベントを実行することもできます。
実際のソースコードを見てみましょう。
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 46 47 48 49 50 51 52 53 |
using System; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { Button button1, button2; public Form1() { button1 = new Button(); button1.Location = new Point(10, 10); button1.Text = "button1"; button2 = new Button(); button2.Location = new Point(10, 40); button2.Text = "button2"; button1.Click += Button1_Click; this.Load += Form1_Load; this.Shown += Form1_Shown; this.Controls.Add(button1); this.Controls.Add(button2); } private void Form1_Load(object sender, EventArgs e) { Console.WriteLine(DateTime.Now + " Form1_Load"); } private void Form1_Shown(object sender, EventArgs e) { Console.WriteLine(DateTime.Now + " Form1_Shown"); button2.Focus(); } private void Button1_Click(object sender, EventArgs e) { Form1_Load(this, EventArgs.Empty); } } } |
button1をClickすると、Loadイベントが実行されることが分かります。
エンジニア
マネージャー
C#でのFormのLoadイベントの特徴について知ろう
いかがでしたでしょうか。C#でのFormのLoadイベントと他のイベントとの順序性や、Loadイベントの特徴について説明しました。ぜひご自身で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万円東京都新宿区(西新宿駅)