
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#のソースコードを書いて、理解を深めてみましょう。