.NET TIPS

メッセージ・ボックスのデフォルト・ボタンを変更するには?

デジタルアドバンテージ 一色 政彦
2005/05/20

 「TIPS:メッセージ・ボックスを表示するには?」では、Windowsフォームなどのアプリケーション上でメッセージ・ボックスを表示する方法について紹介した。

 このTIPSで解説されているように、メッセージ・ボックスではShowメソッドのパラメータに指定するMessageBoxButtons列挙体(System.Windows.Forms名前空間)の値を切り替えることで、メッセージ・ボックス上のボタン内容を変更できる。例えば、何らかの質問を表示して、それに対して[はい][いいえ]などのボタンをユーザーに押してもらいたいような場合には、Showメソッドのパラメータに「MessageBoxButtons.YesNo」を指定すれば、メッセージ・ボックスに[はい][いいえ]の2つのボタンが配置される。

 このようにして、メッセージ・ボックス上に複数のボタンを配置した場合、その1つ目のボタンである[はい]をユーザーに安直に押されたくないというケースがある。例えば、「削除してもいいですか?」という質問を行うメッセージ・ボックスで、[はい]ボタンを押すとデータの削除が実行され、しかもいったんデータが削除されてしまうと、それを復元することは不可能といったケースだ。このような場合では、ユーザーが誤って[はい]ボタンを押してしまうようなユーザー・インターフェイスは極力避けたい。

 しかし、通常のメッセージ・ボックスでは、1番目(左端)に配置されているボタン(本稿の例では、[はい]ボタン)がデフォルト・ボタンとなっているので、メッセージ・ボックスが表示されたときにこのボタンにフォーカスが自動的にセットされる。このため、[Enter]キーの操作によってメッセージ・ボックスを表示した場合などでは、ユーザーが誤って2回続けて[Enter]キーを押してしまい、結果的にメッセージ・ボックスの[はい]ボタンも押してしまうという危険性がある。特に、[Enter]キーでリズミカルに作業ができるようなアプリケーションの場合には注意が必要になる。

 次の画面では、そのようにして誤ってボタンを押してしまう過程を示している。

誤って意図しないボタンを押しやすい例
通常のメッセージ・ボックスでは、1番目(左端)にあるボタン(本稿の例では、[はい]ボタン)がデフォルト・ボタンとなっているので、誤ってその第1ボタンを押しやすい。それを押すと取り返しのつかない処理が行われる場合、これが致命的な問題となる可能性もある。
  [メッセージボックス表示]ボタンにフォーカスがあるときに[Enter]キーを押すと、の[確認]メッセージ・ボックスが表示される。
  メッセージ・ボックスが表示されると、自動的に第1ボタンの[はい]にフォーカスがセットされる。このため、の作業に沿って誤って2回続けて[Enter]キーを押してしまうと、結果的に[はい]が実行されてしまうことになる。このようなミスは、[Enter]キーを押しながらリズミカルに作業を続けている場合に特に起きやすい。

 このプログラムのメッセージ・ボックスを表示する部分のソース・コードは次のとおりだ。

