本主题演示如何在保留应用程序设置之前对其进行验证。
由于应用程序设置是强类型化的,因此你确信用户无法向给定设置分配错误类型的数据。 但是,用户仍有可能尝试向设置分配超出可接受范围的值,例如,用户提供的出生日期可能是一个将来日期。 ApplicationSettingsBase,所有应用程序设置类的父类,公开四个事件以启用此类边界检查。 处理这些事件会将所有验证代码放在单个位置,而不是在整个项目中分散它。
使用的事件取决于何时需要验证设置,如下表所述。
事件 / 活动 | 出现和使用 |
---|---|
SettingsLoaded | 在设置属性组初始加载后发生。 使用此事件可在应用程序内使用之前验证整个属性组的初始值。 |
SettingChanging | 在更改单个设置属性的值之前发生。 使用此事件在更改前验证单个属性。 它可以为用户提供有关其操作和选择的即时反馈。 |
PropertyChanged | 更改单个设置属性的值后发生。 使用此事件在更改后验证单个属性。 除非需要较长的异步验证过程,否则此事件很少用于验证。 |
SettingsSaving | 在存储设置属性组之前发生。 使用此事件验证整个属性组的值,然后再将其保存到磁盘。 |
通常,不会在同一应用程序中使用所有这些事件进行验证。 例如,通常可以通过仅处理 SettingChanging 事件来满足所有验证要求。
事件处理程序通常会在检测到无效值时执行以下操作之一:
自动提供已知正确的值,例如默认值。
再次询问服务器代码用户,以获取信息。
对于在关联操作发生前引发的事件(如 SettingChanging 和 SettingsSaving),使用 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()
假定应用程序设置对象是通过完成此过程中的最后一个项目符号项获取的,以下过程就是在这一前提下编写的。
设置更改时验证应用程序设置
如果你是 C# 开发人员,请在表单或控件的
Load
事件中为 SettingChanging 事件添加事件处理程序。-或-
如果你是 Visual Basic 开发人员,则应使用
Settings
关键字声明WithEvents
变量。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")) { 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
保存时验证应用程序设置
在窗体或控件的
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