正 文

Visual Studio 2005中的新DataSet特性


www.7dspace.com  更新日期:2006-2-22 19:24:07  七度空间


  自定义生成代码

  在前文中查看 DataSet 的类代码时,您可能注意到了事实上有两个 Visual Basic 代码文件 — NorthwindDataSet.Designer.vb 和 NorthwindDataSet.vb。如果没有 NorthwindDataSet.vb 文件,请返回到 DataSet Designer 并双击设计器背景,创建该文件。

  这些文件都用于实现组成 DataSet 的类。使用两个文件是为了利用简单且功能非常强大的新特性 — partial classes。它是一个编译器功能,它允许在几个声明之间拆分类(或结构)的定义。不同的声明可能保存在不同的源代码文件中,只要声明都属于同一个程序集和命名空间就可以。Visual Studio 广泛采用了该功能,从而将由设计器生成的某个类的代码与开发人员编写的该类的代码区分开来。在 Visual Studio 2002/2003 中,所有窗体代码都是该窗体类声明的一部分,例如:

Public Class Form1
    Inherits System.Windows.Forms.Form

  该窗体(包括窗体上放置的任何控件)的初始化代码由 Visual Studio 生成。这些代码位于 InitComponent() 方法中,默认情况下,该方法出现在名为“Windows 窗体设计器生成代码”的代码区域中用户编写的代码之前。该区域通常关闭,这是为了尽量避免与您编写的代码搞混而分散您的注意力。在 Visual Studio 2005 中,代码保存在 Form1.Designer.vb 这一完全不同的文件中,这将更有助于您集中注意力。此外,如果想查看该文件的内容,在该窗体中就可以 — 单击解决方案资源管理器工具栏上的 Show All Files,展开 Form1.vb 节点,然后双击 Form1.Designer.vb,代码编辑器中将显示代码。文件 Form1.vb 只包含您(作为开发人员)为 Form1 类编写的代码。

  至于 DataSet 及其相关类的代码,使用部分类和不同文件区分设计器代码和开发人员编写的代码则具有更重大的意义。这种区分不止可使代码更整洁,而且解决了在 Visual Studio 2002/2003 中使用类型化 DataSets 时存在的一个主要问题。

  通常,您还希望在为 DataSet 及其相关类自动生成的代码基础上进行扩展或添加,例如附加属性或自定义验证代码。那么,您可以放心地在生成代码中添加。只要不更改架构就可以,否则您需要重新生成 DataSet 代码。在 Visual Studio 2002/2003 中,由于代码和生成代码都添加在某一个文件中,因此重新生成代码时将清除添加的代码。正是由于使用了部分类,Visual Studio 2005 才得以避免出现这种情况。新生成的代码将覆盖现有的设计器代码并保存在以 .Designer.vb 为扩展名的文件中,而 .vb 文件中开发人员编写的代码仍然完整无缺。

  要扩展使用部分类的 DataSet 功能,一种方法是添加自定义的验证代码。这时可以在生成的类型化 DataSet 中添加一些应用程序逻辑。我们将自定义的验证代码和初始化添加到 NorthwindDataSet 中 Orders 表内增加的新行中。添加一个新行时,我们希望检查传递的邮政编码值是否与实际传递的城市相匹配。如果不是,则将 ShipPostalCode 字段的值更改为 Invalid。假定实现了以下这样一个函数,该函数在给定的邮政编码与给定城市匹配的情况下返回 True:

Function IsPostalCodeInCity (ByVal PostalCode as string, ByVal City as string) As Boolean

  通过以下方式可将该检验条件添加到 NorthwindDataSet:

1.选择数据源窗口工具栏中的 Edit DataSet with Designer,打开 DataSet 设计器。

2.双击设计器背景的空白区域。在代码编辑器中打开文件 NorthwindDataSet.vb。

3.输入以下代码来替换默认代码:

Partial Public Class NorthwindDataSet
    Partial Class OrdersDataTable
        Protected Sub ValidateNewRow(ByVal sender As Object, _
               ByVal e As System.Data.DataTableNewRowEventArgs) _
               Handles Me.TableNewRow
            ' Create a strongly typed instance of the row
            ' This helps us avoid code in quotes, 
' eg, e.Row("ShipPostalCode")
            Dim ordersRow As NorthwindDataSet.OrdersRow
            ordersRow = e.Row
            If Not ordersRow.IsShipPostalCodeNull And _
                    Not ordersRow.IsShipCityNull Then
                If Not IsPostalCodeInCity(ordersRow.ShipPostalCode, _
                        ordersRow.ShipCity) Then
                    ' Set the value of the Ship Postal Code
                    ordersRow.ShipPostalCode = "Invalid"
                    ' Typically, changing a users data is a bad user experience
  ' So indicate an error with the ErrorProvider
                    ' We are illustrating both approaches here
                    ordersRow.SetColumnError( _
                        ShipPostalCodeColumn.ColumnName, "Invalid Postal Code")
                Else
                    ' we always need to reset the error when the value is valid
                    ordersRow.SetColumnError( _
                        ShipPostalCodeColumn.ColumnName, String.Empty)
                End If
            End If
        End Sub
    End Class 

    Private Shared Function IsPostalCodeInCity(ByVal postalCode As String, _
ByVal city As String) As Boolean
        ' This is a stub, just to check functionality
        If city = "Rio de Janeiro" Then
            Return False
        Else
            Return True
        End If
    End Function
End Class

  注意,DataSet 的所有相关类(例如,OrdersDataTable)在其内部均作为嵌套类实现。前面代码中的部分类声明就反映了这一实现过程。

  为了让错误提供程序来提示错误,以补充或代替将邮政编码值更改为 Invalid 这一操作,可执行以下步骤:

1.将 Error Provider 控件从工具箱拖放到 Form1,将其放置在“Ship Postal Code”文本框右侧。

2.在 Error Provider 属性窗口中,将 DataSource 属性设置为 OrdersBindingSource。

  要查看验证代码的执行情况,可以运行应用程序并导航到城市为“里约热内卢”的那条记录,图 7 对此做出说明



图 7. 错误提供程序控件

   该示例仅示范如何轻松地扩展类型化 DataSet 及其相关类的功能,这里的相关类指由 Visual Studio 自动生成的类。您或许还希望在生成的类中添加一些其他的方法和属性。当设计应用程序以及使用 DataSets 时,您会想到多种多样的可能性。关键是要记住,由于在 Visual Studio 2005 中可以使用部分类,您编写的代码是保存在另一个单独文件中的,因此重新生成 DataSet 类时您的代码不会受影响。

  小结

  使用 Visual Studio 2005 生成的类型化 DataSets 从未如此之简单而灵活。DataSetDesigner 为定义 DataSets 而提供了一个更简单、更自然的工具。在 DataSetDesigner 内就可以配置新的 TableAdapter 类,使用该类提供的单一而集中的机制,能够轻松地维护和执行针对某个特定数据表的多个不同查询和命令。利用部分类编译器功能,可以分离设计器生成的代码和开发人员编写的代码,同时在重新生成 DataSet 类时,避免了对为扩展这些类而编写好任意自定义代码的影响。此外,新的 .NET 数据绑定类和机制在结合了 Visual Studio 2005 内部提供的工具,从而使开发以数据为中心的应用程序更加快速、简便。

5页,页码:[1] [2] [3] [4] [5] 

上一篇:一种细腻的导航效果的制作方法
下一篇:站长必读:网站推广之十不可以
Visual Studio 2005中的新DataSet特性 作者:Jackie Goldstein 来源:MSDN
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