private void button1_Click(object sender, System.EventArgs e)
{
  DialogResult dr = MessageBox.Show(
    "削除してもいいですか?",
    "確認",
    MessageBoxButtons.YesNo,
    MessageBoxIcon.Question);
}
メッセージ・ボックスを表示する部分のソース・コード(C#)
 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim dr As DialogResult = MessageBox.Show( _
    "削除してもいいですか?", _
    "確認", _
    MessageBoxButtons.YesNo, _
    MessageBoxIcon.Question)
End Sub
メッセージ・ボックスを表示する部分のソース・コード(VB.NET)

 上記の画面のような事態を回避するには、「メッセージ・ボックスのデフォルト・ボタンを変更する」のが、Windowsプログラミングの定石だ。

 実際にデフォルト・ボタンを変更するには、メッセージ・ボックスのShowメソッドのパラメータに指定するMessageBoxDefaultButton列挙体(System.Windows.Forms名前空間)の値を「Button1」「Button2」「Button3」のいずれかに変更すればよい(「Button1」が第1ボタン、「Button2」が第2ボタンで、「Button3」が第3ボタンだ)。例えば、本稿の例では[はい]と[いいえ]のボタンがあり、デフォルト・ボタンを第2ボタンの[いいえ]に変更したいので、「MessageBoxDefaultButton.Button2」を指定すればよい。

 なお、Showメソッドには複数のオーバーロードが用意されているが、デフォルト・ボタンを変更するには、これらのうちMessageBoxDefaultButton列挙体が指定できるバージョンのメソッドを用いなければならない。

 それでは、上記のプログラムのソース・コードを修正して、実際にデフォルト・ボタンを変更してみよう。具体的には次のようにコードを修正する。

private void button1_Click(object sender, System.EventArgs e)
{
  DialogResult dr = MessageBox.Show(
    "削除してもいいですか?",
    "確認",
    MessageBoxButtons.YesNo,
    MessageBoxIcon.Question,
    MessageBoxDefaultButton.Button2);
}
デフォルト・ボタンを変更したメッセージ・ボックスのソース・コード(C#)
太字部分が修正個所。
 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim dr As DialogResult = MessageBox.Show( _
    "削除してもいいですか?", _
    "確認", _
    MessageBoxButtons.YesNo, _
    MessageBoxIcon.Question, _
    MessageBoxDefaultButton.Button2)
End Sub
デフォルト・ボタンを変更したメッセージ・ボックスのソース・コード(VB.NET)
太字部分が修正個所。

 このプログラムを実行したのが次の画面である。

デフォルト・ボタンを変更したメッセージ・ボックスの実行結果
[メッセージボックス表示]ボタンを押す際に、誤って[Enter]キーを2回続けて押しても、メッセージ・ボックスの[いいえ]ボタン(=処理のキャンセル)が押されることになるので、何の処理も実行されずに済む。このように、処理をキャンセルするボタン(この例では[いいえ]ボタン)に、デフォルト・ボタンを変更することで、ユーザーにとってより安全なユーザー・インターフェイスにすることができる。
  メッセージ・ボックスを表示すると、第2ボタンの[いいえ]にフォーカスが設定される。

 このように、MessageBoxDefaultButton列挙体の値によってメッセージ・ボックスが表示されたときにフォーカスを受けるコントロールが切り替わり、冒頭の問題を回避できるようになる。こうしておけば、誤って2回続けて[Enter]キーを押しても、[いいえ]が実行されて、結果的に処理は行われないで済む。

 なお、メッセージ・ボックス上のボタンの数はMessageBoxButtons列挙体(System.Windows.Forms名前空間)の値によって変わってくる。例えば、本稿の例ではShowメソッドのパラメータに「MessageBoxButtons.YesNo」が指定されているが、これを「MessageBoxButtons.YesNoCancel」に変更すると、ボタンが[はい][いいえ][キャンセル]の3つになる。この3つ目のボタンをデフォルト・ボタンにしたい場合には、「MessageBoxDefaultButton.Button3」を使えばよい。ちなみにメッセージ・ボックスのボタン数は最大で3個だ。End of Article

カテゴリ:Windowsフォーム 処理対象:ダイアログ・ボックス
使用ライブラリ:MessageBoxDefaultButton列挙体(System.Windows.Forms名前空間)
使用ライブラリ:MessageBoxButtons列挙体(System.Windows.Forms名前空間)
関連TIPS:メッセージ・ボックスを表示するには?
 
この記事と関連性の高い別の.NET TIPS
メッセージ・ボックスを表示するには?
Windowsアプリケーション終了時に確認ダイアログを表示するには?
[ASP.NET]DataGridコントロールの削除ボタンで確認メッセージを表示するには?
メッセージ・ボックスからヘルプを表示するには?
[ASP.NET]DataGridコントロールに削除ボタンを追加するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間