操作說明:驗證應用程式設定

本主題示範如何在保存應用程式設定之前先行驗證。

因為應用程式設定為強型別,對於使用者無法將型別不正確的資料指派給指定的設定這一點,您可以有些信心。 不過,使用者仍然可以嘗試將超出可接受界限的值指派給設定,例如,提供未來時間的出生日期。 ApplicationSettingsBase,所有應用程式設定類別的父類別會公開四個事件,以啟用這類界限檢查。 在處理這些事件時,您所有的驗證程式碼會放在單一位置,而不是零散分佈在整個專案。

您所使用的事件取決於何時需要驗證設定,如下表所述。

Event 發生時機和用途
SettingsLoaded 在初次載入設定屬性群組之後發生。

使用此事件可先驗證整個屬性群組的初始值,然後才將值用於應用程式。
SettingChanging 在單一設定屬性值變更之前發生。

使用此事件可先驗證單一屬性,然後才將它變更。 它可立即為使用者提供有關其動作和選擇的意見回應。
PropertyChanged 在單一設定屬性值變更之後發生。

使用此事件可在單一屬性變更後,對此屬性進行驗證。 除非系統需要冗長的非同步驗證程序,否則此事件很少會用於進行驗證。
SettingsSaving 在儲存設定屬性群組之前發生。

使用此事件可先驗證整個屬性群組的值,然後再儲存到磁碟中予以保存。

一般而言,您不會在相同應用程式內將這些事件全都用於進行驗證。 例如,通常只要處理 SettingChanging 事件,即可滿足所有驗證需求。

當事件處理常式偵測到無效值時,它通常會執行下列其中一個動作︰

  • 自動提供已知正確的值,例如預設值。

  • 重新查詢伺服器程式碼的使用者以獲得資訊。

  • 對於在相關聯動作之前引發的事件,例如 SettingChangingSettingsSaving ,會使用 CancelEventArgs 引數來取消作業。

如需處理事件的詳細資訊,請參閱事件處理常式概觀

下列程式示範如何使用 或 SettingsSaving 事件來測試有效的出生日期 SettingChanging 。 我們在撰寫這些程序時,是假設您已建立應用程式設定;在此範例中,我們會對名為 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
    

另請參閱