C#メッセージボックスの使い方完全ガイド|MessageBox.Showの基本・ボタン・アイコン・戻り値をサンプルコードで解説

1. C#のメッセージボックスとは

C#のメッセージボックスとは、ユーザーに短いメッセージを通知したり、処理を続けるか確認したりするためのダイアログです。

WindowsフォームではSystem.Windows.Forms.MessageBox、WPFではSystem.Windows.MessageBoxを使用します。どちらも基本的にはMessageBox.Showメソッドを呼び出して表示しますが、ボタンや戻り値に使用する型が異なります。

1-1. メッセージボックスでできること

C#のメッセージボックスでは、主に次のような処理ができます。

  • ユーザーへの情報通知

  • 入力エラーや処理失敗の通知

  • データ削除前の確認

  • アプリケーション終了前の確認

  • 処理完了の通知

  • Yes、No、Cancelなどの選択結果の取得

  • 情報、警告、エラーなどのアイコン表示

単に文字を表示するだけでなく、ユーザーが押したボタンを戻り値として受け取り、その後の処理を分岐できる点が大きな特徴です。

1-2. MessageBox.Showを使う場面

MessageBox.Showは、ユーザーがその場で確認すべき重要な情報を表示するときに適しています。

たとえば、次のような場面です。

// 処理完了の通知MessageBox.Show("保存が完了しました。");

// 削除前の確認MessageBox.Show("選択したデータを削除しますか?","削除確認",MessageBoxButtons.YesNo,MessageBoxIcon.Warning);

一方、ユーザーが確認する必要のないデバッグ情報や処理履歴は、メッセージボックスではなくログファイルへ出力するのが適切です。

1-3. WindowsフォームとWPFでの違い

WindowsフォームとWPFでは、使用する名前空間や列挙型が異なります。

項目WindowsフォームWPF
名前空間System.Windows.FormsSystem.Windows
ボタンの型MessageBoxButtonsMessageBoxButton
アイコンの型MessageBoxIconMessageBoxImage
戻り値DialogResultMessageBoxResult
既定ボタンMessageBoxDefaultButtonMessageBoxResultで指定

見た目や基本的な用途は似ていますが、コードをそのまま共通利用できるわけではありません。開発しているアプリケーションがWindowsフォームなのかWPFなのかを確認してから実装しましょう。

2. MessageBox.Showの基本的な使い方

2-1. 最もシンプルなメッセージ表示

最も簡単な方法は、MessageBox.Showに表示したい文字列を渡すことです。

Windowsフォームでは次のように記述します。

MessageBox.Show("こんにちは");

WPFでも基本的な書き方は同じです。

MessageBox.Show("こんにちは");

このコードを実行すると、指定したメッセージとOKボタンが表示されます。

2-2. タイトルを付けて表示する方法

第2引数を指定すると、メッセージボックスのタイトルバーに文字を表示できます。

MessageBox.Show("保存が完了しました。", "完了");

第1引数が本文、第2引数がタイトルです。

タイトルを付けることで、何に関する通知なのかが分かりやすくなります。

MessageBox.Show("入力内容に誤りがあります。","入力エラー");

2-3. usingに必要な名前空間

WindowsフォームでMessageBoxを使用する場合は、次の名前空間を指定します。

using System.Windows.Forms;

WPFでは次の名前空間を指定します。

using System.Windows;

両方の名前空間を参照していてMessageBoxが曖昧になる場合は、完全修飾名を使用します。

System.Windows.Forms.MessageBox.Show("WinFormsのメッセージ");

System.Windows.MessageBox.Show("WPFのメッセージ");

2-4. WinFormsでの基本サンプルコード

Windowsフォームのボタンをクリックしたときにメッセージを表示する例です。

using System;using System.Windows.Forms;

namespace MessageBoxSample{public partial class MainForm : Form{public MainForm(){InitializeComponent();}

    private void button1_Click(object sender, EventArgs e){MessageBox.Show("処理が完了しました。","完了",MessageBoxButtons.OK,MessageBoxIcon.Information);}}

}

