天天看点

在 Visual Basic 2005 中使用 My.Settings

摘要: 本文讨论 My.Settings 类如何使得在Visual Basic 2005 中存储应用程序和用户设置变得更为简单。

注 本文及代码示例基于 Microsoft Visual Studio 2005 的预发布版本,其之前的代号为“Whidbey”。文中包含的所有信息均有可能变更。

在 Visual Basic 2005 中使用 My.Settings
本页内容
在 Visual Basic 2005 中使用 My.Settings
简介
在 Visual Basic 2005 中使用 My.Settings
旧方法
在 Visual Basic 2005 中使用 My.Settings
新的、更好的方法
在 Visual Basic 2005 中使用 My.Settings
高级设置
在 Visual Basic 2005 中使用 My.Settings
小结

简介

Windows 窗体应用程序需要运行应用程序所需的数据。多数情况下,您不希望将这一数据包含于代码中,也不希望在每次进行更改后都重新编译应用程序。如果您的应用程序 使用 Web 服务或数据库,则您可能希望将 URL 或连接字符串存储在一个单独的文件中,以便可以容易地更改它们。如果应用程序存储窗口布局和其他 UI 自定义,则需要为每一用户单独存储这一信息。

过去,此数据存储在许多不同的位置,如 INI 文件、注册表或配置文件中。Microsoft .NET Framework 1.0 引入了 app.config 文件的概念,这是一些用于存储此类设置的 XML 文件。这些方法中的每一种都有一些问题:

设置不是类型安全的。
需要相当大数量的编码(例如用于读文件和写文件)。
注册表方法要求应用程序具有访问注册表的足够安全权限。
很难维护该应用程序的用户范围的设置。

新 的 Application Settings 体系结构提供了一种将应用程序范围的设置和用户范围的设置均存储在客户端上的简单方式,从而满足了这些需要。利用 Visual Studio 或一个代码编辑器,可以指定一个给定属性的名称、数据类型、默认值和范围(应用程序的或用户的),从而为该属性定义一个设置。

Application Settings 的工作原理是,根据该设置是应用程序范围的还是用户范围的,将数据以 XML 格式保持到不同的配置 (.config) 文件。应用程序范围的设置为只读。因为应用程序范围的设置是程序信息,所以一般不需要对其进行改写。相反,即使应用程序是在部分信任的情况下运行,也可以 在运行时安全地读取和写入用户范围的设置。

在 Visual Basic 2005 中使用 My.Settings

返回页首

旧方法

.NET Framework 1.0 引入了带有 app.config 文件的配置文件概念。应用程序使用该文件来存储特定于应用程序的许多应用程序设置。该文件是一个简单的 XML 文件,您可以很容易地用记事本对其进行编辑,以更改应用程序设置或增加新设置。例如,有很大的空间可以将地址存储到 SMTP 服务器、数据库连接字符串,等等。.NET Framework 1.0 实现有几个缺点。一个缺点是没有可以写回文件的简单方法。如果您希望通过应用程序中的一个页面或一个窗体来更改设置,就必须将该文件作为 XML 文件加载,加以更改,然后再将其写回。另一个缺点是访问配置文件中的属性不是类型安全的。例如,以下代码行编译正常,但如果 PageSize 设置不是整数(非类型安全),则该代码行就可能导致运行时错误。

Dim PageSize As Integer = 
Configuration.ConfigurationSettings.AppSettings("PageSize")
      

如下所示,没有什么可以防止用户或开发人员将非数字值置于此应用程序设置中,也就不能防止在运行时产生错误。

在 Visual Basic 2005 中使用 My.Settings

返回页首

新的、更好的方法

.NET Framework 2.0 弥补了这些缺点中的大多数,并且还有其他功能。您将注意到的第一点就是,可以很容易地创建一个新设置。不必在打开配置文件后再输入新的设置。而是可以进入 项目属性窗体中的 Settings 设计器,并添加新设置。在这里可以选择每个设置的名称、类型和范围(应用程序或用户)。

范围

应用程序范围的设置为只读,由该应用程序的所有用户共享。这些设置存储在<applicationSettings>节的 app.config 文件中。

