次の方法で共有


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

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

アプリケーション設定は厳密に型指定されているため、ユーザーが正しくない型のデータを特定の設定に割り当てることができないという確信があります。 ただし、ユーザーは引き続き、許容できる範囲外の設定に値を割り当てようとする場合があります(たとえば、将来発生する生年月日を指定するなど)。 ApplicationSettingsBaseは、すべてのアプリケーション設定クラスの親クラスで、このような境界チェックを有効にする 4 つのイベントを公開します。 これらのイベントを処理すると、プロジェクト全体に分散するのではなく、すべての検証コードが 1 つの場所に配置されます。

使用するイベントは、次の表に示すように、設定を検証する必要がある場合によって異なります。

出来事 発生と使用
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
    

関連情報を参照