本章内容:
第 1 章介绍了 ADO.NET 的基础知识以及 Visual Basic 6 中数据访问的变化。下面四个应用程序将介绍 Visual Studio 2005 和 .NET Framework 2.0 中用于构建以数据为中心的应用程序的增强功能。ADO.NET 是一个很大的主题,完全可以就此主题单独成书。这些应用程序是您利用 MSDN 文档和在线资源(例如 http://msdn.microsoft.com)进一步研究 ADO.NET 的起点。
对于开发人员而言,一件经常遇到的麻烦事就是必须学习某种产品的新版本,因为新版本会使旧组件过时,或者大大改变完成常见任务的方法。这种不可避免的学习曲线常常会在短期内对工作效率产生负面影响。
Microsoft 为 ADO.NET 2.0 设定的目标为:对其进行增强和扩展,而不改变或破坏它已有的功能。1.1 版中的相同功能在 2.0 版中仍然可用,但现在有更高效的方法来执行常见的数据库任务。例如,Data Sources 窗口提供一个创建和配置访问某个数据源(例如,SQL Server)所需相关对象的中心位置。添加到控件的智能标记提供对常见开发任务的快速访问,如更改控件的类型(例如,将 TextBox更改为 Label)。还可以利用智能标记重新配置数据源,甚至创建新查询以根据用户的输入提取出已筛选的数据(即创建参数化查询)。
研究下面四个应用程序后,您将了解到 Microsoft Visual Studio 2005 和 .NET Framework 2.0 是如何提高工作效率的,并且了解与使用以往的开发工具相比,从应用程序连接到数据源为什么更加方便。
![*](http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/3squares.gif)
本页内容
![]() | 应用程序:表适配器和 DataConnector 类 |
![]() | 应用程序:数据智能标记 |
![]() | 应用程序:主-从窗体和参数化查询 |
![]() | 应用程序:对象数据源 |
应用程序:表适配器和 DataConnector 类
在第一个应用程序中,我们将介绍新的表适配器类和 DataConnector类。这两种类都提供可以立即在应用程序中使用的强大功能,同时限制必须手工编写执行常见任务的代码的数量,因而有助于简化 ADO.NET 开发任务。
新概念
如第 1 章所述,ADO.NET 的主要设计目标是为使用断开连接的数据提供一流支持。通过一组分离到不同命名空间中的类,ADO.NET 提供一种直观的方法来处理断开连接的数据。不必了解每个命名空间中的每个类即可有效使用 ADO.NET。相反,可以主要关注包含访问特定数据源所需类的命名空间。表 4-1 列出一些组成 ADO.NET 最常用的命名空间和类。
表 4-1 ADO.NET 命名空间 | ||
命名空间 | 用途 | 常用类 |
System.Data | ADO.NET 中的通用类 | DataSet、DataTable 和 DataView |
System.Data.Common | 由 ADO.NET 中不同的数据提供程序(如 SqlClient 和 OleDb 等等)使用的一组新的基类 | DataAdapter、DbCommand 和 DbConnection |
System.Data.SqlClient | 包含用于连接到 Microsoft SQL Server 的数据提供程序类 | SqlConnection、SqlCommand 和 SqlDataAdapter |
System.Data.SqlTypes | 由用于表示在 SQL Server 中使用的本机数据类型的类组成 | SqlString、SqlDateTime 和 SqlInt32 |
System.Data.OleDb | 由用于访问 OLE DB 数据源的类组成 | OleDbConnection、OleDbCommand 和 OleDbDataAdapter |
System.Data.ODBC | 用于连接到 ODBC 数据源的类 | OdbcConnection、OdbcCommand 和 OdbcDataAdapter |
System.Data.OracleClient | 用于访问 Oracle 数据源的类 | OracleConnection、OracleCommand 和 OracleDataAdapter |
System.Xml | 由为访问和使用 XML 数据提供基于标准的支持的类组成 | XmlAdapter、XmlReader 和 XmlWriter |
System.Data.DataSet
DataSet对象用于存放来自一个或多个数据源的数据。它将数据作为一组表以及这些表之间定义的可选关系进行维护。DataSet类是通用的,因此它不绑定到任何特定类型的数据源。可以从许多数据源将数据加载到 DataSet中,包括 Microsoft SQL Server、Oracle 数据库、Microsoft Access、Microsoft Exchange、Microsoft Active Directory 或者任何与 OLE DB 或与 ODBC 兼容的数据源。
虽然没有绑定到任何特定的数据源,但是 DataSet类可以用来存放关系表格格式的数据,正如在关系数据库(如 Microsoft SQL Server)中看到的一样。图 4-1 是 DataSet 中两个相关表的可视化表示。
![](https://i-blog.csdnimg.cn/blog_migrate/752dc46502d9d3c71f812446ff75cd84.png)
图 4-1 DataSet 中两个相关表的可视化表示。
图 4-1 所示的每个表在 DataSet中都实现为一个 DataTable。两个表之间的关系在 DataSet中实现为一个 DataRelation对象。DataRelation对象提供通过外键将子表和父表关联起来的信息。切记,图 4-1 只是 DataSet 某个特定实例结构的可视化表示。DataSet可存放任何数量的表以及这些表之间定义的任何数量的关系。
图 4-1 实际上是 Visual Studio 2005 中新的 DataSet 设计器的屏幕截图。图 4-2 显示的 DataSet 设计器用来编辑新的 Data Sources 窗口中数据源的结构。在本章后面的“演练”一节中将针对此应用程序进一步讨论 DataSet 设计器。
![](https://i-blog.csdnimg.cn/blog_migrate/3478a8f1fc7e69d8cc92d29fc5d0b8d8.png)
图 4-2 使用 DataSet 设计器编辑数据源。
从数据库中检索数据
虽然有几种使用 DataSet 的方法,但最常用的一种方法是连接到一个数据库,并用该数据库中的数据填充 DataSet。在 ADO.NET 中,每个数据提供程序(SqlClient 和 OleDb 等)都提供一组专用类与数据源进行交互。要检索数据库中的数据,需要连接到数据库,执行一个查询或存储过程,然后用结果填充 DataSet。实现这些需要一组对象协同工作,包括连接对象和命令对象。
每种 ADO.NET 数据提供程序都包含一个专用连接类,用于连接到它支持的数据源类型。例如,使用 SqlConnection类可以将应用程序连接到 SQL Server 7.0 或更高版本。也可以使用 OleDbConnection对象,但 SqlConnection类已针对使用 SQL Server 进行了优化,从而使其成为一个更好的选择。对于没有特定 ADO.NET 数据提供程序的数据源,可以使用 OleDbConnection 对象,只要该数据源有可用的 OLE DB 提供程序即可。应该使用 OleDbConnection 类来连接到非数据库的数据源(如带分隔符的文本文件)。
一旦建立了到数据源的连接,数据提供程序中的其他对象就必须从数据源提取数据并用其填充 DataSet。Visual Studio .NET 2003 中填充 DataSet的方法是:通过数据适配器对象用数据填充 DataSet。每个 ADO.NET 数据提供程序都包含它自己独特的数据适配器类。例如,SqlClient提供程序包含 SqlDataAdapter类。SqlDataAdapter类需要 SqlCommand对象和 SqlConnection对象来检索数据。要选择数据,可以为数据适配器提供一条 SELECT 语句或一个存储过程,并让数据适配器生成自己的 SqlCommand对象,也可以显式地创建自己的 SqlCommand对象,然后将其分配给 SqlDataAdapter 的 SelectCommand属性。调用数据适配器的 Fill 方法告知数据适配器执行它的 SelectCommand,并用通过 SelectCommand 检索的数据填充 DataSet。下面的代码是一个通过 SqlDataAdapter 用数据填充 DataSet 的示例。
Dim conn As New SqlConnection conn.ConnectionString = _ “server=(local);database=Northwind;Trusted_Connection=True" Dim adapter As SqlDataAdapter adapter = New SqlDataAdapter(“SELECT * FROM Products", conn) Dim dsProducts As New DataSet conn.Open() adapter.Fill(dsProducts) conn.Close()
在 Visual Studio 2005 之前,数据适配器是 DataSet和实际数据源之间的唯一联系。如果更改 DataSet 中的数据,DataSet中的每个表就需要不同的数据适配器,并且必须调用每个数据适配器的 Update方法。
虽然在 Visual Studio 2005 中完全支持用数据适配器的方法来读取和更新数据,但还有一些新的读写数据的方法,这些方法可以减少和简化必须编写的代码。在此应用程序中,您将看到如何通过只编写一行代码就建立数据库连接,并从 Northwind 数据库中检索数据。此应用程序重点介绍 Visual Studio 2005 和 .NET Framework 2.0 中一些新的数据组件和功能,包括表适配器和 DataConnector类。
演练
使用 Visual Studio 2005,只用一行代码就可以创建数据驱动的应用程序,该应用程序将数据显示在数据网格中。当然,需要的不只是包含在该行代码中的信息。但是,编写一行又一行的代码以建立数据库连接,一次填充多个数据表,以及进行数据绑定这些乏味的工作均可由 Visual Studio 2005 处理。通过使用新类(如 DataConnector),Data Sources 窗口和 Data Source Configuration Wizard 这两个 IDE 新功能可以建立数据访问。
此应用程序以一个名为 NorthwindGrid 的新 Windows 应用程序开始。Visual Studio 2005 可能不会自动显示 Data Sources 窗口,这取决于 IDE 设置。如果没有显示 Data Sources 窗口,可以选择 Data | Show Data Sources 菜单命令。然后显示一个新的浮动窗口,可将其停靠在 IDE 中,如图 4-3 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/8b185bc50b0bdd7b13ba6a16e2890d8a.png)
图 4-3 Data Sources 窗口。
一旦停靠了 Data Sources 窗口,就可以选择 Data Sources 选项卡,使其成为活动窗口,并单击 Add New Data Source 链接或窗口工具栏上的 Add New Data Source 按钮。这将显示打开的 Data Source Configuration Wizard 页。阅读欢迎消息,然后单击“Next”开始配置数据源,如图 4-4 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/f7f5d9b6b197d17aabda93ed050b3c66.png)
图 4-4 Data Source Configuration Wizard。
Data Source Configuration Wizard 支持四种类型的数据源。第一个选项“Database”允许在本地计算机或远程服务器上为数据库服务器创建数据源。第二个选项“Local Database File”允许选择 MDF SQL Server 数据库文件或 Microsoft Access .MDB 文件。如果数据来自 Web 服务,则可以选择第三个选项来为项目添加新的 Web 引用。第四个选项是“Object”。该选项允许将用户界面绑定到自己的一个类。稍后将在“应用程序:对象数据源”一节中介绍对象数据源。此应用程序使用数据库数据源。
Data Source Configuration Wizard 中的下一步是为数据源选择一个现有连接或创建一个新连接。首次运行该向导时,没有预先存在的连接可用。但是以后使用该向导时,可以选择重用以前创建的连接。当单击该向导中的 New Connection 按钮时,将显示 Connection Properties 对话框,如图 4-5 所示。可以使用该对话框配置连接数据库服务器的所有设置。
![](https://i-blog.csdnimg.cn/blog_migrate/3aae08565487a34f78c19c45e0f4fef4.png)
图 4-5 Connection Properties 对话框。
该向导将提供将得到的连接字符串保存到应用程序配置文件 (app.config) 的选项。如果在项目中再次使用同一个连接,那么将连接字符串自动保存到 app.config 是非常方便的。
向导的下一个配置步骤如图 4-6 所示,要求为该数据源选择数据库对象。可以选择任意数量的表、视图、存储过程和函数。
![](https://i-blog.csdnimg.cn/blog_migrate/bc96eed143086780186a17cdb5dcb2a5.png)
图 4-6 在向导中选择数据库对象。
当选择一个数据库对象(例如一个表)时,可以在树视图中展开它的节点(如图 4-6 所示),并选择只选中该表的特定列。选择数据库对象后,向导将自动生成 SELECT 语句(或存储过程和函数调用)。
完成 Data Source Configuration Wizard 后,新的数据源会添加到 Data Sources 窗口。(示例请参见图 4-3。)Data Sources 窗口将数据源显示为一个根节点是 DataSet的树视图,该视图包含在 Data Source Configuration Wizard 中选择的各个数据库对象(表、视图等)的节点。如果展开其中的一个表(如图 4-7 所示),将看到 DataSet 只包含在 Data Source Configuration Wizard 中选择的字段。
![](https://i-blog.csdnimg.cn/blog_migrate/a46b518e6dca0222ce7b65fbf331a5e0.png)
图 4-7 在 Data Sources 窗口中展开的 DataSet。
如果要在窗体的网格中显示其中一个表的数据,只需将适当的节点从 Data Sources 窗口拖到窗体上即可。Visual Studio 2005 将自动在窗体顶部创建一个数据绑定的 DataGridView控件和一个附带的导航栏。所得到的窗体如图 4-8 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/1ae2ffb26b0dd9054d5e64cd6c68d017.png)
图 4-8 在设计时带有数据绑定 DataGridView 控件的窗体。
如果已经用 Visual Studio .NET 2003 创建了一个数据驱动的应用程序,则有可能已经在某个时刻将数据适配器拖到窗体上并完成了 Data Adapter Configuration Wizard。Data Adapter Configuration Wizard 将连接和数据适配器对象放置到窗体的组件栏中。Visual Studio 2005 将 4 个对象添加到组件栏:DataSet、DataConnector、表适配器和 DataNavigator。
注组件栏是 IDE 中的特殊区域,它显示宿主于 Windows 或 Web 窗体上并且没有用户界面的控件。在 Visual Basic 6 中,没有用户界面的控件(例如,Timer)仍然必须放置在窗体设计图面,这使设计时放置控件比较麻烦。
添加到此应用程序窗体的 DataSet只是 DataSet类的一个实例,它在创建数据源时自动创建。
DataConnector
DataConnector 是 .NET Framework 2.0 中的一个新类。它充当其他控件要绑定的数据源。它公开的数据是 DataConnector使用的数据,来自 DataConnector自己的数据源。DataConnector 的典型用途是连接数据绑定的控件和数据源中的一个表(例如,在“Data Sources”窗口中定义的 DataSet的一个 DataTable)。如果不使用 DataConnector组件,则将 DataGridView控件绑定到 DataSet中唯一的表时需要编写代码。但使用 DataConnector 控件,可将 DataConnector 的数据源配置为 DataSet 的单个表。然后将 DataGridView绑定到 DataConnector。因此,您就可明晰名称 DataConnector 的由来 — 它有助于将组件或控件与 DataSet 中的数据子集相连接。DataConnector也可将命令从数据使用者传递到数据源。
表适配器
表适配器是 Visual Studio 2005 中新增的功能。它们是设计器生成的组件,用于连接 DataSet对象及其基础数据源。在应用程序中创建数据组件(如通过 Data Source Configuration Wizard)时,系统自动创建一个或多个自定义表适配器。表适配器类似于数据适配器,但它们是强类型的,这意味着每个表适配器都是一个由 Visual Studio 2005 自动生成的唯一类,以便只使用为特定数据库对象(如 Products 表)选择的字段。
使用 ADO.NET 创建数据库应用程序时,通常要广泛使用 DataSet对象。DataSet 存放数据,但它依靠其他对象向基础数据源移动数据或从其中移出数据。在 .NET Framework 1.1 中,数据适配器对象是数据源的生命线,必须为 DataSet 中的每个 DataTable 创建数据适配器。例如,如果创建一个 DataSet来存放 Northwind 数据库中的 Orders 和 Order Details 表,则需要两个数据适配器。
.NET Framework 2.0 中的新表适配器与数据适配器不同,因为它们可以包含多个查询以支持数据源中的多个表,允许一个表适配器更新 DataSet 中的多个表。将表适配器用于前面的示例,会获得一个有两种查询的表适配器:一种用于 Orders 表,一种用于 Order Details 表。在此应用程序中,表适配器中只有一种查询(用于 Customers 表)。如果右键单击 Data Sources 窗口中的“Customers”表并选择“Edit Data Source With Designer”,为 Customers 返回的数据结构将在 DataSet 设计器中打开,如图 4-9 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/56a2ba75117b18a8170c397792d1c492.png)
图 4-9 CustomersTableAdapter 查询。
在图 4-9 中可以看到,Customers 表的底部有一个标记为“Fill, GetData()”的项。该项包含 Customers 表在表适配器中的连接和查询信息。如果查看 CommandText 属性(在“Properties”窗口中),可以看到用于填充 Customers 表的 SELECT 语句的开头。
如果需要某个表的数据筛选视图,可以创建其他查询来填充 DataSet 中的表。对于此应用程序,右键单击 Customers 表的“CustomersTable- Adapter”标题(如图 4-9 所示),并选择“Add Query”菜单命令。
注如果在表适配器中创建多个查询,则必须确保返回的数据正确地映射到表架构;否则,查询将失败。
DataNavigator
新的 DataNavigator组件为导航绑定到用户界面控件上的数据提供服务。它提供的服务有点类似于 Visual Basic 6 中的 Data 控件,该控件通过一组导航按钮提供导航服务。ADO.NET 中的 DataNavigator 组件用于支持在 DataSet 的记录之间进行导航。它还提供允许添加、编辑和删除数据的服务。
DataNavigator控件的功能通过一个或多个 ToolStrip控件公开,如前面的图 4-8 所示。ToolStrip按钮执行诸如添加和删除记录这样的任务。
如果使用过 ADO.NET 的以前版本,您就知道导航 DataSet中的记录并不像原来那样简单。如果使用 ADO Recordset,就会有 MoveFirst、MovePrevious、MoveNext 和 MoveLast方法,它们允许导航 Recordset数据。通过使用在 Recordset中保持当前位置并导航记录的游标,使得这些导航功能成为可能。ADO.NET DataSet 取代作为基于中心记录的数据对象的 Recordset 对象,它没有游标,也不知道它的内容来自于哪个数据存储。没有游标或等同的对象来保持位置,导航就不那么简单了。
将窗体上的控件绑定到 ADO.NET DataSet并提供保持所有控件同步的导航服务,是通过使用两个称为 CurrencyManager和 BindingContext 的对象来实现的。对于应用程序中每个数据绑定的窗体,至少有一个 BindingContext对象。该对象将对任何存在的 CurrencyManager 对象负责。窗体上的每个数据源都将有一个 CurrencyManager对象。该 CurrencyManager对象负责跟踪在 DataSet中的位置并全面管理对数据源的绑定。可以调用 CurrencyManager对象的必要方法来导航记录,而 BindingContext确保所有的绑定控件都保持同步。此应用程序中使用的 DataNavigator 控件在一个更易于使用的窗体中提供该功能。
此应用程序的组件,通过使用可视化设计器创建并连接在一起。无需任何代码,导航栏就可以正常工作。唯一所需的代码就是使用表适配器从数据源提取数据来填充 DataSet的一行代码。这是在窗体的 Load 事件处理程序中实现的,如下所示:
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Me.CustomersTableAdapter.Fill(Me.NorthwindDataSet.Customers) End Sub
该事件处理程序和填充数据集和网格的代码由 Visual Studio 2005 自动添加。需要做的只是按下 F5 并查看从数据库加载的数据网格。尽管看起来非常简单,只需用鼠标指指点点即可,但此应用程序完成的却是一件了不起的事。如果研究一下 InitializeComponent 方法,会看到大约 300 行代码;您无需编写这些代码 — 工作效率大大提高了!
虽然做了许多事情,但此应用程序还是相当简单的。它说明连接到数据库和填充网格控件的要点。其余的数据应用程序将重点介绍 Visual Studio 2005 中 ADO.NET 的其他方面。
DataSet 设计器
此时花一些时间来更仔细地研究一下 DataSet 设计器是很值得的。该实用工具进行了重大改进,并且是 Visual Studio 2005 中比较突出的数据访问增强功能之一。
在 Visual Studio .NET 2003 中,要编辑 DataSet 的结构时,可以通过编辑 XML 架构 (XSD) 来做到这一点。虽然有一个可视化设计器,但术语和用户界面与 DataSet及其构成对象(例如 DataTable)不一致。
如果使用新的 Data Sources 窗口,可以右键单击该窗口并选择“Edit Data Source with Designer”。这将打开 Dataset 设计器并允许更改 DataSet 的结构。如果使用 DataSet 的该视图,则可通过一种更直接的方式图形化操作绑定到 DataSet 的表和查询,而不必处理 XML 架构。
为了帮助您理解 Dataset 设计器的一些功能,考虑一个可能在任何处理数据库数据的应用程序中出现的问题。有时您可能忘记了添加应用程序显示数据所需的表。使用 Visual Studio 2005,只需通过右键单击设计器图面的空白区域并选择 Add | Data Component,即可在 DataSet 设计器窗口中添加遗漏的表。设计器在 DataSet 设计器窗口中添加一个新表并打开 Data Component Configuration Wizard。
Data Component Configuration Wizard 与 Data Source Configuration Wizard 有一部分是类似的。Data Component Configuration Wizard 提示您为新表建立到数据源的连接,并为数据读写操作提供或选择查询或存储过程。可以从该向导启动 QueryBuilder 来创建一个查询图形界面。可用于 QueryBuilder 的数据库中的表、视图和函数如图 4-10 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/1f7ecaa423e10a421d967d84833da80a.png)
图 4-10 图形 QueryBuilder。
在向导中设置查询后,可选择将一些专用方法添加到 DataSet 中。Fill 方法(可根据需要重新命名)用数据填充表。GetData方法(根据需要也可以重新命名)返回对 DataTable 的一个已填充实例的引用。还可以选择为用数据更改更新数据源而创建方法。该向导页如图 4-11 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/5e5e7e8bad92aa1190d33c6739cf9e0e.png)
图 4-11 Data Component Configuration Wizard。
为 DataSet 添加新表时,该向导读取数据库架构并为 DataSet 中已有的表添加适当的关系。这些关系表示为 DataSet 设计器中表之间的线,如图 4-12 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/02305e220cb03f32781c38d1ec0ab9c9.png)
图 4-12 DataSet 设计器中的相关表。
设计器的一个不便之处是,关系线只描述两个表是关联的事实。但是显而易见,关系必须是表中字段之间的关系。在每个表中可视化地检查字段通常可以搞清楚这种关系。但如果字段列表非常长,快速推断这种关系就比较困难。幸运的是,设计器提供一种功能,使用它可通过显示和编辑标签以图形方式更清楚地表示这种关系。如果右键单击关系线并选择“Show Relation Labels”,关系名就会显示在可视化设计器中。
默认名 FK_Orders_Customers 没有指示 Orders 表和 Customers 表是如何关联的 — 它只是告诉您这两个表之间有联系。要编辑标签以指示关系,可以右键单击关系线并选择“Edit Relationship”。这将打开“Relation”对话框,如图 4-13 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/38b8cd1c3e7611b5ac0805c6246e8050.png)
图 4-13 编辑关系的“Relation”对话框。
“Relation”对话框能够管理关系,包括组成关系的表和列。更改关系的名称将更改在 DataSet 设计器中显示的标签。将关系的名称更改为 Customers_CustomerID_Order 会使关系更加不言自明,因为它表示表是通过 CustomerID 字段关联的。
“Relation”对话框还允许更改关系的类型(外键约束、关系或者二者),以及当更新或删除父记录时相关的记录会发生什么(即,如果使用级联,它会成为 SetNull、SetDefault 或什么也不发生)。还可以配置关系,这样当接受或拒绝对父记录的更改时会自动接受或拒绝对子记录的更改。
小结
从此应用程序可以看出,能够轻松地配置 Visual Studio 2005 的数据访问以及通过网格进行的显示。新的表适配器模型将数据库连接、命令和数据适配器对象捆绑在一起,为数据驱动应用程序提供了一种简化的编程模型。使用一行简单的代码并单击几下鼠标,即可拥有了一个允许进行数据库更新、添加和删除操作的工作数据库应用程序。新的 DataSet 设计器能够通过一个易于使用的可视化设计器配置设置并编辑数据源的结构(以及后面的行为)。
新的 DataConnector类充当数据访问对象和数据使用对象间的中介。新的 DataNavigator组件提供用于记录间移动、添加和删除记录的导航服务。DataNavigator组件管理为浏览数据记录提供用户界面的 ToolStrip控件。此应用程序使用所有这些新功能,通过手工输入的唯一一行代码创建一个实用的数据驱动用户界面。
应用程序:数据智能标记
智能标记是 Visual Studio 2005 中的新功能,可以使用这一功能轻松访问常见任务。此应用程序使用数据绑定控件的新智能标记来创建和配置用户界面。
新概念
智能标记一般是向导或其他工具的入口点,允许您配置数据源或数据组件的某些方面。使用智能标记,可快速访问开发人员在不同类型的控件和组件上执行的最常见任务。通过在选择控件或将光标悬停在控件上时出现的小图标,可以访问智能标记。
演练
此应用程序包含一个数据绑定窗体,该窗体显示 Northwind 数据库中 Suppliers 表的数据,每次一条记录(Details 视图)。此演练的目的是解释智能标记。完成该演练的另一个好处是以一个工作应用程序结束,但该应用程序本身不是本节的要点。下一个应用程序将更详细地讨论从数据窗体和主-从数据窗体。
将使用 Data Sources 窗口添加一个指向 Northwind 数据库的新数据源。
主-从窗体
如果在 Data Sources 窗口中选择一个表,则会出现一个下拉箭头以及可以从中进行选择的视图选项列表。默认为 DataGridView,前面介绍的表适配器和 DataConnector 应用程序中都使用了它。下拉列表中的其他选项之一是“Details”,如图 4-14 所示。如果在“Data Sources”窗口中配置一个表以使用“Details”视图,则将该表拖到窗体上会提示 Visual Studio 2005 为每个字段创建单独的控件,并为导航记录创建一个 DataNavigator组件,如图 4-15 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/497e0f879fbcdbb012497e9e260012c2.png)
图 4-14 更改从数据源表创建的用户界面的类型。
![](https://i-blog.csdnimg.cn/blog_migrate/ce783620ff1d17549727e5c86d242d51.png)
图 4-15 “Details”视图用户界面。
在某些数据驱动的应用程序中,用户需要查看主键数据。在此应用程序中,用户可以查看 SupplierID值,该值是由数据库自动生成的主键字段。由于用户不应当更改此值,因此用户界面应该不支持他们输入新值。在大多数情况下,只需禁用 TextBox控件或将其更改为 Label 控件。但是使用智能标记,只需单击几下鼠标就可以将控件更改为另一种类型的控件,并保留数据绑定。在此应用程序中,SupplierIDTextBox控件(如图 4-15 所示)要更改为 Label 控件。不必删除 TextBox控件,添加一个 Label 控件,然后将 Label 重新绑定到适当的数据源,只需选择 TextBox控件的智能标记箭头,并从 Convert To 下拉列表中选择 Label 即可,如图 4-16 所示。这会将 TextBox更改为 Label 控件,Label 控件将阻止对该控件进行数据修改,但仍然会保留连接就绪的数据源。
![](https://i-blog.csdnimg.cn/blog_migrate/54a266e1c22f7acd917cfec666d196c6.png)
图 4-16 使用智能标记将 TextBox 更改为 Label。
智能标记在本质上是上下文敏感的。对于数据绑定控件,甚至可以通过基础数据源的数据类型来决定应该(或不应该)允许使用什么智能标记。例如,如果通过某个绑定到基础整数字段的控件的智能标记选择 Convert To下拉列表,那么可用控件列表对于整数数据就是合适的。如果使用 SupplierIDTextBox 的智能标记,则可以转换为 ComboBox、LinkLabel、ListBox、NumericUpDown 或 Label。因为基础数据类型是数值类型的,所以 NumericUpDown是一个可以显示这些数据的有效控件类型。
主-从窗体
Visual Studio 2005 中一种更强大的智能标记功能是可以创建主-从窗体。使用这种功能,可以相对容易地将一个简单的 Details 视图窗体转换为一个更复杂的主-从数据窗体。此应用程序在同一个窗体上使用两个关联的 Details 视图:父部分用于供应商,而子部分用于每个供应商提供的产品。所得到的窗体如图 4-17 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/e8056270c6500a5b13a09b14b23c7497.png)
图 4-17 使用智能标记创建的主-从视图。
从图 4-15 所示的原始窗体开始,可以使用智能标记创建和配置详细信息部分,以创建一个类似图 4-17 所示的窗体。在此应用程序中,SupplierID是 Suppliers 表和 Products 表之间的联系。需要使用 DataConnector的智能标记来启用此应用程序的主-从功能。当打开 SuppliersDataConnector控件的智能标记时,可以看到“Configure Master Details”的一个选项,如图 4-18 所示。选择该选项会打开 Add Related Databound UI 对话框,如图 4-19 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/28632bdfc8180f5196f61502796dd929.png)
图 4-18 使用智能标记创建主-从窗体。
![](https://i-blog.csdnimg.cn/blog_migrate/e3099bb027fda24d0dca0b79e4c2fb82.png)
图 4-19 Add Related Databound UI 对话框。
打开该对话框时,将发现数据源下拉列表中没有选中的值。从数据源下拉列表中选择适当的表,Visual Studio 2005 将自动在对话框的子表部分显示相关表。在本例中,通过 SupplierID 字段将 Products 表关联到 Suppliers 表。
此应用程序使用 Details 视图显示产品,一次一条记录(而不是在一个网格中),因此一定要选择 Details 视图。这意味着需要一些方法来控制对每个供应商的产品的导航。这样的导航由第二个组件 DataNavigator来处理。导航控件放置在窗体上的 RaftingContainer 中,它是一个存放工具栏类型的条形控件(如 ToolStrip条)的流布局控件。双击工具箱中的 DataNavigator,向窗体添加一个新的 DataNavigator。然后将 DataNavigator的 Raft 属性设置为一个预先存在的 RaftContainer 控件(Top、Bottom、Left 或 Right)。还必须将新 DataNavigator 的 DataConnector 属性绑定到 DataConnector,Visual Studio 2005 自动为用 SupplierID (FK_Products_SuppliersDataConnector) 筛选的产品创建 DataConnector,这是使用 Add Related Databound UI 对话框创建的关系的一部分(请参见图 4-19)。
在将详细信息部分添加到该窗体后,应该注意到 Visual Studio 已经在该窗体的 Load 事件处理程序中添加了一行代码,以填充 DataSet 中的 Products 表: Me.ProductsTableAdapter.Fill(Me.NorthwindDataSet.Products)
当运行此应用程序时,可以在各供应商之间进行导航,并查看每个供应商首条产品记录的更改。然后可以导航每个供应商的每条产品记录。
小结
虽然数据控件的智能标记不太多,但可以看到,它们使得在 Visual Studio 2005 中开发以数据为中心的应用程序比在 Visual Basic 6 甚至 Visual Studio .NET 2003 中更加容易。此应用程序介绍了智能标记和一些可以使用它们完成的常见任务。下一个应用程序的演练包含使用智能标记创建参数化查询,以便轻松地筛选结果集。
应用程序:主-从窗体和参数化查询
大多数数据驱动的应用程序都要求将不止一个表绑定到一个网格控件。数据源更可能包含多个相关表。因此,您常常会发现自己要创建需要使用数据主-从视图的应用程序。一次一条的简单导航方案对于现实生活中使用大量数据的用户而言常常是不够的。用户需要能够搜索和筛选记录。此应用程序说明如何使用新的数据功能来更快、更好地构建数据应用程序。
新概念
Visual Studio 2005 和 .NET Framework 2.0 包含许多新功能,使创建数据的主-从视图更为简单。创建一组数据绑定控件后,可以让 Visual Studio 2005 只使用所需的一行代码来自动创建一个网格或相关表中子记录的 Details 视图,以用关联表中的数据填充 DataSet。
在创建数据源和数据绑定控件时,如果使用默认的设置,应用程序将向用户显示所有的数据。一个重要功能是能够让用户输入搜索条件,并只查看那些满足搜索条件的数据。使用 Visual Studio 2005 中新的搜索条件生成器,可以向应用程序添加参数化查询和用于搜索与筛选数据的用户界面,而无需编写任何代码!
演练
在此应用程序中,使用主-从视图为每个客户显示 Northwind 数据库中的订单数据。这种设置要求将数据库两个表中的数据显示在窗体上。这两个表在数据库中已经是关联的,因此 Visual Studio 2005 将检测到这种关系。但是,当您从一个客户导航到下一个客户时,必须提供一些附加信息来确保显示适当的订单。
应用程序用户界面
此应用程序是一个标准的 Windows 应用程序,它包含一个主-从窗体,该窗体的顶部有绑定到单个控件的客户信息(主数据)。客户订单(详细信息数据)显示在网格中。图 4-20 显示此应用程序的用户界面。
![](https://i-blog.csdnimg.cn/blog_migrate/1b555fa3383712875342b1f939aabe79.png)
图 4-20 应用程序用户界面。
创建主-从窗体的第一步是配置数据源。Visual Studio 2005 中一个不错的功能是能够记住以前创建的连接字符串,这样就可以从中选择而不是重新进行相同的配置设置。可以在 Visual Studio 2005 中发现许多很小但却非常有用的工作效率增强功能,这种功能是其中之一。
此应用程序的数据来自 Northwind 数据库的 Orders 表和 Customers 表。在 Data Sources 窗口中创建数据源后(在前面的应用程序中描述过),可以将控件添加到窗体。有些控件将绑定到主数据,而有些控件将绑定到详细信息数据。然后,必须建立主数据和详细信息数据之间的重要联系,以便只显示当前所选客户的订单。
在表适配器和 DataConnector 应用程序中,DataTable从 Data Sources 窗口拖到窗体并自动创建了一个网格控件。在 Visual Studio 2005 中,网格视图是默认视图,但它不是在使用 Data Sources 窗口自动生成控件时的唯一选项。如果在 Data Sources 窗口中选择一个表,则会出现一个下拉箭头,它提供一个可从中选择不同视图选项的列表。默认视图是 DataGridView,它可以在表适配器和 DataConnector 应用程序中使用,并且将用于此应用程序的详细信息部分。下拉列表中的一种选项是 Details。如果将 Data Sources 窗口中的表配置为使用 Details 视图,则将该表拖到窗体上会提示 Visual Studio 2005 为每个字段创建单独的控件,并为导航记录创建一个 DataNavigator组件。
一旦窗体上有了主数据部分,就可提供主数据(客户信息)和详细信息数据(客户订单)之间的链接信息。Visual Studio 2005 使得这非常简单,尤其是与使用 Visual Studio .NET 2003 手动将数据链接在一起的过程相比。首先选择公开父数据的 DataConnector,这些父数据将与子数据相关联。在此应用程序中,将使用 CustomerDataConnector。这里可以通过 Data 菜单或一种新的智能标记操作完成相关数据的设置。当打开智能标记时,选项之一是“Configure Master Details”。选择该智能标记操作,打开如图 4-21 所示的对话窗口。
![](https://i-blog.csdnimg.cn/blog_migrate/2466e2b960a31353f97222fd3918acf3.png)
图 4-21 使用“Configure Master Details”选项将关系添加到窗体上的数据绑定项。
首先,从该对话框窗口的下拉列表中选择父表,然后选择子表。接着,决定是否以网格或在 Details 视图中显示子行。在此应用程序中,Customers 是父表,而 Orders 是相关的子表。使用网格显示子数据。
关闭该对话窗口后,系统会自动将 Orders 网格添加到窗体上。表适配器和 DataConnector组件也添加到窗体中。在此应用程序中,名为 OrdersTableAdapter 的表适配器提供用订单数据填充 DataSet 的逻辑。DataConnector作为显示订单数据的 DataGridView控件的数据源
为了在此应用程序中显示任何数据,必须用数据填充 DataSet中的表。此应用程序中有两个表适配器:一个用于客户数据,一个用于订单数据。当在表适配器上调用 Fill 方法时,表适配器将使用数据库中的数据填充 DataSet中对应的表。为了填充此应用程序中的两个表,必须为每个表适配器调用 Fill 方法。下面的 Form1_Load事件处理程序中的代码调用了两次 Fill 方法:
Me.CustomersTableAdapter.Fill(Me.NorthwindDataSet.Customers) Me.OrdersTableAdapter.Fill(Me.NorthwindDataSet.Orders)
如果此时运行该应用程序,可以用导航控件导航不同的客户。网格中的订单信息将根据当前选择的客户而变化。
对于不重要的演示,一次只浏览一条记录就可以了。但在现实世界中,用户需要能够快速定位到特定的客户。Visual Studio 2005 通过允许为窗体创建参数化查询来帮助解决这个问题。
在此应用程序中,用户能够输入一个客户名称并直接导航到客户的记录。为了启用这种类型的查找,首先选择 CustomersDataConnector的智能标记,然后选择“Parameterize Data Source”操作。(也可以通过“Data”菜单访问这种功能。)遵循这些步骤将打开“Search Criteria Builder”对话框,如图 4-22 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/d2b3c1151561b04138eafdbadfe289ab.png)
图 4-22 用来构建参数查询的“Search Criteria Builder”对话框。
搜索条件生成器可以帮助您创建参数化查询,该查询将根据用户的输入返回一个筛选的结果集。构建这种查询有两种基本方法:可以自己编写 SQL,也可以使用可视化的 QueryBuilder。Visual Studio 2005 通过检查已经选择并绑定到窗体控件上的字段来尝试提供大部分查询。在大多数情况下,只需完成 WHERE 子句即可。滚动到已在查询文本框中提供的 SELECT 语句末端并添加一个如下所示的筛选器:
WHERE CompanyName LIKE @Company
添加的筛选器告知查询选择 CompanyName 字段值与用户输入模式(例如 B%)匹配的所有被选字段。@Company参数是一个输入参数并以用户界面中输入的值进行替代。参数名可以是所希望的任何名称。在此应用程序中,它称之为 @Company,以反映查询的目的 — 按公司名筛选结果。
查询的名称(也在搜索条件生成器中配置)同样也是用来以查询结果填充 DataSet中适当 DataTable的方法名。在命名查询时,搜索条件生成器鼓励使用 FillBy前缀。不必在查询名中使用该前缀,但是将它作为前缀是一个不错的主意。在此应用程序中,将查询命名为 FillByName。正如已经提到的,也可以使用 QueryBuilder 以图形方式构建查询,如图 4-23 所示。以这种方式创建查询最大的好处是能够在代码中执行之前验证该查询。
![](https://i-blog.csdnimg.cn/blog_migrate/ddaad6c5644680cd9ff2e465a227c1eb.png)
图 4-23 用于以图形方式构建查询的 QueryBuilder 对话框。
重要事项如果决定使用 QueryBuilder 生成查询,则要确保所选的字段与窗体上显示的字段相同。如果未能选择适当的字段,窗体上的一些控件可能不包含任何数据。
配置新的参数化查询后,新的 ToolStrip条将放置在窗体上,供用户输入新查询的条件。在此应用程序中,用户将在 FillByCompanyNameToolStrip 中输入公司的名称作为查询的参数。
首次启动该应用程序时,将在 Form1_Load事件处理程序中执行创建数据源时创建的默认 Fill 方法。然后,如果在 FillByCompanyNameToolStrip条中输入一个值(例如 B’s Beverages)并按“Enter”键(或单击 FillByCompanyName),则筛选主记录。然后在导航筛选的记录时(如果匹配的记录有多条),更新详细信息网格以显示当前客户的订单。图 4-24 显示具有一组筛选的主记录的应用程序。
![](https://i-blog.csdnimg.cn/blog_migrate/b559b7d6ff39ba59d311008b7bb7023d.png)
图 4-24 筛选的客户记录集。
DataNavigator
前面的应用程序介绍了 DataNavigator,但它没有深入介绍编写数据驱动的应用程序时实际减少的编码工作量。您肯定已经注意到,DataNavigator不但包含用于导航记录的控件,而且还包含用于添加、删除和保存记录的控件。
默认情况下,导航器 ToolStrip中的“Save”按钮是禁用的。显然,许多数据库应用程序具有有限的值,不能添加、编辑和删除数据并保存更改。在此应用程序中,启用“Save”按钮并在其单击事件处理程序中添加一些代码,以将更改传递到数据库。这些代码检索 DataSet中已更改的行,然后只将已更改的行传递给表适配器的 Update方法,如下所示:
Private Sub dataNavigatorSaveItem_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles dataNavigatorSaveItem.Click OrdersTableAdapter.Update(NorthwindDataSet.Orders.GetChange()) End Sub
请注意,进行更新涉及不同的对象和方法。已更改的数据位于 NorthwindDataSet 中的 Orders 表。通过调用 GetChange提取已更改的数据,然后将其传递给 OrdersTableAdapter 的 Update方法,该方法将更改发送给数据库。Update方法将插入、更新和删除更改传递给数据库。
您可能想知道,Update方法如何找到 Orders 表中被删除的行(既然已将它们删除了)。实际发生的情况是,删除的行只是标记为被删除并保留在 DataTable 中。这种行为允许您稍后访问这些已标记为删除的行,并选择是否将删除提交给数据库。DataTable中 DataRow对象的 RowState指示是否删除、添加、修改、不修改行等。
调用 OrdersTableAdapter.Update方法时,实际上是使 SQL 语句发送到数据库进行执行。行的 RowState决定使用的 SQL 语句是 INSERT、UPDATE 还是 DELETE 语句。当创建数据源并使用 Data Source Configuration Wizard 自动生成 INSERT、UPDATE 和 DELETE 查询时,Visual Studio 2005 实际上为使用它们创建了查询和所有的代码。
您可以发现,在 Visual Studio 2005 中这些代码的位置已经改变了。必须定位到 NorthwindDataSet.Designer.vb 代码模块来查看此代码。以前版本的 Visual Studio .NET 直接将此代码放置在“Windows Forms Designer Generated”代码部分中,您现在必须选择“Solution Explorer”窗口中的“View All Files”,然后展开 NorthwindDataset.xsd 视图以查看代码模块。
如果用 Visual Studio 2005 查看此应用程序,那么您肯定想知道此代码来自何处,因为 Visual Studio 2005 很好地隐藏了它。在 Visual Studio 2005 中,Microsoft 已经为设计器和开发人员创建了所谓的“沙箱”。
与 Visual Studio .NET 2003 一样,开发人员生成的代码存储在常规的 .vb 文件中。但设计器生成的代码存储在单独的 .vb 文件中。这种设计的原因非常简单。在 Visual Studio .NET 2003 中,设计器生成的代码和开发人员的代码包装在同一个 .vb 文件中,但前者是用 #Region 包装的。一些程序员必须(或选择)编辑由 Visual Studio .NET 2003 工具和向导创建的某些代码,尽管不推荐这么做。由于设计器生成了代码,而且设计器还有权利重新编写生成的代码,因此会重写开发人员所做的任何更改。
为了解决这个问题,Visual Studio 2005 还像以前一样将编写的代码放置在 .vb 文件中,但是与由设计器生成的代码(可以在 .Designer.vb 文件中找到)完全分离。项目中的每一项(例如一个窗体)可以同时包含一个 .Designer.vb 文件和一个常规 .vb 文件。默认情况下,不能在解决方案资源管理器中查看设计器文件。
可以通过启动解决方案资源管理器中的“Show All Files”功能来强制 Visual Studio 2005 显示它们。刚才列出的代码来自此应用程序的 NorthwindDataSet.Designer.vb 文件。同时,您还可能注意到,现在可以使用局部类,其方式与在 designer.vb 中定义 Form1 时使用 Partial 关键字的方式相同。
这里编写的几行代码加上众多设计器生成的代码可以创建一个功能齐全的数据库应用程序 — 包括更新数据并将其保存到数据库的功能。
小结
此应用程序说明,构建一个显示多个相关表中值的数据应用程序非常容易。在 Visual Studio 2005 中,可轻松创建并配置主-从样式的用户界面,这使得您只需编写少量的代码即可同时显示相关的记录。
此应用程序还介绍了新的数据智能标记,使用这些标记,可以快速完成常见任务,例如创建参数化查询。下一个应用程序将更多地讨论数据的智能标记;您将看到,为了减少必要的工作量和代码量,应该如何使用它们。
应用程序:对象数据源
此应用程序说明如何在 Visual Studio 2005 中将对象作为数据源使用。
新概念
Visual Studio 2005 中一个强大的新 ADO.NET 功能是以一种更自然的方式将一个对象作为数据源使用。这个对象可以是一个预先存在的对象,也可以是作为项目的一部分或一个单独的类库而创建的一个对象。虽然可以在 Visual Studio .NET 2003 中创建自己的对象,并将它们作为数据源来进行诸如数据绑定这样的操作,不过这非常麻烦,并且需要编写大量的代码。
在 .NET Framework 2.0 中,任何公开公共属性的对象都可以用作数据源。在此应用程序中,使用一个表示计算机的简单类。Computer类将包含 Model #、Serial #、CPU、RAM 数量以及硬盘空间的属性。用基于该对象的数据源来填充 TextBox控件,以在用户界面中显示各种属性。
为了说明一种进行数据绑定的可选方法,此应用程序创建一个 Computer对象数组,并使用 BindingContext导航该对象数组,其方法与在 DataSet 中导航记录的方法非常相似。
演练
此应用程序的用户界面是一个简单窗体,带有一些标签、用于 Computer类属性的 TextBox控件,以及用于一次查看一个 Computer对象的导航按钮。该窗体如图 4-25 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/db50b7e47a9dc0c063c5e9e595f1bc92.png)
图 4-25 对象数据源窗体。
Computer类在主 Windows 应用程序引用的单独类库中定义。Computer类是一个具有 5 个私有成员变量(m_Model、m_Serial、m_CPU、m_RAM 和 m_HDSpace)的简单类,这些变量通过公共属性(Model、Serial、CPU、RAM、HDSpace)公开。下面的代码定义 Computer类。
Public Class Computer Private m_Model As String Private m_Serial As Integer Private m_CPU As String Private m_RAM As String Private m_HDSpace As String Public Property Model() As String Get Return m_Model End Get Set(ByVal value As String) m_Model = value End Set End Property Public Property Serial() As Integer Get Return m_Serial End Get Set(ByVal value As Integer) m_Serial = value End Set End Property Public Property CPU() As String Get Return m_CPU End Get Set(ByVal value As String) m_CPU = value End Set End Property Public Property RAM() As String Get Return m_RAM End Get Set(ByVal value As String) m_RAM = value End Set End Property Public Property HDSpace() As String Get Return m_HDSpace End Get Set(ByVal value As String) m_HDSpace = value End Set End Property End Class
要创建一个基于对象的数据源,可以从在“Data Sources”窗口中添加一个新数据源开始,这非常类似于为数据库创建一个数据源。但在 Data Source Configuration Wizard 中,当选择数据源类型时,要选择“Object”而不是“Database”。(请参见图 4-26。)然后使用该向导选择要用作数据源的类。如果应用程序还没有包含对程序集(该程序集定义希望使用的类)的引用,可以直接从 Data Source Configuration Wizard 添加一个新的引用。(请参见图 4-27。)
![](https://i-blog.csdnimg.cn/blog_migrate/265834a9950b570e89d226396dcd1560.png)
图 4-26 在 Data Source Configuration Wizard 中选择“Object”类型数据源。
![](https://i-blog.csdnimg.cn/blog_migrate/5f6968b6b2cf70cdfa84afdc7c35d734.png)
图 4-27 在 Data Source Configuration Wizard 中选择绑定到的对象(类)。
绑定对象的复杂方法
下面的代码显示将用户界面绑定到这组 Computer对象的复杂方法:
Private Computers(5) As Computer.Computer Private myBindingManager As BindingManagerBase Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load CreateComputers() txtModel.DataBindings.Add(“Text", Computers, “Model”) txtSerial.DataBindings.Add(“Text", Computers, “Serial”) txtCPU.DataBindings.Add(“Text", Computers, “CPU”) txtHDSpace.DataBindings.Add(“Text", Computers, “HDSpace”) txtRAM.DataBindings.Add(“Text", Computers, “RAM”) myBindingManager = BindingContext.Item(Computers) End Sub Private Sub cmdPrevious_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles cmdPrevious.Click myBindingManager.Position -= 1 End Sub Private Sub cmdNext_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles cmdNext.Click myBindingManager.Position += 1 End Sub Private Sub CreateComputers() Computers(0) = New Computer.Computer Computers(0).CPU = “Pentium 2.4GHz" Computers(0).Model = “GK2400" Computers(0).Serial = 123456 Computers(0).HDSpace = “GB" Computers(0).RAM = “GB" Computers(1) = New Computer.Computer Computers(1).CPU = “Pentium 2.8GHz" Computers(1).Model = “GK2800" Computers(1).Serial = 65123 Computers(1).HDSpace = “GB" Computers(1).RAM = “MB" Computers(2) = New Computer.Computer Computers(2).CPU = “Pentium 2.0GHz" Computers(2).Model = “GK2000" Computers(2).Serial = 12216 Computers(2).HDSpace = “GB" Computers(2).RAM = “MB" Computers(3) = New Computer.Computer Computers(3).CPU = “Pentium 3.0GHz" Computers(3).Model = “GK3000" Computers(3).Serial = 123124 Computers(3).HDSpace = “GB" Computers(3).RAM = “GB" Computers(4) = New Computer.Computer Computers(4).CPU = “Pentium 2.5GHz" Computers(4).Model = “GK2500" Computers(4).Serial = 154156 Computers(4).HDSpace = “GB" Computers(4).RAM = “GB" End Sub
该窗体包含一个全局数组来存放五个计算机对象和一个 BindingManagerBase,它跟踪对象数组中的当前位置。
窗体的 Load 事件处理程序调用 CreateComputers过程来用五个计算机的数据填充数组。这为用户提供了使用“Next”和“Previous”按钮进行导航的值。然后使用每个 TextBox控件的 DataBinding集合将 TextBox控件绑定到Computer数组。
cmdNext_Click和 cmdPrevious_Click单击事件处理程序都使用 BindingManagerBase来更改绑定上下文的当前位置,从而使窗体显示不同的记录。
绑定对象的简单方法
既然了解了如何用复杂的方法绑定对象,现在就可以看看如何用简单的方法来完成相同的任务了。这样做将在窗体顶部添加目前非常熟悉的导航栏。唯一必须处理的编码任务是一行提供数据的代码。在本例中,必须设置 DataConnector的 DataSource属性,而不是填充 DataSet。
在本演练的前面部分,可以看到如何创建一个基于对象的数据源。Data Sources 窗口中的结果视图设置为 DataGridView,如图 4-28 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/03ef2050c683600bdb82184bfc30c8de.png)
图 4-28 显示 Object 数据源 Gridview 的 Data Sources 窗口。
和其他类型的数据源一样,可以简单地将一个对象从 Data Sources 窗口拖到窗体上。图 4-29 显示了一个 DataGridView,通过将 Computer对象数据源拖到此应用程序窗体上可以创建该 DataGridView。
![](https://i-blog.csdnimg.cn/blog_migrate/d5f8ad04ff82660b3b6898c8258b57eb.png)
图 4-29 用于显示对象数据的带有 DataGridView 的绑定窗体。
您可以看到,将网格拖到窗体上会提示 Visual Studio 2005 还要在窗体顶部创建一个导航栏。此时,组件栏包含 ComputerDataConnector和 ComputerDataNavigator对象,如图 4-30 所示。这两项类似于在前面的数据应用程序中使用的 DataConnector和 DataNavigator组件。您还将注意到,组件栏中没有表适配器和 DataSet对象。这是因为在将对象作为数据源处理时它们没有用途。
![](https://i-blog.csdnimg.cn/blog_migrate/5f3dee041b990615ac602cbbf04113db.png)
图 4-30 具有 Object 数据源组件的组件栏。
既然网格已在窗体上定位,而就绪的导航器允许进行导航,那么在窗体的Load 事件处理程序中就只需一行代码来将 Computer对象数组设置为 DataGridView 绑定到的 DataConnector 的 DataSource:
Me.ComputerDataConnector.DataSource = Computers
使用这行代码,网格绑定到 Computer数组。带有绑定 DataGridView 的最后一个应用程序如图 4-31 所示。
![](https://i-blog.csdnimg.cn/blog_migrate/ba964eed97af3d453d1236702bff349d.png)
图 4-31 使用 DataConnector 和 DataNavigator 组件绑定的 DataGridView。
小结
如此应用程序所示,通过绑定到对象,可以在使用业务对象而不是以数据库为中心的类(如 DataSet和 DataTable)表示数据的同时进行数据绑定,从而享受到便利。使用对象数据源确实使作为开发人员的您承担了一些额外的责任,因为您必须提供相应的逻辑以保存对内存中对象集合的更改。但是在许多情况下,能够使用自己的业务实体类而不是 DataTable 会大有好处,例如,在一个要求用户界面完全忽略给定系统基础数据存储的类型和结构的多层系统中。在这种情况下,表示层可以从中间层检索一组对象,并将这些对象直接绑定到用户界面。当然,对象数据源并不适合所有的应用程序,但在许多情况下,它们都是非常强大和有用的选项。而 Visual Studio 2005 使得将数据与对象绑定在一起变得非常简单。