第19章 Windowsフォームアプリ作成の基本
この章の目的
Section titled “この章の目的”この章では、書籍「作って覚える Visual C# 2022 デスクトップアプリ超入門」の Chapter 3「プログラム作成の基本を覚える」 を参照しながら、Windows フォームアプリ作成の基本を学習します。
書籍 Chapter 3 では、SimpleCalc(簡単計算プログラム)を題材に、次の流れを体験します。
画面に部品を配置する ↓部品のプロパティを設定する ↓ボタンクリックなどのイベントに処理を書く ↓入力された値を取り出す ↓結果を画面に表示する第 18 章で確認した「画面部品はオブジェクト」「イベント駆動」の考え方を、実際にコードを書いて体験します。
書籍に 「作る」 → 「動く」 → 「振り返る」 の流れがすべて書かれているので、書籍を手元に開いて手を動かしながら進めてください。 本テキスト側では、研修固有のポイント・これまでの C# 知識との接続・演習指示に絞って書きます。
この章を読むタイミング
Section titled “この章を読むタイミング”本章は オブジェクト指向(第 7〜15 章)を学んでいる途中でも実施できます。
ただし、本章では int.TryParse と例外処理(第 15 章)を使うため、第 15 章まで終えた後 に進めるのがおすすめです。
| 前提知識 | 必要章 | 用途 |
|---|---|---|
| クラス・メソッド | 第 7 章 | Form1 クラス、CalcButton_Click メソッドの理解 |
| メソッド分離 | 第 10 章 | 書籍 3.7 の InputCheck メソッド |
int.Parse の例外 | 第 15 章 | int.TryParse でユーザー入力エラーに備える |
並行受講では、講師が指示するタイミングで本章に進みます。第 18 章で体験した「画面部品もオブジェクトである」を、本章で 実際にコードを書いて確かめる 章です。
この章で使用する書籍範囲
Section titled “この章で使用する書籍範囲”| 範囲 | 内容 |
|---|---|
| Chapter 3 | プログラム作成の基本を覚える(SimpleCalc) |
書籍内では、次の節をひととおり実施します。
- 3.1 簡単計算プログラムの完成イメージ
- 3.5 ボタンをクリックしたときの処理の書き方
- 3.7 サブルーチンの使い方
この章でできるようになること
Section titled “この章でできるようになること”この章を終えると、次のことができるようになります。
- フォームに
Label・TextBox・Buttonを配置できる - コントロールの
NameプロパティとTextプロパティの違いを説明できる - ボタンの クリックイベント(
Click)にイベントハンドラーを作成できる TextBox.Textで入力値を取得できるLabel.Text(または別のTextBox.Text)に結果を表示できるint.Parseやint.TryParseを使って、文字列を整数に変換できる(第 15 章の復習)- 共通処理を メソッド に分けられる(第 7・10 章の復習)
- イベント駆動の流れを自分の言葉で説明できる
本章で使用する環境
Section titled “本章で使用する環境”| 項目 | 内容 |
|---|---|
| 開発環境 | Visual Studio 2022 |
| プロジェクト種類 | Windows フォーム アプリ |
| 対象フレームワーク | .NET 8 |
| プロジェクト名 | SimpleCalc(書籍と合わせる) |
csproj の Nullable は disable に変更してください
プロジェクト作成後、
SimpleCalc.csprojを開いて<Nullable>disable</Nullable>に変更してください。 詳しい手順は、第 1 章「1-1 プロジェクトを作成する」を参照してください。
作業前チェック
Section titled “作業前チェック”作業を始める前に、次の内容を確認してください。
- 第 18 章の体験課題を一通り触っている(Forms プロジェクト作成・実行ができる)
- 書籍 Chapter 3 の該当ページを開ける状態である
- Windows フォームアプリのプロジェクトを作成できる(第 18 章)
-
int.Parseとint.TryParseの違いを思い出せる(第 15 章) - メソッドを定義して呼び出せる(第 7・10 章)
19-1 Windows フォームアプリ作成の基本的な流れ
Section titled “19-1 Windows フォームアプリ作成の基本的な流れ”書籍 Chapter 3 で体験する流れは、Windows フォームアプリ作成の 基本パターン です。 今後の章でも、ほぼ同じ流れの繰り返しになります。
1. どんな画面にするかを決める2. フォームに部品(コントロール)を配置する3. 部品の Name と Text を設定する4. ボタンなどのイベントに処理を書く5. 実行して動作を確認する6. 必要に応じて修正するコンソールアプリでは「コードを書く → 実行する」の往復でしたが、Windows フォームアプリでは フォームデザイナー(画面を作る場所)と コードエディター(処理を書く場所)を行ったり来たりします。
| 場所 | 役割 |
|---|---|
| フォームデザイナー | 画面を視覚的に作る、プロパティを設定する |
| プロパティウィンドウ | 選択中の部品の設定を変更する |
| コードエディター | C# の処理(イベントハンドラーなど)を書く |
19-2 フォームとコントロール
Section titled “19-2 フォームとコントロール”| 用語 | 意味 | 例 |
|---|---|---|
| フォーム | 画面そのもの | Form1 |
| コントロール | フォーム上に配置する部品 | Label、TextBox、Button など |
書籍 Chapter 3 で使う代表的なコントロール:
| コントロール | 役割 | 主に使うプロパティ |
|---|---|---|
Label | 文字を表示 | Text |
TextBox | 文字を入力 | Text |
Button | クリック操作を受け取る | Text、Click イベント |
これらのコントロールを使う流れは、今後の Forms 学習でも繰り返し出てきます。
19-3 Name プロパティと Text プロパティ
Section titled “19-3 Name プロパティと Text プロパティ”部品の設定でよく使うのが、Name プロパティと Text プロパティです。
意味が違うので、混同しないよう注意 してください。
| プロパティ | 意味 |
|---|---|
Name | プログラム上で部品を区別する名前。コードから input1TextBox.Text のように使う |
Text | 画面に表示される文字。利用者の目に入る |
たとえば、計算ボタンの場合:
| プロパティ | 値の例 | 効果 |
|---|---|---|
Name | CalcButton | コード上で CalcButton.Click などと参照 |
Text | 計算 | ボタンに表示される文字 |
書籍 Chapter 3 でも、コントロールに 分かりやすい Name を付けるところから始まります。
たとえば SimpleCalc では、input1TextBox、input2TextBox、answerTextBox、CalcButton のような名前が使われます。
補足:Name の命名習慣
部品の
Nameは、「役割 + 部品の種類」 の形にすると分かりやすくなります(input1TextBox、CalcButtonのように)。 第 7 章で学んだ「変数名は意味が伝わるように」と同じ考え方が、画面部品にも当てはまります。
19-4 イベントとイベントハンドラー
Section titled “19-4 イベントとイベントハンドラー”利用者の操作をきっかけに処理が動くのが、Windows フォームアプリの特徴です(第 18 章)。 操作の種類 を イベント と呼び、それに対応する処理を書いたメソッドを イベントハンドラー と呼びます。
利用者がボタンをクリックする ↓Click イベントが発生する ↓ボタンに紐付いたイベントハンドラーが呼ばれる ↓そのメソッドの中身が実行される書籍 Chapter 3.5 でも、ボタンをダブルクリックすると Visual Studio が自動でイベントハンドラーを作る手順が解説されています。
イベントハンドラーの基本形:
private void CalcButton_Click(object sender, EventArgs e){ // ボタンがクリックされたときの処理}| 部分 | 意味 |
|---|---|
private void | このクラスの中だけから呼ばれるメソッド、戻り値なし |
CalcButton_Click | ボタン名(Name) + イベント名(Click) ─ Visual Studio が自動命名 |
object sender | イベントを発生させた部品(ここではボタン自身) |
EventArgs e | イベントの追加情報(基本的に意識しなくて OK) |
object sender と EventArgs e の中身は、当面意識しなくて構いません。
「ボタンが押されたら、このメソッドの中身が動く」 とだけ覚えれば OK です。
19-5 入力値の取り出しと結果の表示
Section titled “19-5 入力値の取り出しと結果の表示”TextBox.Text で入力値を取り出す
Section titled “TextBox.Text で入力値を取り出す”TextBox に入力された文字は、Text プロパティで取り出します。
string input = input1TextBox.Text;数値として扱いたい場合は、これまでに学んだ int.Parse を使います(第 3・15 章)。
int valueLeft = int.Parse(input1TextBox.Text);これは、コンソールアプリで Console.ReadLine() から受け取った文字列を int.Parse する流れと 同じ考え方 です。
入力元が Console から TextBox に変わっただけです。
| 入力元 | 取り出し方 |
|---|---|
| コンソール | string s = Console.ReadLine(); |
TextBox | string s = input1TextBox.Text; |
Label.Text または TextBox.Text に結果を表示
Section titled “Label.Text または TextBox.Text に結果を表示”コンソールアプリでは結果を Console.WriteLine で表示しました。
Windows フォームアプリでは、Label や TextBox の Text プロパティに値を入れます。
answerTextBox.Text = valueAnswer.ToString();int を string に変換するには .ToString() を使います。
逆方向(文字列 → 数値)が int.Parse で、対称になっています。
| 表示先 | 表示方法 |
|---|---|
| コンソール | Console.WriteLine(valueAnswer); |
Forms の TextBox・Label | answerTextBox.Text = valueAnswer.ToString(); |
SimpleCalc(書籍 3.1〜3.5)の処理の骨格
Section titled “SimpleCalc(書籍 3.1〜3.5)の処理の骨格”書籍 Chapter 3 の CalcButton_Click の中身は、おおまかに次の構造です(具体的なコードは書籍を参照してください)。
1. input1TextBox.Text と input2TextBox.Text を取り出す2. それぞれを int に変換する3. 足し算する4. 結果を answerTextBox.Text に表示する第 3 章(算術演算子)・第 15 章(int.Parse の例外)で学んだ知識がそのまま活きます。
19-6 共通処理をサブルーチン化(書籍 3.7)
Section titled “19-6 共通処理をサブルーチン化(書籍 3.7)”書籍 3.7 では、入力チェック処理を サブルーチン(メソッド) に分けます。
おおまかな構造:
CalcButton_Click の中で: InputCheck を呼んで input1TextBox.Text を整数に変換 InputCheck を呼んで input2TextBox.Text を整数に変換 足し算して結果を表示
InputCheck メソッド: 引数で受け取った文字列を int.TryParse で変換 成功なら変換した値、失敗なら 0 を返すこれは、第 7 章・第 10 章で学んだ メソッドの分離 と同じです。
int.TryParse は第 15 章で学んだ「例外を出さずに変換可否をチェックする」方法です。
int.TryParseの出番ユーザーが
TextBoxに何を入れるかは事前に分かりません。 数字以外を入れられても 例外でアプリが止まらない よう、Forms ではint.TryParseがよく使われます。 書籍 3.7 のInputCheckも、まさにこのパターンです。
19-7 Forms とこれまでの C# 知識のつながり
Section titled “19-7 Forms とこれまでの C# 知識のつながり”書籍 Chapter 3 の SimpleCalc を通じて、これまでに学んだ概念が次のように Forms に対応します。
| 学んだ章 | 概念 | Forms での対応 |
|---|---|---|
| 第 3 章 | 算術演算子 | valueLeft + valueRight の足し算そのまま |
| 第 7 章 | プロパティ・メソッド | textBox.Text がプロパティ、Click イベントハンドラーがメソッド |
| 第 10 章 | メソッドの分離 | 書籍 3.7 の InputCheck メソッド |
| 第 13 章 | 継承 | Form1 : Form、Button などのコントロールも継承で作られている |
| 第 15 章 | int.Parse の例外 | TextBox 入力で例外が起きないよう int.TryParse を使う |
Forms 編は、これまで学んだ C# の総合演習 とも言える内容です。 新しい構文を覚えるというより、既知の知識を画面アプリで使い直す 感覚で進めてください。
よくあるつまずき
Section titled “よくあるつまずき”| つまずき | 原因 | 対応 |
|---|---|---|
Name と Text を混同する | プロパティの意味が曖昧 | Name はコード用、Text は画面表示用 |
| イベントハンドラーが二重に作られる | ボタンを誤ってダブルクリックを繰り返した | Form1.Designer.cs を確認して、不要なハンドラー登録を消す(または書籍 Chapter 3 の手順に戻る) |
int.Parse で例外が出てアプリが止まる | 数字以外が入力された | 書籍 3.7 のとおり int.TryParse でチェック |
| ボタンを押しても何も起きない | イベントハンドラーが紐付いていない | プロパティウィンドウの「イベント」タブで Click を確認 |
TextBox.Text がコンパイル時に値を持っている気がする | Text は実行時の値 | Text を読むのは、ボタンが押された 後 |
| 計算結果が表示されない | .ToString() を忘れた | int を Text に入れる前に .ToString() |
valueLeft などの変数が分からない | スコープを意識していない | イベントハンドラー内のローカル変数(第 7 章) |
学んだことチェック
Section titled “学んだことチェック”- フォームに
Label・TextBox・Buttonを配置できる -
NameプロパティとTextプロパティを使い分けられる - ボタンの
Clickイベントにイベントハンドラーを作成できる -
TextBox.Textで入力値を取得できる -
int.Parseで文字列を整数に変換できる -
Label.TextやTextBox.Textに結果を表示できる -
.ToString()でintを文字列に変換できる - 共通処理をメソッドに分けられる
-
int.TryParseを使って入力エラーに対応できる - イベント駆動の流れを自分の言葉で説明できる
研修の進め方によっては、隣の人またはチーム内で説明確認を行います。
次の内容を、自分の言葉で説明してください。
NameプロパティとTextプロパティの違いは何ですか。- ボタンクリックの処理は、どこに書きますか。
TextBox.Textで取り出した値はどんな型ですか。それを整数として使うにはどうしますか。int.Parseとint.TryParseの使い分けは、Forms ではどう考えますか。- 書籍 3.7 で
InputCheckメソッドに分けると、どんなメリットがありますか。 - 「イベント駆動」を自分の言葉で説明してください。
書籍 Chapter 3 を参照しながら作業します。 画面操作・部品配置の細かな手順は書籍に書かれているので、書籍を手元に開いて進めてください。
本章の進め方
Section titled “本章の進め方”| 段階 | 目安時間 | 内容 |
|---|---|---|
| ① 準備 | 10 分 | ペア確認 + 課題確認(評価対象外) |
| ② ソロ作業 | 40 分 | タイマーで計測。タイマー時点の commit が唯一の評価対象 |
| ③ チーム時間 | 講師指定の発表開始時刻まで | レビュー + 発表者選出 + 実装続行(任意)。発表開始時刻は厳守 |
提出ルール(タイマー方式)
タイマー時点の commit が唯一の評価対象です。タイマー後の書き足しは評価されません。 コミットメッセージ形式:
Chapter19 タイマー提出: <どこまで完成> / <詰まったポイント>(なければ「特になし」) 例:Chapter19 タイマー提出: 必須19-1完成、19-2 InputCheck途中 / TryParse の out 引数の書き方を確認中
提出方法:Git が使えないときはサーバへコピー
Git の調子が悪いときは、講師の指示に従って
SimpleCalcプロジェクトのフォルダを提出先サーバへコピーしてください。コピー後、提出先フォルダにエクスプローラーの右クリック→新規作成→テキスト ドキュメントで提出メモ.txt(「どこまで完成」「詰まったポイント」を記載)を作成し、コミットメッセージの代わりにします。
タイマー後のチーム時間の使い方
レビュー・発表者選出・実装続行(任意)を自由配分してください。発表開始時刻は厳守です。
まずは、全員が必須課題に取り組んでください。
課題 19-1 書籍 Chapter 3 を参照して SimpleCalc を完成させる
Section titled “課題 19-1 書籍 Chapter 3 を参照して SimpleCalc を完成させる”書籍 Chapter 3 の 3.1 〜 3.5 を参照して、SimpleCalc を完成させてください。
仕様(書籍 Chapter 3 と同じ)
- プロジェクト名:
SimpleCalc - フォームに次のコントロールを配置:
Label(2 つの入力欄の説明用)TextBox(Name:input1TextBox、input2TextBox)Button(Name:CalcButton、Text:計算)TextBox(Name:answerTextBox、結果表示用)
CalcButtonのClickイベントで:input1TextBox.Textとinput2TextBox.Textをint.Parseで整数に変換- 足し算して
answerTextBox.Textに結果を表示
確認すること
- フォームに必要なコントロールが配置できている
- 各コントロールの
Nameが分かりやすい名前になっている - 「計算」ボタンを押すと足し算結果が表示される
- csproj が
<Nullable>disable</Nullable>になっている
課題 19-2 書籍 3.7 を参照して入力チェックを追加する
Section titled “課題 19-2 書籍 3.7 を参照して入力チェックを追加する”課題 19-1 の SimpleCalc に対して、書籍 3.7 を参照しながら、入力チェック処理を サブルーチン(InputCheck メソッド) に分けてください。
仕様(書籍 3.7 と同じ)
int.TryParseを使って、文字列を整数に変換できるか試す- 変換できなければ
0を返す CalcButton_Clickの中で 2 回InputCheckを呼び出す
確認すること
-
InputCheckメソッドが定義されている - 数字以外を入力しても例外でアプリが止まらない
- 数字以外を入力した場合、
0として計算される(例:abc + 5なら結果が5)
必須課題が終わった人は、発展課題に取り組んでください。
課題 19-3 空欄やエラー時にメッセージを表示する
Section titled “課題 19-3 空欄やエラー時にメッセージを表示する”InputCheck で変換に失敗した場合、「結果」欄ではなく別の場所(Label など)にエラーメッセージを表示 してください。
仕様
- フォームに
Label(Name:messageLabel、初期Textは空)を追加 CalcButton_Clickで:- 入力値が両方とも整数なら計算結果を表示し、
messageLabel.Textを空にする - どちらかが整数に変換できなければ、
messageLabel.Textに「整数を入力してください。」と表示し、answerTextBox.Textを空にする
- 入力値が両方とも整数なら計算結果を表示し、
int.TryParseを使う
ヒント
InputCheckの戻り値をboolに変えて成功/失敗を返し、out intで値を返す書き方もある- または
string.IsNullOrWhiteSpaceで空欄をチェック
確認すること
- 正しい入力では計算結果が表示される
- 不正入力では分かりやすいメッセージが表示される
- 結果欄とメッセージ欄が混乱しない
課題 19-4 四則演算ボタンを追加する
Section titled “課題 19-4 四則演算ボタンを追加する”SimpleCalc を拡張し、足し算以外の演算もできるようにしてください。
仕様
- 既存の「計算」ボタンを「足し算」ボタンに変える(または並べる)
- 「引き算」「掛け算」「割り算」のボタンをそれぞれ追加
- 各ボタンの
Clickイベントで、対応する計算を行ってanswerTextBox.Textに表示 - 割り算は
intではなくdouble(またはdecimal)で計算し、小数点以下も表示する - 割る数が
0のときはmessageLabel(課題 19-3)に「0 で割ることはできません。」と表示
ヒント
- 4 つのボタンで
InputCheckの処理が共通になる → メソッド化したまま流用できる - 計算部分を別メソッドに切り出してもよい
確認すること
- 4 つの演算がそれぞれ正しく動く
- 割り算が
5 ÷ 2 = 2.5のように小数で表示される -
0で割ろうとしたときにメッセージが表示される
提出前チェックリスト
Section titled “提出前チェックリスト”- プロジェクト名が
SimpleCalc - csproj が
<Nullable>disable</Nullable> - 必須課題のフォームに
input1TextBox・input2TextBox・CalcButton・answerTextBoxが配置されている -
CalcButton_Clickイベントハンドラーが作成されている -
int.Parseまたはint.TryParseを使えている - 結果が画面に表示される
-
InputCheckメソッドに分離できている(必須 19-2) -
bin・obj・.vsフォルダが Git 管理に入っていない - インデントが整っている
- タイマー時点で commit 済み(または
提出メモ.txtを書いた)
Git への提出
Section titled “Git への提出”git statusgit add .git commit -m "Chapter19 タイマー提出: 必須19-1完成、19-2 InputCheck途中 / 特になし"git push origin mainGit が使えないときは、上記コミットの代わりに SimpleCalc プロジェクトのフォルダを提出先サーバへコピーし、コピー先に 提出メモ.txt を作成してください(演習課題の「提出方法:Git が使えないときはサーバへコピー」参照)。
Git の詳しい操作は、付録 C「Git のインストールと提出ルール」 を参照してください。
この章のまとめ
Section titled “この章のまとめ”この章では、書籍 Chapter 3 を参照して SimpleCalc を作りながら、Windows フォームアプリ作成の基本を学びました。
- フォームに
Label・TextBox・Buttonを配置する Name(コード用)とText(画面表示用)を使い分ける- ボタンの
Clickイベントにイベントハンドラーを作る TextBox.Textで入力を取得、int.Parseで整数に変換- 結果は
TextBox.TextやLabel.Textに表示、.ToString()でintを文字列に - 共通処理は メソッド に分離する(書籍 3.7 の
InputCheck) - ユーザー入力には
int.TryParseで備える - これまで学んだ C# 知識(算術演算・プロパティ・メソッド・継承・例外処理)が Forms 上でそのまま活きる
次章では、書籍 Chapter 4「『タイマー』の作成」(Timer プロジェクト)を参照します。
Timer コントロール を使って一定時間ごとに処理を動かす方法を学び、イベント駆動の理解をさらに深めます。
ここでは「ボタンクリック以外のイベント」も体験します。