注 这不同于上述用在 .NET 1.0 中的<appSettings>节。

在运行时,app.config 文件将位于 bin 文件夹中,并以应用程序的名称命名 (MySettingsDemo.exe.config)。应用程序范围设置的示例是数据库连接字符串、Web 服务 URL、服务器的 IP 地址,等等。

<applicationSettings>
    <MySettingsDemo.MySettings>
      <setting name="SMTPServerIP" serializeAs="String">
        <value>127.0.0.1</value>
      </setting>
      <setting name="MyServicesURL" serializeAs="String">
        <value>http://localhost/myservices.asmx</value>
      </setting>
    </MySettingsDemo.MySettings>
  </applicationSettings>
      

用户范围设置特定于每个用户。可以由应用程序代码在运行时安全地对其进行读取和设置。这些设置存储于一个 user.config 文件中。为了在技术上准确,每个应用程序中每个用户有两个 user.config — 一个用于非漫游,一个用于漫游。尽管 Visual Basic 2005 测试版提供的文档声明会根据用户名为 user.config 文件命名 (joe.config),但实际情况并非如此。此 user.config 文件创建于 <c:/Documents and Settings>/<username>/[Local Settings/]Application Data/<companyname>/<appdomainname>_<eid>_<hash>/< verison>。其中:

<c:/Documents and Settings>为用户数据文件夹,或者为非漫游(以上 Local Settings),或者为漫游。
<username>为用户名。
<companyname>为 CompanyNameAttribute 值(如果可用)。否则,忽略这一元素。
<appdomainname>为 AppDomain.CurrentDomain.FriendlyName。这通常默认为 .exe 名。
<eid>为 URL、StrongName 或 Path,系基于可用于散列的证据。
<hash>是从 CurrentDomainis 中收集的证据 SHA1 散列,其优先选择的顺序如下:
1. StrongName
2. URL
如果都不可用,则采用 .exe 路径。
<version>为 AssemblyInfo 的 AssemblyVersionAttribute 设置。

示例路径如下所示:

C:/Documents and Settings/Emad.BROKENOAK/Local Settings/Application 
Data/MySettingsDemo/MySettingsDemo_9cfe5ef1/1.0.0.0
      

此示例路径打开时类似于图 1。

在 Visual Basic 2005 中使用 My.Settings

图 1. 示例路径

注 所显示和讨论的用户设置配置文件的位置对于 Beta 1 版是正确的,但 Visual Basic 2005 最终版本的位置尚未最终确定。

此 user.config 文件是在一个新用户第一次运行该应用程序时,并且没有将非默认值写入到用户范围设置的情况下,于运行时自动创建的。这些设置定义于< userSettings>节下的 app.config 文件中。设置的默认/初始值也定义于 app.config 文件中。以下代码片段显示了它在 app.config 文件中的外观:

<userSettings>
    <MySettingsDemo.MySettings>
      <setting name="LastSearchedItem" serializeAs="String">
        <value />
      </setting>
      <setting name="FormSize" serializeAs="String">
        <value>400, 400</value>
      </setting>
      <setting name="FormLocation" serializeAs="String">
        <value>0, 0</value>
      </setting>
    </MySettingsDemo.MySettings>
  </userSettings>
      

用户范围设置非常适合于存储应用程序的首选项,这些首选项对于每个用户来说通常是不同的。用户范围设置的示例为显示设置,例如,字体大小、窗口位置、MRU 列表,等等。

这一体系结构非常灵活,因为即使应用程序运行在部分信任情形中,它也使应用程序能够为每个用户存储设置和首选项。

创建一个设置

假定您的应用程序中有一个搜索框,而且您希望存储所搜索的最后一个项的值。首先,创建应用程序的 UI,如图 2 所示。

在 Visual Basic 2005 中使用 My.Settings

图 2. 创建搜索框 UI

现在,为最后搜索的项的字符串创建设置。所完成的搜索框与图 3 相似。