MessageBoxButtons.OKでOKボタンを、MessageBoxIcon.Informationで情報アイコンを指定しています。

2-5. WPFでの基本サンプルコード

WPFのボタンをクリックしたときにメッセージを表示する例です。

using System.Windows;

namespace MessageBoxSample{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}

    private void Button_Click(object sender, RoutedEventArgs e){MessageBox.Show(this,"処理が完了しました。","完了",MessageBoxButton.OK,MessageBoxImage.Information);}}

}

第1引数にthisを指定すると、現在のウィンドウを所有者としてメッセージボックスを表示できます。

3. MessageBox.Showの主な引数と構文

Windowsフォームでよく使用する構文は次のとおりです。

DialogResult result = MessageBox.Show(text,caption,buttons,icon,defaultButton,options);

すべての引数を指定する必要はありません。目的に応じたオーバーロードを選択します。

3-1. text:表示するメッセージ

textには、メッセージボックス内に表示する本文を指定します。

MessageBox.Show("ファイルの保存が完了しました。");

変数を含めることもできます。

string fileName = "sample.txt";

MessageBox.Show($"{fileName}を保存しました。");

3-2. caption:タイトルバーの文字

captionには、タイトルバーに表示する文字列を指定します。

MessageBox.Show("ファイルの保存が完了しました。","保存完了");

「確認」「警告」「エラー」など、メッセージの目的を簡潔に表すタイトルが適しています。

3-3. buttons:表示するボタン

Windowsフォームでは、MessageBoxButtonsを使って表示するボタンを指定します。

MessageBox.Show("処理を続行しますか?","確認",MessageBoxButtons.YesNo);

WPFではMessageBoxButtonを使用します。

MessageBox.Show("処理を続行しますか?","確認",MessageBoxButton.YesNo);

3-4. icon:表示するアイコン

WindowsフォームではMessageBoxIconを使って、情報、警告、エラーなどのアイコンを指定します。

