Skip to content

第19章 Windowsフォームアプリ作成の基本

この章では、書籍「作って覚える Visual C# 2022 デスクトップアプリ超入門」の Chapter 3「プログラム作成の基本を覚える」 を参照しながら、Windows フォームアプリ作成の基本を学習します。

書籍 Chapter 3 では、SimpleCalc(簡単計算プログラム)を題材に、次の流れを体験します。

画面に部品を配置する
部品のプロパティを設定する
ボタンクリックなどのイベントに処理を書く
入力された値を取り出す
結果を画面に表示する

第 18 章で確認した「画面部品はオブジェクト」「イベント駆動」の考え方を、実際にコードを書いて体験します。

書籍に 「作る」 → 「動く」 → 「振り返る」 の流れがすべて書かれているので、書籍を手元に開いて手を動かしながら進めてください。 本テキスト側では、研修固有のポイント・これまでの C# 知識との接続・演習指示に絞って書きます。


本章は オブジェクト指向(第 7〜15 章)を学んでいる途中でも実施できます。 ただし、本章では int.TryParse と例外処理(第 15 章)を使うため、第 15 章まで終えた後 に進めるのがおすすめです。

前提知識必要章用途
クラス・メソッド第 7 章Form1 クラス、CalcButton_Click メソッドの理解
メソッド分離第 10 章書籍 3.7 の InputCheck メソッド
int.Parse の例外第 15 章int.TryParse でユーザー入力エラーに備える

並行受講では、講師が指示するタイミングで本章に進みます。第 18 章で体験した「画面部品もオブジェクトである」を、本章で 実際にコードを書いて確かめる 章です。


範囲内容
Chapter 3プログラム作成の基本を覚える(SimpleCalc)

書籍内では、次の節をひととおり実施します。

  • 3.1 簡単計算プログラムの完成イメージ
  • 3.5 ボタンをクリックしたときの処理の書き方
  • 3.7 サブルーチンの使い方

この章でできるようになること

Section titled “この章でできるようになること”

この章を終えると、次のことができるようになります。

  • フォームに LabelTextBoxButton を配置できる
  • コントロールの Name プロパティと Text プロパティの違いを説明できる
  • ボタンの クリックイベント(Click)にイベントハンドラーを作成できる
  • TextBox.Text で入力値を取得できる
  • Label.Text(または別の TextBox.Text)に結果を表示できる
  • int.Parseint.TryParse を使って、文字列を整数に変換できる(第 15 章の復習)
  • 共通処理を メソッド に分けられる(第 7・10 章の復習)
  • イベント駆動の流れを自分の言葉で説明できる

項目内容
開発環境Visual Studio 2022
プロジェクト種類Windows フォーム アプリ
対象フレームワーク.NET 8
プロジェクト名SimpleCalc(書籍と合わせる)

csproj の Nullable は disable に変更してください

プロジェクト作成後、SimpleCalc.csproj を開いて <Nullable>disable</Nullable> に変更してください。 詳しい手順は、第 1 章「1-1 プロジェクトを作成する」を参照してください。


作業を始める前に、次の内容を確認してください。

  • 第 18 章の体験課題を一通り触っている(Forms プロジェクト作成・実行ができる)
  • 書籍 Chapter 3 の該当ページを開ける状態である
  • Windows フォームアプリのプロジェクトを作成できる(第 18 章)
  • int.Parseint.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# の処理(イベントハンドラーなど)を書く

用語意味
フォーム画面そのものForm1
コントロールフォーム上に配置する部品LabelTextBoxButton など

書籍 Chapter 3 で使う代表的なコントロール:

コントロール役割主に使うプロパティ
Label文字を表示Text
TextBox文字を入力Text
Buttonクリック操作を受け取るTextClick イベント

これらのコントロールを使う流れは、今後の Forms 学習でも繰り返し出てきます。


19-3 Name プロパティと Text プロパティ

Section titled “19-3 Name プロパティと Text プロパティ”

部品の設定でよく使うのが、Name プロパティと Text プロパティです。 意味が違うので、混同しないよう注意 してください。

プロパティ意味
Nameプログラム上で部品を区別する名前。コードから input1TextBox.Text のように使う
Text画面に表示される文字。利用者の目に入る

たとえば、計算ボタンの場合:

プロパティ値の例効果
NameCalcButtonコード上で CalcButton.Click などと参照
Text計算ボタンに表示される文字

書籍 Chapter 3 でも、コントロールに 分かりやすい Name を付けるところから始まります。 たとえば SimpleCalc では、input1TextBoxinput2TextBoxanswerTextBoxCalcButton のような名前が使われます。

補足:Name の命名習慣

部品の Name は、「役割 + 部品の種類」 の形にすると分かりやすくなります(input1TextBoxCalcButton のように)。 第 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 senderEventArgs e の中身は、当面意識しなくて構いません。 「ボタンが押されたら、このメソッドの中身が動く」 とだけ覚えれば OK です。


19-5 入力値の取り出しと結果の表示

Section titled “19-5 入力値の取り出しと結果の表示”

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();
TextBoxstring s = input1TextBox.Text;

Label.Text または TextBox.Text に結果を表示

Section titled “Label.Text または TextBox.Text に結果を表示”

コンソールアプリでは結果を Console.WriteLine で表示しました。 Windows フォームアプリでは、LabelTextBoxText プロパティに値を入れます。

