WinFormsのコントロールとは? プロパティ・クラス・イベントを理解しよう
Windows Forms(WinForms)でアプリを作るとき、フォーム上にはボタンやラベル、テキストボックスなど、さまざまな部品を配置します。
これらの部品は、まとめてコントロールと呼ばれます。
Visual Studioでは、ツールボックスからドラッグ&ドロップするだけで簡単に配置できますが、内部ではC#のクラスやオブジェクト、プロパティ、イベントといった仕組みが使われています。
今回は、次の問題をもとにWinFormsのコントロールの仕組みを確認していきます。
- 1. 問題
- 2. A. プロパティウィンドウで値を変更できる
- 3. プロパティとは何か
- 4. B. ボタンやラベルはクラスとして定義されている
- 5. クラスとオブジェクトの違い
- 6. 実際にはButtonも継承によって作られている
- 7. C. イベントハンドラは特定の操作時に実行するメソッドを指定する
- 8. イベントとイベントハンドラの関係
- 9. 「イベントハンドラを指定する」とはどういうことか
- 10. Visual Studioではイベントも自動設定できる
- 11. D. フォームへドラッグすると「静的クラス」が作成される
- 12. 静的クラスとは
- 13. デザイナーで配置したボタンはどこで作られているのか
- 14. デザイナーとコードは別物ではない
- 15. WinFormsを理解するための重要な関係
- 16. コードで一度に確認してみよう
- 17. まとめ
問題
WinForms のコントロールに関する説明として正しいものをすべて選びなさい。
A. プロパティウィンドウで値を変更できる
B. ボタンやラベルはクラスとして定義されている
C. イベントハンドラは特定の操作時に実行するメソッドを指定する
D. フォームへドラッグすると「静的クラス」が作成される
正解は、
A・B・C
です。
Dは誤りです。
それぞれ詳しく見ていきましょう。