MessageBox.Show("入力内容を確認してください。","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);

WPFではMessageBoxImageを使用します。

MessageBox.Show("入力内容を確認してください。","警告",MessageBoxButton.OK,MessageBoxImage.Warning);

3-5. defaultButton:既定で選択されるボタン

Windowsフォームでは、MessageBoxDefaultButtonによって最初に選択されるボタンを指定できます。

MessageBox.Show("変更内容を保存せずに終了しますか?","終了確認",MessageBoxButtons.YesNo,MessageBoxIcon.Warning,MessageBoxDefaultButton.Button2);

Button2を指定しているため、2番目のNoボタンが既定で選択されます。

主な指定値は次のとおりです。

MessageBoxDefaultButton.Button1MessageBoxDefaultButton.Button2MessageBoxDefaultButton.Button3

誤操作による影響が大きい場合は、「削除する」「保存せず終了する」などの破壊的な選択肢を既定にしないことが重要です。

WPFでは、既定の選択結果をMessageBoxResultで指定します。

MessageBox.Show(this,"変更内容を保存せずに終了しますか?","終了確認",MessageBoxButton.YesNo,MessageBoxImage.Warning,MessageBoxResult.No);

3-6. options:表示方法の詳細設定

MessageBoxOptionsを使用すると、文字の配置や読み方向などを指定できます。

MessageBox.Show("メッセージを表示します。","確認",MessageBoxButtons.OK,MessageBoxIcon.Information,MessageBoxDefaultButton.Button1,MessageBoxOptions.RightAlign);

代表的な値には次のものがあります。

  • MessageBoxOptions.RightAlign:文字列を右寄せで表示する

  • MessageBoxOptions.RtlReading:右から左へ読む形式で表示する

  • MessageBoxOptions.ServiceNotification:アクティブなデスクトップに表示する

  • MessageBoxOptions.DefaultDesktopOnly:既定のデスクトップに表示する

通常の日本語アプリケーションでは、optionsを省略するケースがほとんどです。特別な表示要件がある場合に使用しましょう。

4. ボタンの種類を指定する方法

ここではWindowsフォームのMessageBoxButtonsを使用して、ボタン構成を指定する方法を紹介します。

WPFのMessageBoxButtonで標準的に指定できるのは、OKOKCancelYesNoYesNoCancelです。

4-1. OKボタンだけを表示する

通知内容を確認してもらうだけの場合は、OKボタンだけを表示します。

MessageBox.Show("登録が完了しました。","完了",MessageBoxButtons.OK,MessageBoxIcon.Information);

OKボタンだけのメッセージボックスは、処理完了や情報通知に適しています。

4-2. OK/Cancelボタンを表示する

処理を実行するかキャンセルするか選んでもらう場合は、OKCancelを指定します。

DialogResult result = MessageBox.Show("設定を適用しますか?","確認",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);

WPFでは次のように記述します。

MessageBoxResult result = MessageBox.Show("設定を適用しますか?","確認",MessageBoxButton.OKCancel,MessageBoxImage.Question);

4-3. Yes/Noボタンを表示する

二者択一の確認にはYesNoを使用します。

DialogResult result = MessageBox.Show("上書き保存しますか?","上書き確認",MessageBoxButtons.YesNo,MessageBoxIcon.Question);

YesとNoのどちらかを必ず選択してもらいたい場合に適しています。

4-4. Yes/No/Cancelボタンを表示する

処理を実行する、実行しない、操作自体を中止するという3つの選択肢を用意する場合は、YesNoCancelを使用します。

DialogResult result = MessageBox.Show("変更内容を保存しますか?","保存確認",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question);

たとえば、次のように役割を割り当てられます。

  • Yes:保存して終了

  • No:保存せず終了

  • Cancel:終了処理を中止

4-5. Retry/Cancelボタンを表示する

処理を再実行するか中止するか選んでもらう場合は、RetryCancelを使用します。

DialogResult result = MessageBox.Show("サーバーに接続できませんでした。","接続エラー",MessageBoxButtons.RetryCancel,MessageBoxIcon.Error);

このボタン構成はWindowsフォームで使用できます。WPFの標準MessageBoxにはRetryCancelがないため、必要な場合は独自のダイアログを作成します。

4-6. Abort/Retry/Ignoreボタンを表示する

中止、再試行、無視の3つを表示する場合は、AbortRetryIgnoreを使用します。

DialogResult result = MessageBox.Show("ファイルの読み込み中にエラーが発生しました。","読み込みエラー",MessageBoxButtons.AbortRetryIgnore,MessageBoxIcon.Error);

各ボタンは次の意味で使用します。

  • Abort:処理を中止する

  • Retry:処理を再試行する

  • Ignore:エラーを無視して続行する

ユーザーがそれぞれの選択結果を理解できるように、本文で処理内容を明確に説明することが重要です。

5. アイコンの種類を指定する方法

アイコンを適切に設定すると、メッセージの種類を視覚的に伝えられます。

5-1. 情報アイコンを表示する

通常の通知や処理完了には、Informationを使用します。

MessageBox.Show("データの保存が完了しました。","保存完了",MessageBoxButtons.OK,MessageBoxIcon.Information);

WPFではMessageBoxImage.Informationを指定します。

5-2. 警告アイコンを表示する

入力内容の注意や、実行前に確認が必要な操作にはWarningを使用します。

MessageBox.Show("入力した内容は保存されていません。","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);

5-3. エラーアイコンを表示する

処理失敗や例外発生など、ユーザーが対応すべき問題にはErrorを使用します。

MessageBox.Show("ファイルを開けませんでした。","エラー",MessageBoxButtons.OK,MessageBoxIcon.Error);

5-4. 質問アイコンを表示する

ユーザーに選択を求める確認メッセージでは、Questionを指定できます。

MessageBox.Show("変更内容を保存しますか?","確認",MessageBoxButtons.YesNo,MessageBoxIcon.Question);

ただし、確認メッセージだからといって必ず質問アイコンが必要とは限りません。削除や上書きなど、注意を促す必要がある操作ではWarningを使用したほうが意図を伝えやすいことがあります。

5-5. アイコンなしで表示する

アイコンを表示しない場合は、Noneを指定します。

MessageBox.Show("メッセージを表示します。","お知らせ",MessageBoxButtons.OK,MessageBoxIcon.None);

アイコンの引数を省略した場合も、基本的にはアイコンなしで表示されます。

5-6. 用途別のアイコン選び

アイコンは、メッセージの目的に合わせて選択します。

用途推奨アイコン
正常終了や一般的な通知Information
入力ミスや注意事項Warning
処理失敗や例外発生Error
ユーザーへの確認QuestionまたはWarning
重要度の低い単純な通知None

正常な処理完了にエラーアイコンを使うなど、内容と一致しないアイコンはユーザーを混乱させます。アイコンの意味を統一して使用しましょう。

6. 戻り値でユーザーの選択を判定する方法

6-1. DialogResultとは

WindowsフォームのMessageBox.Showは、ユーザーが押したボタンをDialogResultとして返します。

DialogResult result = MessageBox.Show("処理を実行しますか?","確認",MessageBoxButtons.YesNo);

resultには、押されたボタンに応じて次のような値が格納されます。

DialogResult.OKDialogResult.CancelDialogResult.YesDialogResult.NoDialogResult.RetryDialogResult.AbortDialogResult.Ignore

6-2. OKが押されたか判定する

OK/Cancelボタンを表示し、OKが押された場合だけ処理を実行する例です。

DialogResult result = MessageBox.Show("設定を保存しますか?","確認",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);

if (result == DialogResult.OK){SaveSettings();}

6-3. Cancelが押されたか判定する

Cancelが押された場合に処理を中止する例です。

DialogResult result = MessageBox.Show("処理を開始しますか?","確認",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);

if (result == DialogResult.Cancel){return;}

StartProcess();

6-4. Yes/Noの選択結果を判定する

Yes/Noの結果を判定する場合は、DialogResult.YesDialogResult.Noを比較します。

DialogResult result = MessageBox.Show("選択したデータを削除しますか?","削除確認",MessageBoxButtons.YesNo,MessageBoxIcon.Warning,MessageBoxDefaultButton.Button2);

if (result == DialogResult.Yes){DeleteData();}

Noを既定ボタンにすることで、Enterキーの誤操作による削除を防ぎやすくなります。

6-5. if文で処理を分岐するサンプル

DialogResult result = MessageBox.Show("変更内容を保存しますか?","保存確認",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question);

if (result == DialogResult.Yes){SaveData();Close();}else if (result == DialogResult.No){Close();}else{// Cancelが押されたため、何もしない}

YesNoCancelの場合は、3つの結果を考慮して処理を記述します。

6-6. switch文で処理を分岐するサンプル

選択肢が3つ以上ある場合は、switch文を使用すると読みやすくなります。

DialogResult result = MessageBox.Show("変更内容を保存しますか?","保存確認",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question);

switch (result){case DialogResult.Yes:SaveData();Close();break;

case DialogResult.No:Close();break;case DialogResult.Cancel:// 終了処理を中止するbreak;

}

WPFでは、DialogResultの代わりにMessageBoxResultを使用します。

MessageBoxResult result = MessageBox.Show("変更内容を保存しますか?","保存確認",MessageBoxButton.YesNoCancel,MessageBoxImage.Question);

switch (result){case MessageBoxResult.Yes:SaveData();Close();break;

case MessageBoxResult.No:Close();break;case MessageBoxResult.Cancel:break;

}

7. よく使うメッセージボックスの実装例

7-1. 確認ダイアログを表示する

DialogResult result = MessageBox.Show("処理を実行してもよろしいですか?","実行確認",MessageBoxButtons.YesNo,MessageBoxIcon.Question);

if (result == DialogResult.Yes){ExecuteProcess();}

確認ダイアログでは、ユーザーが何に同意するのかが分かる文言にしましょう。

7-2. 削除前に確認する

DialogResult result = MessageBox.Show("選択した顧客データを削除します。\nこの操作は元に戻せません。","削除確認",MessageBoxButtons.YesNo,MessageBoxIcon.Warning,MessageBoxDefaultButton.Button2);

if (result == DialogResult.Yes){DeleteCustomer();

MessageBox.Show("顧客データを削除しました。","削除完了",MessageBoxButtons.OK,MessageBoxIcon.Information);

}

削除のように取り消せない操作では、対象と影響を明確に説明し、安全な選択肢を既定ボタンにします。

7-3. 入力エラーを通知する

if (string.IsNullOrWhiteSpace(nameTextBox.Text)){MessageBox.Show("名前を入力してください。","入力エラー",MessageBoxButtons.OK,MessageBoxIcon.Warning);

nameTextBox.Focus();return;

}

メッセージには、「エラーが発生しました」だけでなく、どの項目をどのように修正すべきかを記載します。

7-4. 処理完了を知らせる

MessageBox.Show("データの登録が完了しました。","登録完了",MessageBoxButtons.OK,MessageBoxIcon.Information);

ただし、短時間に何度も発生する処理で毎回メッセージボックスを表示すると、操作性が低下します。重要度が低い完了通知には、画面上のステータス表示なども検討しましょう。

7-5. 例外発生時にエラー内容を表示する

try{SaveFile();}catch (UnauthorizedAccessException){MessageBox.Show("ファイルへのアクセス権限がありません。\n保存先を確認してください。","保存エラー",MessageBoxButtons.OK,MessageBoxIcon.Error);}catch (Exception ex){MessageBox.Show($"ファイルの保存中にエラーが発生しました。\n\n{ex.Message}","保存エラー",MessageBoxButtons.OK,MessageBoxIcon.Error);}

ユーザー向けのアプリケーションでは、スタックトレースや内部パスなどの詳細情報をそのまま表示しないように注意します。詳細情報はログに記録し、メッセージボックスにはユーザーが対処できる内容を表示するのが基本です。

7-6. 終了確認メッセージを表示する

Windowsフォームで、フォームを閉じる前に確認する例です。

private bool isClosingConfirmed;

private void MainForm_FormClosing(object sender,FormClosingEventArgs e){if (isClosingConfirmed){return;}

DialogResult result = MessageBox.Show("アプリケーションを終了しますか?","終了確認",MessageBoxButtons.YesNo,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2);if (result == DialogResult.Yes){isClosingConfirmed = true;}else{e.Cancel = true;}

}

未保存のデータがある場合だけ確認を表示するようにすると、不要な操作を減らせます。

8. MessageBox.Showで見やすく表示するコツ

8-1. 改行を入れてメッセージを整える

長い文章は、\nEnvironment.NewLineを使って適切に改行します。

MessageBox.Show("ファイルの保存に失敗しました。\n保存先を確認して、もう一度実行してください。","保存エラー",MessageBoxButtons.OK,MessageBoxIcon.Error);

環境に合った改行文字を使用したい場合は、Environment.NewLineが便利です。

string message ="ファイルの保存に失敗しました。" +Environment.NewLine +"保存先を確認してください.";

MessageBox.Show(message);

8-2. 変数の値をメッセージに含める

処理対象や入力値を表示すると、ユーザーが状況を把握しやすくなります。

string fileName = "report.xlsx";

MessageBox.Show(fileName + "を保存しました。","保存完了",MessageBoxButtons.OK,MessageBoxIcon.Information);

8-3. 文字列補間でコードを読みやすくする

文字列補間を使用すると、変数を含むメッセージを簡潔に記述できます。

string userName = "田中";int count = 5;

MessageBox.Show($"{userName}さんのデータを{count}件登録しました。","登録完了",MessageBoxButtons.OK,MessageBoxIcon.Information);

複数行の文字列補間も使用できます。

string message =$"ファイル名:{fileName}{Environment.NewLine}" +$"保存件数:{count}件";

MessageBox.Show(message,"保存結果",MessageBoxButtons.OK,MessageBoxIcon.Information);

8-4. 長すぎるメッセージを避ける

メッセージボックスは、短く重要な内容を伝えるためのUIです。長い説明文、利用規約、詳細な操作手順などを表示する用途には適していません。

情報量が多い場合は、次のような方法を検討します。

  • 専用の画面やダイアログを作成する

  • 詳細情報をテキストボックスに表示する

  • ヘルプページへの導線を用意する

  • エラー詳細をログファイルへ出力する

8-5. ユーザーに伝わりやすい文言にする

メッセージには、問題の内容と対処方法を具体的に記載します。

分かりにくい例は次のとおりです。

エラーが発生しました。

改善例は次のとおりです。

ファイルを保存できませんでした。保存先フォルダーへの書き込み権限を確認してください。

確認メッセージでは、実行される操作を具体的に示します。

本当に実行しますか?

より分かりやすくすると、次のようになります。

選択した3件の顧客データを削除しますか?この操作は元に戻せません。

9. MessageBox.Showでよくあるエラーと対処法

9-1. MessageBoxが認識されない

MessageBoxが認識されない場合は、必要な名前空間が指定されているか確認します。

Windowsフォームの場合は次のとおりです。

using System.Windows.Forms;

WPFの場合は次のとおりです。

using System.Windows;

Windowsフォーム以外のプロジェクトからSystem.Windows.Formsを使用する場合は、プロジェクト設定や参照の追加が必要になることがあります。

.NETのプロジェクトファイルでは、Windowsフォームを有効にする設定が必要です。

<PropertyGroup><TargetFramework>net8.0-windows</TargetFramework><UseWindowsForms>true</UseWindowsForms></PropertyGroup>

9-2. DialogResultが使えない

WPFで次のように記述すると、型が一致しないためエラーになります。

DialogResult result = MessageBox.Show("確認");

WPFではMessageBoxResultを使用します。

MessageBoxResult result = MessageBox.Show("処理を実行しますか?","確認",MessageBoxButton.YesNo,MessageBoxImage.Question);

WindowsフォームではDialogResultを使用します。

DialogResult result = MessageBox.Show("処理を実行しますか?","確認",MessageBoxButtons.YesNo,MessageBoxIcon.Question);

9-3. WPFでWinFormsのMessageBoxと混同する

WPFプロジェクトでSystem.Windows.Formsを参照していると、どちらのMessageBoxを使用しているのか分かりにくくなることがあります。

曖昧な参照が発生した場合は、完全修飾名を使います。

System.Windows.MessageBox.Show("WPFのメッセージボックスです。");

別名を定義する方法もあります。

using WpfMessageBox = System.Windows.MessageBox;using WinFormsMessageBox = System.Windows.Forms.MessageBox;
WpfMessageBox.Show("WPFのメッセージ");

WinFormsMessageBox.Show("WinFormsのメッセージ");

基本的には、WPFアプリではWPFのMessageBox、WindowsフォームアプリではWindowsフォームのMessageBoxを使用しましょう。

9-4. ボタンやアイコンの指定でエラーになる

WindowsフォームとWPFで列挙型を混在させるとエラーになります。

Windowsフォームの正しい例は次のとおりです。

MessageBox.Show("メッセージ","タイトル",MessageBoxButtons.OK,MessageBoxIcon.Information);

WPFの正しい例は次のとおりです。

MessageBox.Show("メッセージ","タイトル",MessageBoxButton.OK,MessageBoxImage.Information);

次の組み合わせは使用できません。

// WinFormsとWPFの型が混在しているMessageBox.Show("メッセージ","タイトル",MessageBoxButtons.OK,MessageBoxImage.Information);

9-5. 戻り値の判定がうまく動かない

ボタン構成と戻り値の判定が一致しているか確認します。

たとえば、YesNoを表示しているのにDialogResult.OKと比較しても、条件は成立しません。

DialogResult result = MessageBox.Show("実行しますか?","確認",MessageBoxButtons.YesNo);

// YesNoではOKは返されないif (result == DialogResult.OK){ExecuteProcess();}

正しくはDialogResult.Yesを判定します。

if (result == DialogResult.Yes){ExecuteProcess();}

また、戻り値を受け取らずに表示だけを行っている場合は、ユーザーの選択結果を判定できません。

MessageBox.Show("実行しますか?","確認",MessageBoxButtons.YesNo);

結果を使う場合は変数へ代入します。

DialogResult result = MessageBox.Show("実行しますか?","確認",MessageBoxButtons.YesNo);

10. WindowsフォームとWPFでのMessageBoxの違い

10-1. WinFormsのMessageBox.Show

Windowsフォームでは、System.Windows.Forms.MessageBoxを使用します。

using System.Windows.Forms;

DialogResult result = MessageBox.Show("処理を実行しますか?","確認",MessageBoxButtons.YesNo,MessageBoxIcon.Question);

Windowsフォーム版は、RetryCancelAbortRetryIgnoreなど、WPFより多くのボタン構成を標準で利用できます。

10-2. WPFのMessageBox.Show

WPFでは、System.Windows.MessageBoxを使用します。

using System.Windows;

MessageBoxResult result = MessageBox.Show(this,"処理を実行しますか?","確認",MessageBoxButton.YesNo,MessageBoxImage.Question);

WPFの標準メッセージボックスで使用できる主なボタン構成は次のとおりです。

MessageBoxButton.OKMessageBoxButton.OKCancelMessageBoxButton.YesNoMessageBoxButton.YesNoCancel

再試行ボタンや独自の文言を持つボタンが必要な場合は、独自のWindowを作成します。

10-3. DialogResultとMessageBoxResultの違い

WindowsフォームではDialogResultを使用します。

DialogResult result = MessageBox.Show("保存しますか?","確認",MessageBoxButtons.YesNo);

if (result == DialogResult.Yes){SaveData();}

WPFではMessageBoxResultを使用します。

MessageBoxResult result = MessageBox.Show("保存しますか?","確認",MessageBoxButton.YesNo);

if (result == MessageBoxResult.Yes){SaveData();}

名前は似ていますが別の型であり、相互に代入できません。

10-4. usingする名前空間の違い

Windowsフォームでは次の名前空間を指定します。

using System.Windows.Forms;

WPFでは次の名前空間を指定します。

using System.Windows;

両方を使用するプロジェクトでは、完全修飾名またはusingエイリアスを使って区別します。

10-5. どちらを使うべきか

基本的には、使用しているUIフレームワークに合わせて選択します。

  • Windowsフォームアプリ:System.Windows.Forms.MessageBox

  • WPFアプリ:System.Windows.MessageBox

WPFアプリでWindowsフォーム版を使うことも技術的には可能ですが、不要な参照が増え、型の混同が起こりやすくなります。特別な理由がない限り、同じUIフレームワークのメッセージボックスを使用しましょう。

11. MessageBox.Showを使う際の注意点

11-1. 連続表示しすぎない

メッセージボックスが表示されるたびに、ユーザーはボタンを押して閉じなければなりません。

入力項目ごとにエラーを連続表示すると、次のような状態になります。

名前を入力してください。住所を入力してください。電話番号を入力してください。

このような場合は、エラーをまとめて表示したほうが分かりやすくなります。

var errors = new List<string>();

if (string.IsNullOrWhiteSpace(nameTextBox.Text)){errors.Add("名前を入力してください。");}

if (string.IsNullOrWhiteSpace(addressTextBox.Text)){errors.Add("住所を入力してください。");}

if (string.IsNullOrWhiteSpace(phoneTextBox.Text)){errors.Add("電話番号を入力してください。");}

if (errors.Count > 0){MessageBox.Show(string.Join(Environment.NewLine, errors),"入力エラー",MessageBoxButtons.OK,MessageBoxIcon.Warning);

return;

}

11-2. UIスレッドで表示する

メッセージボックスを含むUI操作は、原則としてUIスレッドで実行します。

Windowsフォームで別スレッドから表示する場合は、Invokeなどを使用します。

Invoke(() =>{MessageBox.Show(this,"処理が完了しました。","完了",MessageBoxButtons.OK,MessageBoxIcon.Information);});

WPFではDispatcherを使用します。

Dispatcher.Invoke(() =>{MessageBox.Show(this,"処理が完了しました。","完了",MessageBoxButton.OK,MessageBoxImage.Information);});

バックグラウンド処理の途中でメッセージボックスを表示する場合は、処理の停止状態やユーザー操作への影響も考慮しましょう。

11-3. ユーザー操作を止める点に注意する

MessageBox.Showで表示されるメッセージボックスは、ユーザーが閉じるまで後続のコードへ進まないモーダルダイアログです。

MessageBox.Show("確認してください。");

// メッセージボックスが閉じられた後に実行されるExecuteNextProcess();

重要な確認には適していますが、頻繁な通知には不向きです。

操作を止める必要がない通知では、次の方法を検討します。

  • ステータスバーに表示する

  • 画面内にメッセージを表示する

  • 一定時間後に消える通知を使用する

  • 通知領域のアイコンを利用する

11-4. ログ出力との使い分け

メッセージボックスはユーザーへの通知、ログは開発者や運用担当者が原因を調査するための記録として使い分けます。

try{SaveData();}catch (Exception ex){logger.LogError(ex, "データ保存処理に失敗しました。");

MessageBox.Show("データを保存できませんでした。\n時間をおいてもう一度お試しください。","保存エラー",MessageBoxButtons.OK,MessageBoxIcon.Error);

}

例外の詳細をログへ記録し、ユーザーには必要な内容だけを表示すると、安全性と使いやすさを両立できます。

11-5. 入力フォームが必要な場合の代替方法

標準のMessageBox.Showには、文字を入力するテキストボックスを追加できません。

ユーザーから名前、パスワード、数値などを入力してもらう場合は、独自の入力画面を作成します。

Windowsフォームでは、Formを継承したダイアログを作成してShowDialogで表示します。

using (var inputForm = new InputForm()){DialogResult result = inputForm.ShowDialog(this);

if (result == DialogResult.OK){string inputValue = inputForm.InputValue;}

}

WPFでは、Windowを継承した入力ダイアログを作成します。

var inputWindow = new InputWindow{Owner = this};

bool? result = inputWindow.ShowDialog();

if (result == true){string inputValue = inputWindow.InputValue;}

ボタンの文言を自由に変更したい場合、チェックボックスや詳細表示を追加したい場合、複雑な情報を表示したい場合も、標準メッセージボックスではなく独自ダイアログが適しています。

まとめ

C#のメッセージボックスは、MessageBox.Showを使用することで簡単に表示できます。

Windowsフォームの基本形は次のとおりです。

DialogResult result = MessageBox.Show("処理を実行しますか?","確認",MessageBoxButtons.YesNo,MessageBoxIcon.Question);

WPFの基本形は次のとおりです。

MessageBoxResult result = MessageBox.Show("処理を実行しますか?","確認",MessageBoxButton.YesNo,MessageBoxImage.Question);

WindowsフォームではMessageBoxButtonsMessageBoxIconDialogResultを使用し、WPFではMessageBoxButtonMessageBoxImageMessageBoxResultを使用します。

メッセージボックスを実装するときは、表示するボタンと戻り値の組み合わせを正しく理解することが重要です。また、削除や上書きなどの重要な操作では、安全な選択肢を既定ボタンに設定し、処理内容が明確に伝わる文言を使用しましょう。

MessageBox.Showは便利ですが、連続表示するとユーザーの操作を妨げます。重要な通知や確認に限定し、簡単な情報表示にはステータスバー、詳細なエラー情報にはログ、文字入力が必要な場合には独自ダイアログを使い分けることが、使いやすいC#アプリケーションを作るポイントです。