方法 : アプリケーション設定を検証する
更新 : 2007 年 11 月
ここでは、アプリケーション設定を永続化する前に検証する方法について説明します。
アプリケーションは厳密に型指定されるため、特定の設定に対してユーザーが誤った型を指定することはほとんどありません。しかし、たとえば、誕生日として未来の日付を指定するなど、ユーザーが許容範囲外の設定値を割り当てようとすることもあります。すべてのアプリケーション設定クラスの親クラスである ApplicationSettingsBase では、このような範囲チェックを有効にする 4 つのイベントが公開されています。これらのイベントを処理すると、すべての検証コードを 1 か所に配置できるため、検証コードがプロジェクト全体に分散しません。
次の表で説明するように、使用するイベントは設定をいつ検証するかによって決まります。
イベント |
発生と使用 |
---|---|
設定プロパティ グループが初めて読み込まれた後に発生します。 このイベントを使用して、プロパティ グループ全体の初期値がアプリケーション内で使用される前に検証します。 |
|
単一の設定プロパティの値が変更される前に発生します。 このイベントを使用して、単一のプロパティが変更される前に検証します。処理および選択に関するフィードバックを即時にユーザーに提供できます。 |
|
単一の設定プロパティの値が変更された後に発生します。 このイベントを使用して、単一のプロパティが変更された後で検証します。時間がかかる非同期の検証プロセスが必要な場合を除き、このイベントを検証に使用することはほとんどありません。 |
|
設定プロパティ グループが格納される前に発生します。 このイベントを使用して、プロパティ グループ全体の値がディスクに永続化される前に検証します。 |
通常、同じアプリケーション内のすべてのイベントを検証の目的で使用することはありません。たとえば、多くの場合、SettingChanging イベントを処理するだけですべての検証要件を満たすことができます。
一般に、イベント ハンドラが無効な値を検出すると、次のいずれかを実行します。
既定値など、正しいことが判明している値を自動的に入力します。
情報のサーバー コードをユーザーに再照会します。
関連付けられたアクションの前に発生した SettingChanging や SettingsSaving などのイベントの場合は、引数 CancelEventArgs を使用して操作を取り消します。
イベント処理の詳細については、「イベント ハンドラの概要 (Windows フォーム)」を参照してください。
次のプロシージャは、SettingChanging イベントまたは SettingsSaving イベントを使用して有効な誕生日をテストする方法を示しています。このプロシージャは、アプリケーション設定を既に作成していることを前提にしています。この例では、 DateOfBirth という名前の設定の範囲チェックを実行します。設定の作成の詳細については、「方法 : アプリケーション設定を作成する」を参照してください。
アプリケーション設定オブジェクトを取得するには
次の項目のいずれかを実行してアプリケーション設定オブジェクト (ラッパー インスタンス) への参照を取得します。
Visual Studio のプロパティ エディタの [アプリケーション設定] ダイアログ ボックスを使用して設定を作成したときは、次の式によって使用している言語用に生成された既定の設定オブジェクトを取得できます。
Configuration.Settings.Default
MySettings.Default
または
Visual Basic 開発者がプロジェクト デザイナを使用してアプリケーション設定を作成したときは、My.Settings オブジェクト を使用して設定を取得できます。
または
ApplicationSettingsBase から直接派生して設定を作成したときは、手動でクラスをインスタンス化する必要があります。
MyCustomSettings settings = new MyCustomSettings();
Dim Settings as New MyCustomSettings()
次のプロシージャでは、この最後に紹介した項目を実行してアプリケーション設定オブジェクトを取得していることを前提にしています。
設定の変更時にアプリケーション設定を検証するには
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
イベント ハンドラを定義し、その中に誕生日の範囲チェックを実行するコードを記述します。
private void MyCustomSettings_SettingChanging(Object sender, SettingChangingEventArgs e) { if (e.SettingName.Equals("DateOfBirth")) { Date newDate = (Date)e.NewValue; If (newDate > Date.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
保存時にアプリケーション設定を検証するには
フォームまたはコントロールの 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
イベント ハンドラを定義し、その中に誕生日の範囲チェックを実行するコードを記述します。
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