1. 在解决方案资源管理器中,双击 My Project。
2. 单击 Settings 选项卡,显示 Settings Designer。
3. 输入设置的名称、类型和范围(分别为:“LastSearchedItem”、String 和 User)。
4. 在 Value 栏中,输入这一设置的初始值(希望搜索什么?),或者使其保持空白。
在 Visual Basic 2005 中使用 My.Settings
图 3. 完成的搜索框

后台设置

在向 Settings Designer 中添加一个新设置时,在后台会发生几件事情。首先,向定义各节的 app.config 文件中添加一个项,以定义设置。

<configSections>
    <sectionGroup 
name="applicationSettings"type="System.Configuration.ApplicationSettingsGroup, System, 
Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="MySettingsDemo.MySettings" 
type="System.Configuration.ClientSettingsSection, System, 
Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </sectionGroup>
  </configSections>
      

接着,将设置定义本身添加到 app.config 文件中(如下所示)。根据所定义的设置类型,可以看到一个 applicationSettings、userSettings 和/或 connectionStrings 节(一个或多个),具体看到的内容取决于所定义的是何种设置。

<userSettings>
    <MySettingsDemo.MySettings>
      <setting name="LastSearchedItem" serializeAs="String">
        <value />
      </setting>
      <setting name="FormSize" serializeAs="String">
        <value>400, 400</value>
      </setting>
      <setting name="FormLocation" serializeAs="String">
        <value>0, 0</value>
      </setting>
    </MySettingsDemo.MySettings>
  </userSettings>
  <connectionStrings>
    <add name="MySettingsDemo.MySettings.ConnectionString" 
connectionString="Server=TABLET; User ID=sa; Password=1234; 
Database=Northwind; Persist Security Info=True" 
providerName="System.Data.SqlClient" />
  </connectionStrings>
  <applicationSettings>
    <MySettingsDemo.MySettings>
      <setting name="SMTPServerIP" serializeAs="String">
        <value>192.168.2.11</value>
      </setting>
      <setting name="MyServicesURL" serializeAs="String">
        <value>http://localhost/MyServices/Service1.asmx</value>
      </setting>
    </MySettingsDemo.MySettings>
  </applicationSettings>
      

访问设置

现在已经添了一个设置,需要对其进行检索和更新。检索一个设置非常简单。可以按以下方式对其进行检索:

My.Settings.LastSearchedItem
      

图 4 显示了如何通过 IntelliSense 访问应用程序的设置字段,从而可以很容易地找到所要用到的精确设置值。

在 Visual Basic 2005 中使用 My.Settings

图 4. 工作中的 IntelliSense 功能

使用设置的另一方法是将其绑定到一个属性。这几乎不需要代码。例如,可以将 FormLocation 设置绑定到窗体的位置属性。

在该窗体的属性窗口中,展开 Data | (ApplicationSettings) | (PropertyBinding)。
找到 Location 属性并选择 FormLocation 设置,如图 5 所示。
在 Visual Basic 2005 中使用 My.Settings
图 5. 选择 FormLocation 设置

这将在窗体的设计器代码隐藏类中创建该代码:

Me.DataBindings.Add(New System.Windows.Forms.Binding("Location", 
MySettingsDemo.MySettings.Value, "FormLocation", True, 
MySettingsDemo.MySettings.Value.LastSearchedItem, Nothing, 
System.Windows.Forms.BindingUpdateMode.OnPropertyChanged))
      

请注意 Binding 类构造中的最后一个参数。它定义了设置的更新模式。可以根据更改进行更新,可以根据验证进行更新,也可以从不更新。设计器中所生成的默认代码根据更改对其进行更新。

在将设置绑定到属性时,不需要担心设置的读取或写入。在需要该属性时会自动对其进行设置,而且如果更改了它的值,则会自动保存它。请注意所有这些工作是如何在无需编写一行代码的情况下完成的。

注 这些设置仅自动保存于某些项目类型中,例如,Visual Basic Windows Forms 应用程序。在其他情况下,例如在 Class Library 项目中,需要显式调用 My.Settings 类的 Save 方法。

