如何:验证应用程序设置
本主题阐释如何在保持应用程序设置前验证它们。
由于应用程序设置是强类型的,因此在一定程度上您可以相信用户无法向给定设置分配类型错误的数据。 但是,用户仍有可能尝试向设置分配超出可接受范围的值,例如,用户提供的出生日期可能是一个将来的日期。 ApplicationSettingsBase 是所有应用程序设置类的父类,它公开四个事件用于启用这样的界限检查。 处理这些事件会将所有的验证代码都放到一个位置中,而不是将其分散到整个项目中。
所用的事件取决于需要何时验证设置,如下表所述:
Event |
发生时间和用法 |
---|---|
初始加载设置属性组后发生。 在应用程序中使用属性组前,使用此事件验证整个属性组的初始值。 |
|
在单个设置属性的值更改前发生。 在单个属性更改前,使用此事件验证该属性。 它可以向用户提供有关他们的操作和选择的即时反馈。 |
|
在单个设置属性的值更改后发生。 在单个属性更改后,使用此事件验证该属性。 除非需要进行长时间的异步验证处理,否则很少将此事件用于验证操作。 |
|
在存储设置属性组前发生。 在将属性组保留到磁盘前,使用此事件验证整个属性组的值。 |
通常,不会在同一应用程序中使用所有这些事件进行验证操作。 例如,经常可能只需要处理 SettingChanging 事件,便可以满足所有的验证需要。
当事件处理程序检测到无效值时,它通常执行以下操作之一:
自动提供已知是正确的值,如默认值。
再次询问服务器代码用户,以获取信息。
对于在关联操作发生前引发的事件,如 SettingChanging 和 SettingsSaving,使用 CancelEventArgs 参数取消操作。
有关事件处理的更多信息,请参见事件处理程序概述(Windows 窗体)。
下面的过程说明如何使用 SettingChanging 或 SettingsSaving 事件来测试出生日期是否有效。 这些过程是在假定已创建应用程序设置的情况下编写的;在此示例中,我们将对名为 DateOfBirth 的设置执行边界检查。 有关创建设置的更多信息,请参见如何:创建应用程序设置。
获取应用程序设置对象
通过完成以下带项目符号的项之一,获取对应用程序设置对象(包装实例)的引用:
如果您使用**“属性编辑器”**中的“Visual Studio 应用程序设置”对话框创建设置,则可以通过下面的表达式检索为您的语言生成的默认设置对象。
Configuration.Settings.Default
MySettings.Default
- 或 -
如果您是 Visual Basic 开发人员并且使用“项目设计器”创建应用程序设置,则可以通过使用 My.Settings 对象 (Visual Basic)来检索您的设置。
- 或 -
如果您通过直接从 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