HOWTO · Csharp

C# でのボタンの無効化と有効化

このガイドでは、C# でボタンを無効および有効にする方法について説明します。

このページの内容

Windows Forms アプリでボタンを無効にするには、Enabled プロパティを false に設定します。再び使用できるようにするには true に設定します。プロパティはUIフレームワークによって異なります。WPFでは IsEnabled を使用し、Windows FormsとASP.NET Web Formsでは Enabled を使用します。(C#)

ボタンの状態を表すプロパティの役割

有効なボタンはユーザーの操作を受け付け、そのアクションを実行できます。無効にすると、ユーザーはインターフェイスからボタンを操作できなくなり、通常はフレームワークによってその状態が見た目にも示されます。アプリケーション、デザイナー、またはマークアップで別の初期値を設定しない限り、ボタンは有効な状態で始まります。コントロールを無効にするのはインターフェイス上の動作であり、リクエストを処理する処理内で権限を確認したり、データを検証したりすることの代わりにはなりません。

Windows Forms のボタンを作成または選択する

Windows Forms のデザイナーで、ツールボックスから Button をフォームに追加し、(Name) プロパティを myButton に設定します。デザイナーで作成したコントロールはフォームのコードから参照できるため、イベントハンドラーで状態を変更できます。コードで Button を作成してフォームに追加することもできます。ButtonBase は基底型であり、通常ボタンとして追加する具体的なコントロール型ではありません。

Windows Forms のボタンを無効化して再び有効にする

状態を変更するコードは、myButton を参照できるフォームクラス内に記述します。この Windows Forms の例では、デザイナーで myButton と別の resetButton を同じフォームに作成してあるものとします。次のハンドラーをフォームクラス内に追加し、デザイナーのイベント画面で myButton.Click を DisableButton_Click に、resetButton.Click を EnableButton_Click に接続します(または InitializeComponent() の後に myButton.Click += DisableButton_Click; と resetButton.Click += EnableButton_Click; を記述します)。private void DisableButton_Click(object sender, EventArgs e) { myButton.Enabled = false; } と private void EnableButton_Click(object sender, EventArgs e) { myButton.Enabled = true; } を使います。最初のボタンをクリックするとそのボタン自体が無効になり、別のリセットボタンをクリックすると再び有効になります。これらのハンドラー例は Windows Forms 専用であり、単独で実行できるプログラムではありません。

次の自己完結型のコンソール例は、状態の変化だけを示します。Windows Forms のコントロールは作成せず、代入の前後におけるブール値を出力します。ここに示す出力とラベルは英語のままです。Windows Forms のフォームでは、上記の Button.Enabled の代入を使用してください。

using System;

class Program
{
    static void Main()
    {
        bool submitButtonEnabled = true;
        submitButtonEnabled = false;
        Console.WriteLine($"Enabled: {submitButtonEnabled}");
        submitButtonEnabled = true;
        Console.WriteLine($"Enabled: {submitButtonEnabled}");
    }
}
Enabled: False
Enabled: True

イベントハンドラーとフォーム検証でボタンの状態を使う

よくある使い方は、必須フィールドの検証に通るまで送信ボタンを使用できない状態にしておくことです。フィールドが変更されたら現在の値を検証し、その結果を submitButton.Enabled に設定します。フォーム全体の検証ハンドラーでは、必要な確認項目がすべて成功した場合に限り、値を true に戻します。送信を処理する際にも改めて検証してください。UIの状態はユーザーを案内するのに役立ちますが、処理を守る唯一の仕組みにしてはいけません。時間のかかるリクエストでは、処理中に送信ボタンを無効にし、失敗時を含め処理の終了後に再び有効にすると、ユーザーが再試行できます。

フレームワークごとに異なるプロパティ名

コントロールの種類に合ったプロパティを使います。Windows Forms では Button.Enabled、WPF では Button.IsEnabled、ASP.NET Web Forms では Button.Enabled です。WPF では、IsEnabled をビューモデルの値にバインドして、アプリケーションの状態に応じてインターフェイスを更新することもできます。ASP.NET Web Forms のサーバー側 Enabled は描画されるサーバーコントロールの状態を制御しますが、セキュリティチェックではありません。ユーザーがクライアント側の無効状態を変更できる場合もあります。これらはフレームワークのAPIを説明する例であり、単独で実行できるプログラムではありません。

ボタンの状態に関するよくある間違いと確認事項

  • Enabled と IsEnabled のどちらを使うか決める前に、フレームワークとコントロールの種類を確認します。
  • ハンドラーが想定した Click イベントまたは検証イベントに接続されていることと、コードが対象のボタンインスタンスを参照していることを確認します。
  • ボタンが無効のままなら、状態プロパティへのすべての代入を追い、検証条件が成立し得ることを確認します。
  • クリックハンドラー自身が無効にしたボタンを再び有効にできる別の方法を用意します。たとえば、処理の完了や別のキャンセル/リセット操作を使います。
  • 権限の確認と送信値の検証は処理そのもので行います。無効に見えるだけでは操作を保護できません。