如果该属性未列于属性绑定窗口中,仍然可以使用代码来达到同一目的。由于某种原因,Size 属性不能用作可绑定的属性。这是在这一版本中做出的设计决定,但在最终版本中,将会使所有属性都可用于绑定。这是通过将一个新的 Binding 添加至窗体的 DataBindings 集合中实现的。Binding 类用于定义属性名、设置名、数据存储和更新模式。因此,要将大小属性绑定到 FormSize 设置,可以在窗体加载事件中手动创建该绑定:

Me.DataBindings.Add(New System.Windows.Forms.Binding("Size", _
                    MySettingsDemo.MySettings.Value, _
                    "FormSize"))
      
在 Visual Basic 2005 中使用 My.Settings

返回页首

高级设置

如果您希望增强对设置的控制,可以定义自己的、派生于 ApplicationSettingsBase(所有设置类的父类)的类。将每个设置定义为一个已经定义了获取和设置方法的属性。如果该属性是应用程序范围的设置,则使用 ApplicationScopedSettingAttribute 修饰该属性,如果是用户范围的设置,则使用 UserScopedSettingAttribute 修饰它。实际上,这就是设置设计器所做的工作。下面是由设置设计器所生成的 MySettings.vb 文件中的一个片段:

Partial NotInheritable Class MySettings
    Inherits System.Configuration.ApplicationSettingsBase
 
    <System.Diagnostics.DebuggerNonUserCode(),  _
     System.Configuration.UserScopedSettingAttribute(),  _
     System.Configuration.DefaultSettingValueAttribute("400, 400")>  _
    Public Property FormSize() As System.Drawing.Size
        Get
            Return CType(Me("FormSize"),System.Drawing.Size)
        End Get
        Set
            Me("FormSize") = value
        End Set
    End Property
    
    <System.Diagnostics.DebuggerNonUserCode(),  _
     System.Configuration.SpecialSetting(System.Configuration.SpecialSetting.ConnectionString),  _
     System.Configuration.ApplicationScopedSettingAttribute(),  _
     System.Configuration.DefaultSettingValueAttribute("Server=TABLET; 
User ID=sa; Password=1234; Database=Northwind; Persist Security In"& _ 
        "fo=True")>  _
    Public ReadOnly Property ConnectionString() As String
        Get
            Return CType(Me("ConnectionString"),String)
        End Get
    End Property
    
    <System.Diagnostics.DebuggerNonUserCode(),  _
     System.Configuration.ApplicationScopedSettingAttribute(),  _
     System.Configuration.DefaultSettingValueAttribute("192.168.2.11")>  _
    Public ReadOnly Property SMTPServerIP() As String
        Get
            Return CType(Me("SMTPServerIP"),String)
        End Get
    End Property
...

      

注 连接字符串由 SpecialSetting 属性修饰。它们也是在 onfig 文件内它们自己的节中创建的。

另请注意,它是一个 Partial 类,这意味着可以在项目中创建另一个文件,并为该类创建另一个部分。采用这一技术,可以对设置进行微调,而不需要使用设计器所生成的文件。可以在该类中添加事件处理,以便对设置进行更为准确的控制。可以处理的三个事件为:

SettingChanging
SettingsSaving
PropertyChanging

请注意,这些设置功能位于一个可插接式提供程序基础结构的顶部,这一点非常重要。当前,Visual Studio 2005 只包含一个可以访问 .config 文件的提供程序 — LocalFileSettingsProvider。可以插入备用提供程序,用于代替 Local File Settings Provider,或作为其补充。例如,云彩场景中的设置,其中 Web 服务用于将设置存储于一个数据库中,可以在用户登录的任何位置获取设置。

在 Visual Basic 2005 中使用 My.Settings

返回页首

小结

以 前用于处理应用程序设置的体系结构有一定的限制,.NET Framework 2.0 中的新 Application Settings 体系结构解决了其中的大部分问题。新体系结构极大地简化了设置的创建、绑定、检索和更新,如本文借助于 Visual Basic 2005 所做的说明。它还解决了应用程序范围和用户范围的设置。这一新的体系结构必然能够提高工作效率,使开发人员专心解决业务问题,而不再需要花费几天、几周的 时间来指出应用程序设置中的所有症结。

继续阅读