方法: アプリケーション設定を検証する

このトピックでは、アプリケーション設定を永続化する前に検証する方法について説明します。

アプリケーション設定は厳密に型指定されているため、ユーザーが特定の設定に誤った型のデータを割り当てることはほとんどありません。 しかし、誕生日として未来の日付を入力するなど、ユーザーが許容範囲外の値を設定に割り当てようとする場合もあります。 すべてのアプリケーション設定クラスの親クラスである ApplicationSettingsBase では、このような範囲のチェックを可能にする 4 つのイベントを公開しています。 これらのイベントを処理すると、検証コードがプロジェクト全体に分散するのではなく、すべての検証コードが 1 か所に配置されます。

次の表に示すように、使用するイベントは設定をいつ検証する必要があるかによって決まります。

Event 発生と使用
SettingsLoaded 設定プロパティ グループの初期読み込み後に発生します。

プロパティ グループ全体の初期値がアプリケーション内で使用される前に値を検証するには、このイベントを使用します。
SettingChanging 1 つの設定プロパティの値が変更される前に発生します。

1 つのプロパティが変更される前にプロパティを検証するには、このイベントを使用します。 アクションと選択に関するフィードバックをユーザーにすぐに提供できます。
PropertyChanged 1 つの設定プロパティの値が変更された後に発生します。

1 つのプロパティが変更された後にプロパティを検証するには、このイベントを使用します。 時間がかかる非同期の検証プロセスが必要な場合を除き、このイベントを検証に使用することはほとんどありません。
SettingsSaving 設定プロパティ グループが保存される前に発生します。

プロパティ グループ全体の値がディスクに永続化される前に値を検証するには、このイベントを使用します。

通常は、検証のために同じアプリケーション内でこれらのイベントをすべて使用するわけではありません。 たとえば、多くの場合、SettingChanging イベントだけを処理することですべての検証要件を満たすことができます。

イベント ハンドラーは、無効な値を検出すると、一般に次のいずれかのアクションを実行します。

  • 既定値など、正しいことがわかっている値を自動的に入力します。

  • サーバー コードのユーザーに情報を再度照会します。

  • 関連付けられたアクションの前に発生するイベント(SettingChangingSettingsSaving など) の場合、引数 CancelEventArgs を使用して操作を取り消します。

イベント処理の詳細については、「イベント ハンドラーの概要」を参照してください。

以下の手順は、SettingChanging イベントまたは SettingsSaving イベントを使用して有効な誕生日かどうかをテストする方法を示しています。 これらの手順は、アプリケーション設定を既に作成していることを前提としています。この例では、DateOfBirth という名前の設定の範囲チェックを実行します。 設定を作成する方法の詳細については、「方法 : アプリケーション設定を作成する」を参照してください。

アプリケーション設定オブジェクトを取得するには

  • 次の項目のいずれかを実行して、アプリケーション設定オブジェクト (ラッパー インスタンス) への参照を取得します。

    • Visual Studio のプロパティ エディターで [アプリケーション設定] ダイアログ ボックスを使用して設定を作成した場合は、次の式によって、使用している言語用に生成された既定の設定オブジェクトを取得できます。

      Properties.Settings.Default
      
      MySettings.Default
      

      \- または -

    • Visual Basic 開発者がプロジェクト デザイナーを使用してアプリケーション設定を作成した場合は、My.Settings オブジェクトを使用して設定を取得できます。

      \- または -

    • ApplicationSettingsBase から直接派生して設定を作成した場合は、クラスを手動でインスタンス化する必要があります。

      MyCustomSettings settings = new MyCustomSettings();
      
      Dim Settings as New MyCustomSettings()
      

以下の手順は、この手順の最後の項目を実行してアプリケーション設定オブジェクトを取得したことを前提としています。

設定の変更時にアプリケーション設定を検証するには

  1. C# 開発者の場合、フォームまたはコントロールの Load イベント内で、SettingChanging イベントのイベント ハンドラーを追加します。

    \- または -

    Visual Basic 開発者の場合、WithEvents キーワードを使用して Settings 変数を宣言します。

    public void Form1_Load(Object sender, EventArgs e)
    {
        settings.SettingChanging += new SettingChangingEventHandler(MyCustomSettings_SettingChanging);
    }
    
    Public Sub Form1_Load(sender as Object, e as EventArgs)
        AddHandler settings.SettingChanging, AddressOf MyCustomSettings_SettingChanging
    End Sub
    
  2. イベント ハンドラーを定義し、誕生日の範囲チェックを実行するコードをイベント ハンドラー内に記述します。

    private void MyCustomSettings_SettingChanging(Object sender, SettingChangingEventArgs e)
    {
        if (e.SettingName.Equals("DateOfBirth"))
        {
            var newDate = (DateTime)e.NewValue;
            if (newDate > DateTime.Now)
            {
                e.Cancel = true;
                // Inform the user.
            }
        }
    }
    
    Private Sub MyCustomSettings_SettingChanging(sender as Object, e as SettingChangingEventArgs) Handles Settings.SettingChanging
        If (e.SettingName.Equals("DateOfBirth")) Then
            Dim NewDate as Date = CType(e.NewValue, Date)
            If (NewDate > Date.Now) Then
                e.Cancel = True
                ' Inform the user.
            End If
        End If
    End Sub
    

保存時にアプリケーション設定を検証するには

  1. フォームまたはコントロールの Load イベント内で、SettingsSaving イベントのイベント ハンドラーを追加します。

    public void Form1_Load(Object sender, EventArgs e)
    {
        settings.SettingsSaving += new SettingsSavingEventHandler(MyCustomSettings_SettingsSaving);
    }
    
    Public Sub Form1_Load(Sender as Object, e as EventArgs)
        AddHandler settings.SettingsSaving, AddressOf MyCustomSettings_SettingsSaving
    End Sub
    
  2. イベント ハンドラーを定義し、誕生日の範囲チェックを実行するコードをイベント ハンドラー内に記述します。

    private void MyCustomSettings_SettingsSaving(Object sender, SettingsSavingEventArgs e)
    {
        if (this["DateOfBirth"] > Date.Now) {
            e.Cancel = true;
        }
    }
    
    Private Sub MyCustomSettings_SettingsSaving(Sender as Object, e as SettingsSavingEventArgs)
        If (Me["DateOfBirth"] > Date.Now) Then
            e.Cancel = True
        End If
    End Sub
    

関連項目