answerTextBox.Text = valueAnswer.ToString();

intstring に変換するには .ToString() を使います。 逆方向(文字列 → 数値)が int.Parse で、対称になっています。

表示先表示方法
コンソールConsole.WriteLine(valueAnswer);
Forms の TextBoxLabelanswerTextBox.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 : FormButton などのコントロールも継承で作られている
第 15 章int.Parse の例外TextBox 入力で例外が起きないよう int.TryParse を使う

Forms 編は、これまで学んだ C# の総合演習 とも言える内容です。 新しい構文を覚えるというより、既知の知識を画面アプリで使い直す 感覚で進めてください。


つまずき原因対応
NameText を混同するプロパティの意味が曖昧Name はコード用、Text は画面表示用
イベントハンドラーが二重に作られるボタンを誤ってダブルクリックを繰り返したForm1.Designer.cs を確認して、不要なハンドラー登録を消す(または書籍 Chapter 3 の手順に戻る)
int.Parse で例外が出てアプリが止まる数字以外が入力された書籍 3.7 のとおり int.TryParse でチェック
ボタンを押しても何も起きないイベントハンドラーが紐付いていないプロパティウィンドウの「イベント」タブで Click を確認
TextBox.Text がコンパイル時に値を持っている気がするText は実行時の値Text を読むのは、ボタンが押された
計算結果が表示されない.ToString() を忘れたintText に入れる前に .ToString()
valueLeft などの変数が分からないスコープを意識していないイベントハンドラー内のローカル変数(第 7 章)

  • フォームに LabelTextBoxButton を配置できる
  • Name プロパティと Text プロパティを使い分けられる
  • ボタンの Click イベントにイベントハンドラーを作成できる
  • TextBox.Text で入力値を取得できる
  • int.Parse で文字列を整数に変換できる
  • Label.TextTextBox.Text に結果を表示できる
  • .ToString()int を文字列に変換できる
  • 共通処理をメソッドに分けられる
  • int.TryParse を使って入力エラーに対応できる
  • イベント駆動の流れを自分の言葉で説明できる

研修の進め方によっては、隣の人またはチーム内で説明確認を行います。

次の内容を、自分の言葉で説明してください。

  1. Name プロパティと Text プロパティの違いは何ですか。
  2. ボタンクリックの処理は、どこに書きますか。
  3. TextBox.Text で取り出した値はどんな型ですか。それを整数として使うにはどうしますか。
  4. int.Parseint.TryParse の使い分けは、Forms ではどう考えますか。
  5. 書籍 3.7 で InputCheck メソッドに分けると、どんなメリットがありますか。
  6. 「イベント駆動」を自分の言葉で説明してください。

書籍 Chapter 3 を参照しながら作業します。 画面操作・部品配置の細かな手順は書籍に書かれているので、書籍を手元に開いて進めてください。

段階目安時間内容
① 準備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:input1TextBoxinput2TextBox)
    • Button(Name:CalcButtonText:計算)
    • TextBox(Name:answerTextBox、結果表示用)
  • CalcButtonClick イベントで:
    • input1TextBox.Textinput2TextBox.Textint.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 で割ろうとしたときにメッセージが表示される

  • プロジェクト名が SimpleCalc
  • csproj が <Nullable>disable</Nullable>
  • 必須課題のフォームに input1TextBoxinput2TextBoxCalcButtonanswerTextBox が配置されている
  • CalcButton_Click イベントハンドラーが作成されている
  • int.Parse または int.TryParse を使えている
  • 結果が画面に表示される
  • InputCheck メソッドに分離できている(必須 19-2)
  • binobj.vs フォルダが Git 管理に入っていない
  • インデントが整っている
  • タイマー時点で commit 済み(または 提出メモ.txt を書いた)

Terminal window
git status
git add .
git commit -m "Chapter19 タイマー提出: 必須19-1完成、19-2 InputCheck途中 / 特になし"
git push origin main

Git が使えないときは、上記コミットの代わりに SimpleCalc プロジェクトのフォルダを提出先サーバへコピーし、コピー先に 提出メモ.txt を作成してください(演習課題の「提出方法:Git が使えないときはサーバへコピー」参照)。

Git の詳しい操作は、付録 C「Git のインストールと提出ルール」 を参照してください。


この章では、書籍 Chapter 3 を参照して SimpleCalc を作りながら、Windows フォームアプリ作成の基本を学びました。

  • フォームに LabelTextBoxButton を配置する
  • Name(コード用)と Text(画面表示用)を使い分ける
  • ボタンの Click イベントにイベントハンドラーを作る
  • TextBox.Text で入力を取得、int.Parse で整数に変換
  • 結果は TextBox.TextLabel.Text に表示、.ToString()int を文字列に
  • 共通処理は メソッド に分離する(書籍 3.7 の InputCheck)
  • ユーザー入力には int.TryParse で備える
  • これまで学んだ C# 知識(算術演算・プロパティ・メソッド・継承・例外処理)が Forms 上でそのまま活きる

次章では、書籍 Chapter 4「『タイマー』の作成」(Timer プロジェクト)を参照します。 Timer コントロール を使って一定時間ごとに処理を動かす方法を学び、イベント駆動の理解をさらに深めます。 ここでは「ボタンクリック以外のイベント」も体験します。