A. プロパティウィンドウで値を変更できる
これは正しい説明です。
Visual Studioでフォーム上のボタンなどを選択すると、プロパティウィンドウにさまざまな設定項目が表示されます。
例えば、Buttonコントロールでは次のような項目があります。
NameTextBackColorFontSizeLocationEnabledVisible
例えば、ボタンに表示する文字を変更する場合は、Textプロパティを変更します。
button1.Text = "実行";
プロパティウィンドウでTextを変更する操作も、考え方としてはこのコードと同じです。
つまり、Visual Studioのプロパティウィンドウは、
オブジェクトのプロパティを画面上から設定するための機能
と考えることができます。
プロパティとは何か
プロパティは、そのオブジェクトが持っている状態や設定値を表します。
例えばButtonなら、
button1.Text
button1.Width
button1.Height
button1.Enabled
といったプロパティを持っています。
次のコードでは、ボタンの表示文字やサイズを変更しています。
button1.Text = "登録";
button1.Width = 120;
button1.Height = 40;
このように、WinFormsでは多くの見た目や動作をプロパティによって設定できます。
B. ボタンやラベルはクラスとして定義されている
これも正しい説明です。
WinFormsのButtonやLabelは、単なる画像や画面上の部品ではありません。
C#では、それぞれクラスとして定義されています。
例えば、
Button
Label
TextBox
CheckBox
RadioButton
ListBox
などは、すべてクラスです。
そのため、コードから自分でButtonオブジェクトを作ることもできます。
Button button = new Button();
button.Text = "クリック";
button.Width = 100;
button.Height = 40;
さらにフォームへ追加すると、画面上に表示できます。
Controls.Add(button);
まとめると次のようになります。
Button button = new Button();
button.Text = "クリック";
button.Width = 100;
button.Height = 40;
Controls.Add(button);
Visual Studioのデザイナーでボタンをドラッグ&ドロップした場合も、内部ではこれに近い処理が自動的に生成されています。
クラスとオブジェクトの違い
ここは特に重要です。
Buttonはクラスです。
Button
一方で、
button1
は、そのButtonクラスから作られたオブジェクトです。
イメージとしては、
Buttonクラス
↓
new
↓
Buttonオブジェクト
となります。
コードで書くと、
Button button1 = new Button();
です。
Buttonが設計図、button1がその設計図から作られた実体、と考えると分かりやすいでしょう。
実際にはButtonも継承によって作られている
Buttonクラスは、完全に独立したクラスではありません。
WinFormsでは、多くのコントロールが共通のクラスを継承しています。
大まかには次のような関係があります。
Object
↓
MarshalByRefObject
↓
Component
↓
Control
↓
ButtonBase
↓
Button
Labelの場合は、
Object
↓
MarshalByRefObject
↓
Component
↓
Control
↓
Label
となります。
ButtonやLabelに、
Width
Height
Location
Visible
Enabled
など共通したプロパティがあるのは、共通の基底クラスであるControlから機能を受け継いでいるためです。
これが継承です。
C. イベントハンドラは特定の操作時に実行するメソッドを指定する
これも正しい説明です。
WinFormsでは、ユーザーの操作などをきっかけとして処理を実行できます。
例えば、
- ボタンをクリックした
- テキストボックスの内容が変わった
- フォームが読み込まれた
- マウスが動いた
- キーが押された
といった出来事をイベントと呼びます。
例えばButtonにはClickイベントがあります。
button1.Click += button1_Click;
そして、クリックされたときに実行するメソッドを用意します。
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("クリックされました");
}
このbutton1_Clickのようなメソッドを、イベントハンドラと呼びます。
イベントとイベントハンドラの関係
イメージすると次のようになります。
ユーザー
↓
ボタンをクリック
↓
Clickイベント発生
↓
イベントハンドラ実行
↓
button1_Click()
つまり、イベントハンドラは、
イベントが発生したときに実行する処理を記述するメソッド
です。
「イベントハンドラを指定する」とはどういうことか
例えば次のコードがあります。
button1.Click += button1_Click;
これは、
button1のClickイベントが発生したら、button1_Clickメソッドを呼び出してください
という意味です。
+=が使われていることにも注目してください。
イベントには、実行するメソッドを登録するという仕組みがあります。
WinFormsを学ぶと、イベントは単なる「クリックされたら動く仕組み」に見えますが、C#の文法としては、
- event
- delegate
- メソッド
+=
などが組み合わされて動いています。
Visual Studioではイベントも自動設定できる
フォームデザイナーでButtonをダブルクリックすると、Visual Studioが自動的にイベントハンドラを作ってくれます。
例えば、
private void button1_Click(object sender, EventArgs e)
{
}
が作成されます。
同時に、内部ではClickイベントとこのメソッドが関連付けられます。
そのため、普段はイベントの仕組みを強く意識しなくてもWinFormsアプリを作ることができます。
ただし、内部の仕組みを理解しておくと、後でラムダ式や独自イベントを学ぶときにも役立ちます。
D. フォームへドラッグすると「静的クラス」が作成される
これは誤りです。
フォームへButtonなどをドラッグしても、静的クラスが作られるわけではありません。
作成されるのは、Buttonクラスなどのオブジェクトです。
例えば、フォームにButtonを1つ配置すると、フォームクラスには次のようなフィールドが作成されます。
private Button button1;
そして、初期化処理の中でButtonオブジェクトが作られます。
button1 = new Button();
つまり、
Buttonクラス
↓
new
↓
button1というオブジェクト
という関係です。
静的クラスとは
静的クラスは、staticを付けて定義する特殊なクラスです。
例えば、
static class MyUtility
{
public static int Add(int a, int b)
{
return a + b;
}
}
このようなクラスは、
new MyUtility();
のようにオブジェクトを作ることができません。
一方、WinFormsのButtonは、
new Button();
とオブジェクトを作る必要があります。
したがって、Buttonは静的クラスではありません。
デザイナーで配置したボタンはどこで作られているのか
フォームにButtonを配置した場合、Visual Studioはコードを自動生成します。
例えば、概念的には次のようなコードです。
private Button button1;
そして、
private void InitializeComponent()
{
button1 = new Button();
button1.Text = "button1";
button1.Location = new Point(100, 100);
button1.Size = new Size(100, 40);
Controls.Add(button1);
}
実際のコードは.Designer.csファイルに生成されます。
例えば、
Form1.cs
Form1.Designer.cs
という2つのファイルを見ることがあります。
フォームデザイナーが生成するコードは、主にForm1.Designer.cs側へ保存されています。
そのため、フォーム上へドラッグ&ドロップする操作は、
C#コードを書かずに、Visual Studioにオブジェクト生成コードを書いてもらっている
と考えると分かりやすいでしょう。
デザイナーとコードは別物ではない
Visual Studioのフォームデザイナーを見ると、
「画面を作る作業」
と、
「C#を書く作業」
が別々に見えるかもしれません。
しかし、実際にはつながっています。
例えばデザイナーで、
Text → 登録
Width → 120
Height → 40
と設定すると、内部ではそれに対応するコードが生成されます。
イメージとしては、
フォームデザイナー
↓
プロパティ設定
↓
Designer.csへコード生成
↓
実行時にオブジェクト生成
となります。
WinFormsを理解するための重要な関係
WinFormsでは、次の4つの関係を整理しておくと理解しやすくなります。
クラス
コントロールの設計図です。
Button
Label
TextBox
オブジェクト
クラスから実際に作られたものです。
button1
label1
textBox1
プロパティ
オブジェクトの状態や設定値です。
button1.Text
button1.Width
button1.Enabled
イベント
ユーザー操作などによって発生する出来事です。
button1.Click
textBox1.TextChanged
これらをまとめると、
Buttonクラス
↓
Buttonオブジェクト
↓
┌─────────────┐
│ プロパティ │ Text / Width / Enabled
│ イベント │ Click
└─────────────┘
という関係になります。
コードで一度に確認してみよう
次のコードを見ると、クラス・オブジェクト・プロパティ・イベントの関係が分かります。
Button button = new Button();
button.Text = "実行";
button.Width = 100;
button.Height = 40;
button.Click += Button_Click;
Controls.Add(button);
イベントハンドラはこちらです。
private void Button_Click(object? sender, EventArgs e)
{
MessageBox.Show("ボタンが押されました");
}
それぞれを分解すると、
Button
はクラスです。
button
はオブジェクトです。
button.Text
button.Width
button.Height
はプロパティです。
button.Click
はイベントです。
Button_Click
はイベントハンドラです。
WinFormsの基本的な仕組みが、この短いコードの中にまとまっています。
まとめ
今回の問題の正解は、
A・B・C
です。
それぞれの理由を整理すると、次のようになります。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| A | ○ | コントロールのプロパティはプロパティウィンドウから変更できる |
| B | ○ | ButtonやLabelはC#のクラスとして定義されている |
| C | ○ | イベントハンドラはイベント発生時に実行するメソッドである |
| D | × | 配置されるのは静的クラスではなく、コントロールのオブジェクト |
WinFormsを学ぶときは、単に「ボタンを配置する」「イベントを書く」と操作だけを覚えるのではなく、
クラス
↓
オブジェクト
↓
プロパティ
↓
イベント
↓
イベントハンドラ
というC#の仕組みと結び付けて考えることが重要です。
フォームデザイナーで行っている操作も、最終的にはC#のコードへ変換されています。
この関係が分かるようになると、WinFormsだけでなく、オブジェクト指向やイベント、デリゲート、ラムダ式といったC#の学習にもつながっていきます。











ディスカッション
コメント一覧
まだ、コメントがありません