DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

フォームにOKボタン、キャンセルボタンを付ける

フォームにOKボタン、キャンセルボタンを付けたダイアログウィンドウを表示する方法を紹介します。これらのボタンがクリックされるとフォームは閉じられ、どのボタンが押されたかが取得できるようにします。さらに、Enterキーを押すことによりOKボタンがクリックされたことになるようにし、Escキーを押すことによりキャンセルボタンがクリックされたことになるようにします。

1.OKボタンを作成するには、フォームにButtonコントロールを追加し、DialogResultプロパティを「OK」にします。キャンセルボタンは同様にButtonコントロールのDialogResultプロパティを「Cancel」にします。

2.フォームのどのボタンが押されたのかを知るには、フォームのShowDialogメソッドの戻り値を調べるか、ShowDialogメソッドを呼び出した後、フォームのDialogResultプロパティを調べます。以下はその例です。

VB.NET
コードを隠すコードを選択
'フォームの作成
Dim f As Form1 = New Form1()
'フォームの表示
If (f.ShowDialog(Me) = DialogResult.OK) Then
    Console.WriteLine("OKボタンが押されました。")
End If
'DialogResultプロパティを調べる
If (f.DialogResult = DialogResult.OK) Then
    Console.WriteLine("OKボタンが押されました。")
ElseIf (f.DialogResult = DialogResult.Cancel) Then
    Console.WriteLine("キャンセルボタンが押されました。")
End If
f.Dispose()
C#
コードを隠すコードを選択
//フォームの作成
Form1 f = new Form1();
//フォームの表示
if (f.ShowDialog(this) == DialogResult.OK)
{
    Console.WriteLine("OKボタンが押されました。");
}
//DialogResultプロパティを調べる
if (f.DialogResult == DialogResult.OK)
{
    Console.WriteLine("OKボタンが押されました。");
}
else if (f.DialogResult == DialogResult.Cancel)
{
    Console.WriteLine("キャンセルボタンが押されました。");
}
f.Dispose();

3.Enterキーの押下でOKボタンをクリックしたことにするためには、フォームのAcceptButtonプロパティでそのボタンを指定します。同様にEscキーの押下でキャンセルボタンをクリックしたことにするためには、フォームのCancelButtonプロパティでそのボタンを指定します。

以上で出来上がりです。

補足:f.Dispose()の必要性について「Form.DialogResult プロパティ」に次のようにあります。

「DialogResult プロパティの値を設定した場合には、 Close メソッドは .NET Framework によって呼び出されません。その場合はフォームが非表示になるだけで、ダイアログ ボックスの新しいインスタンスを作成しなくてもそのフォームを再表示できます。ダイアログ ボックスとして表示されているフォームは Close メソッドで閉じられることはないため、フォームがアプリケーションで不要になった場合は、そのフォームの Dispose メソッドを呼び出す必要があります。」
補足:上ではButtonコントロールのDialogResultプロパティを使用して結果を設定しましたが、そうせずに、ButtonコントロールのClickイベントハンドラでフォームのDialogResultプロパティを設定しても同じことができます。モーダルフォームのDialogResultプロパティを設定すると、そのフォームは非表示になります。
補足:フォームの「閉じる」ボタン(フォームの右上にある「X」ボタン)や「Alt + F4」キー、あるいはForm.Closeメソッドなどによりフォームが閉じされたときは、ShowDialogメソッドはDialogResult.Cancelを返します。もしこれらによって閉じされたときでも状況に応じて別のDialogResultを返したいのであれば、ClosingイベントハンドラでフォームのDialogResultプロパティの値を変更してください。

以下にTextBox1の内容が変更されていれば(Modifiedプロパティがtrueであれば)DialogResult.OKを返すコードを示します。

注意:.NET Framework 2.0以降では、FormクラスのClosing、Closedイベントの代わりに、FormClosing、FormClosedイベントを使用してください。
VB.NET
コードを隠すコードを選択
Protected Overrides Sub OnClosing(ByVal e As CancelEventArgs)
    'TextBox1の内容が変更されていればOKを返す
    If Me.TextBox1.Modified Then
        Me.DialogResult = DialogResult.OK
    End If
End Sub
C#
コードを隠すコードを選択
protected override void OnClosing(CancelEventArgs e)
{
    //TextBox1の内容が変更されていればOKを返す
    if (this.TextBox1.Modified)
        this.DialogResult = DialogResult.OK;
}
  • 履歴:
  • 2010/3/2 文章の間違いを修正。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。