Visual Basic 2005 中的智能客户端数据
Robert Green
Microsoft Corporation
适用于:
Microsoft Visual Basic 2005 Beta 1
摘要:该演练演示了 Visual Studio 2005 中的几种新增功能,以帮助读者开发可以访问数据的应用程序。

本页内容
![]() | 简介 |
![]() | 先决条件 |
![]() | 创建数据绑定 Windows 窗体 |
![]() | 绑定到现有控件 |
![]() | 创建一对多窗体 |
![]() | 将组合框绑定到查找表 |
![]() | 保存、插入和删除记录 |
![]() | 添加自定义导航控件 |
![]() | 向 TableAdapter 添加查询 |
![]() | 返回一个记录 |
![]() | 小结 |
简介
在以前版本的 Visual Studio 中,需要在服务器资源管理器中连接到数据源,然后将表或存储过程拖到窗体上。结果将得到 SQLConnection 和 SQLDataAdapter,并且用 SelectCommand、InsertCommand、DeleteCommand 和 UpdateCommand 预先配置。然后,需要执行几个比较费时间的步骤来完成数据绑定窗体,包括将 DataAdapter 配置为生成 DataSet、向窗体中添加控件以及随后添加数据绑定(无论是在代码中还是通过 Properties 窗口)。
Visual Studio 2005 引入了Data Sources Window,通过它不仅可以将绑定设置到基于服务器的数据,还可以设置到本地数据、Web 服务以及您自己的业务对象。将表拖动到窗体会产生数据绑定窗体,该窗体可以处理您在以前的版本中需要手动完成的大多数步骤,包括命名控件、为各个控件添加命名标签以及建立 DataBinding。
在该演练中,您将使用 Visual Basic 2005 探索这些新增的数据功能。
先决条件
要完成该演练,必须在开发计算机上安装下列软件和组件:
• | Microsoft Visual Studio 2005 Beta 1 |
• | Microsoft SQL Server 或 Microsoft SQL Server 桌面引擎 (MSDE)、(MSDE 7.0 或 MSDE 2000),并安装 Northwind 示例数据库。 |
创建数据绑定 Windows 窗体
在该任务中,您将创建一个简单的数据绑定窗体,而无须编写任何代码。该窗体将如下面的图 1 所示。

图 1. 示例 Orders 窗体
创建项目
1. | 启动 Visual Studio 2005。 |
2. | 在 File 菜单上,选择 New Project。 |
3. | 在 Templates 窗格中,选择 Windows Application。 |
4. | 将该项目命名为 DataWalkthrough。单击 OK。 |
添加数据源
1. | 在 Data 菜单上,选择 Show Data Sources。 |
2. | 在 Data Sources 窗口中,选择 Add New Data Source。 数据源代表您的应用程序可以使用的数据。可以使用 Data Source Configuration Wizard 创建一个或多个数据源以便在项目中使用。这些数据源可以是基于服务器的数据库(如 SQL Server 和 Oracle)、本地数据库文件(如 MSDE 或 Access)、Web 服务和业务对象。 |
3. | 单击 Next。这将显示 Choose a Data Source Type 页。 |
4. | 选择 Database。 |
5. | 单击 Next。这将显示 Choose Your Data Connection 页。 |
6. | 单击 New Connection。 |
7. | 输入相应的信息以连接到您的 SQL Server 或 MSDE 实例。 |
8. | 在 Select or enter a database name 下拉列表中,选择 Northwind。 |
9. | 单击 OK。 |
10. | 单击 Next。这将显示 Save connection string 窗格。 |
11. | 选中 Yes, save the connection as。 这会将连接字符串保存在新的强类型 Settings 中,后者补充了 App.config 文件。连接信息现在被保存在项目级别,而不是保存在使用数据的各个单独的窗体中。这使得维护以及更改连接信息变得容易得多。 |
12. | 如果您未使用 SQL Server 集成安全性,请选中 Include sensitive data。 |
13. | 单击 Next。这将显示 Choose Your Database Objects 页。 |
14. | 展开 Tables 节点以查看数据库中的表。 |
15. | 选择 Orders、OrderDetails、Customers 和 Employees 表。 您可以给该页上的数据集赋一个名称。注意,该名称默认为 NorthwindDataSet。 |
16. | 单击 Finish。 DataSources 窗口是用于查看和处理可供您的项目使用的数据的主窗口。Data Sources 窗口显示了 NorthwindDataSet 以及 Orders、OrderDetails、Customers 和 Employees 表。 |
17. | 在 Data Sources 窗口中,展开 Orders 节点以查看图 2 中所示的表中的每个列。 ![]() 图 2. Data Sources 窗口 |
使用 Dataset Designer
在上一个任务中,您创建了一个数据集。正如您很快将看到的那样,Data Sources 窗口使得创建数据绑定窗体变得很容易。但是在执行该任务之前,您可以使用 Dataset Designer 来处理该数据集中的对象。
1. | 在 Solution Explorer 中,双击 NorthwindDataSet.xsd。 Dataset Designer 显示了四个 DataComponents,分别对应于您在设置数据源时选择的各个表。数据组件是数据表和 TableAdapters 的组合,并且是组成强类型数据集的主要项。 TableAdapters 是由 Visual Studio 创建的设计器生成组件。它们类似于带有已配置的 Select、Insert、Update 和 Delete 命令的强类型数据适配器。TableAdapter 可以包含多个 Select 命令。TableAdapters 具有用于检索数据以及插入、更新和保存数据的强类型方法。这些方法可以包装 Parameters 集合。 |
2. | 选择 Orders 表中的 OrderID 列。 |
3. | 在 Properties 窗口中,确认 ReadOnly 属性被设置为 True。 |
4. | 将 Caption 属性更改为 OrderID。 在下一个任务中,您将把 Order 表字段从 Data Source 窗口拖放到窗体中。这会同时创建数据绑定控件和标签。Orders 表中每个字段的 Caption 将是与各个控件相关联的标签的默认 Caption。 注 您可以将 OrderID 更改为 Dataset Designer 表面中的 Order ID。然而,这会更改列的 Name 而不是 Caption。 |
5. | 突出显示 CustomerID 列。将 Caption 属性更改为 Customer。 |
6. | 突出显示 EmployeeID 列。将 Caption 属性更改为 Employee。 |
7. | 根据需要更改其他标题。 |
将数据拖放到窗体
在该任务中,您将把表从 Data Sources 窗口拖放到窗体上。这会自动创建数据绑定控件,从而节约大量时间和精力。
1. | 返回到窗体的设计视图。 |
2. | 在 Data Sources 窗口中,展开 Orders 节点以查看该表中的列。 |
3. | 选择 Orders 表中的 OrderID。在与该字段相关联的下拉列表中,将控件类型更改为 Label。 这样做可以更改在将字段拖放到窗体上时使用的控件。您可以使用任何建议的控件,也可以选择 Customize 并选择用户控件或第三方控件。 注 选择 Customize 时,将显示 ToolBox 中所有当前可见并且可实现一组新的 DataBinding 属性(DefaultBindingProperty、ComplexBindingProperties 或 LookupBindingProperties)的控件。 |
1. | 选择 Orders 表中的 CustomerID。在与该字段相关联的下拉列表中,将控件类型更改为 ComboBox。 | ||||||||
2. | 选择 Orders 表中的 EmployeeID。在与该字段相关联的下拉列表中,将控件类型更改为 ComboBox。 | ||||||||
3. | 选择 Orders 表。在与该表相关联的下拉列表中,选择 Details。 | ||||||||
4. | 将 Orders 表从 Data Sources 窗口拖放到窗体上。 下列对象现在显示在 Component Tray 中:
| ||||||||
5. | 选择 FreightTextBox 控件。 | ||||||||
6. | 展开 Properties 窗口中的 DataBinding 列表,如图 3 所示。 注意,FreightTextBox 控件被绑定到 OrdersDataConnector 中的 Freight 列。 ![]() 图 3. 查看控件数据绑定 | ||||||||
7. | 选择 Component Tray 中的 OrdersDataConnector。 注意,DataSource 属性被设置为 NorthwindDataSet,而 DataMember 属性被设置为 Orders。 | ||||||||
8. | 选择 OrderIDLabel1 控件。将其 BorderStyle 属性更改为 Fixed3D。 | ||||||||
9. | 从 Debug 菜单中,选择 Start(或者按 F5)。 窗体将出现,并显示如图 4 中所示的定单。 ![]() 图 4. 示例窗体中的主记录 | ||||||||
10. | 使用导航工具栏中的 Move next、Move previous、Move first 和 Move last 按钮在记录之间滚动。 | ||||||||
11. | 在导航工具栏中的 Current 位置文本框中,输入 1 和 830 之间的任意数字。按下 Enter 以移动到该记录。 | ||||||||
12. | 关闭窗体。 | ||||||||
13. | 在 Solution Explorer 中,单击 View Code 按钮。 注意 Form1_Load 过程中的以下代码: Me.OrdersTableAdapter.Fill(Me.NorthwindDataSet.Orders) 上述代码调用了 OrdersTableAdapter 的 Fill 方法。TableAdapter 的 Fill 方法与 SQLDataAdapter 的 Fill 方法的用途类似。它从数据源检索数据,并将这些数据放入指定的数据集中。 |
绑定到现有控件
在上一个任务中,您通过从 Data Sources 窗口中拖动 Orders 表创建了数据绑定控件。您通常会首先创建这些控件,然后希望对其进行数据绑定。在这一任务中,您将通过把字段从 Data Sources 窗口拖动到控件上来绑定到现有控件。
数据绑定现有控件
1. | 返回到窗体的设计视图。 |
2. | 将一个 Textbox 添加到窗体中 CustomerID 组合框的附近。将该文本框命名为 CustomerIDTextBox。 |
3. | 在 Data Sources 窗口中,展开 Orders 节点。 |
4. | 将 Orders 表中的 CustomerID 列拖动到 CustomerIDTextBox 控件上。 |
5. | 展开 Properties 窗口中的 DataBindings 列表。 注意,CustomerIDTextBox 控件被绑定到 OrdersDataConnector 中的 CustomerID 列。 注 CustomerID 字段的控件类型仍然被设置为 Data Sources 窗口中的 ComboBox。将 CustomerID 字段拖动到现有控件时,不会将该控件更改为组合框。 |
6. | 从 Debug 菜单中,选择 Start(或者按 F5)。 窗体将出现,并同时在组合框和您刚刚添加的文本框中显示 CustomerID。 |
7. | 关闭窗体。 |
创建一对多窗体
在这一任务中,您将向数据绑定窗体中添加一个相关表。您将使用弹出菜单指定主-从关系,而不必用代码定义此关系。
向窗体添加相关表
1. | 返回到窗体的设计视图。 | ||||
2. | 选择 Component Tray 中的 OrdersDataConnector。 | ||||
3. | 从 Data 菜单中,选择 Configure Master Details。这将显示 Add Related Databound UI 对话框。 | ||||
4. | 选择 Orders 作为父表。 | ||||
5. | 选择 Order Details 作为子表。 | ||||
6. | 选择 Grid 作为 UI style。 | ||||
7. | 单击 OK。 这会向窗体中添加一个 DataGridView。另外,下列对象将被添加到 ComponentTray:
| ||||
8. | 选择 Order_DetailsDataGridView 控件。 注意,DataGridView 的 DataSource 属性被设置为 FK_Order_Details_OrdersDataConnector。 | ||||
9. | 选择 Component Tray 中的 FK_Order_Details_OrdersDataConnector 。 注意,DataSource 属性被设置为 OrdersDataConnector,而 DataMember 属性被设置为 FK_Order_Details_Orders。 FK_Order_Details_OrdersDataConnector 内置了 Orders 表和 Order Details 表之间的关系。 |
配置 DataViewGrid
1. | 选择 Order_DetailsDataGridView 控件。 |
2. | 单击出现在网格右上角的箭头。这将显示 Actions 弹出菜单。 |
3. | 选择 Auto Format。 |
4. | 在 Auto Format 对话框中,选择 Professional 2。 |
5. | 单击 OK。 |
6. | 选择 Actions 弹出菜单中的 Edit Columns。 在 Edit Columns 对话框中,您可以添加或删除列、更改列在网格中的显示顺序、更改列标题文本,等等。 |
7. | 单击 OK。 |
8. | 从 Debug 菜单中,选择 Start(或者按 F5)。 窗体将出现,并显示如图 5 中所示的定单和相关的定单详细信息。 ![]() 图 5. 示例窗体中的主记录和详细信息记录 |
9. | 在各个记录之间滚动,并查看各个定单的详细信息记录是否显示在网格中。 |
10. | 关闭窗体。 |
11. | 切换到窗体的代码视图。 注意,以下代码已被添加到 Form1_Load 过程中: Me.Order_DetailsTableAdapter.Fill(Me.NorthwindDataSet.Order_Details) |
将组合框绑定到查找表
该窗体当前含有两个组合框。您希望它们显示客户的姓名和职员的姓名,而不是显示 CustomerID 和 EmployeeID。在这一任务中,您将把组合框绑定到适当的查找表,以显示所需的姓名。
将 CustomerID 组合框绑定到 Customers 表
1. | 返回到窗体的设计视图。 | ||||
2. | 选择 CustomerIDComboBox 控件。 | ||||
3. | 在 Properties 窗口中,展开与 DataSource 属性相关联的列表。 Orders 和 Order Details 表的 DataConnector 将出现在该列表中,因为它们已经被添加到 Component Tray。然而,您需要 Customers 表中的数据,因此您必须找到并选择 Customers 表。 | ||||
4. | 展开 Other Data Sources 节点。 | ||||
5. | 展开 Project Data Sources 节点。 | ||||
6. | 展开 NorthwindDataSet 节点。 | ||||
7. | 选择 Customers。 这会将 CustomerIDComboBox 控件的 DataSource 属性设置为 CustomersDataConnector,如图 6 所示。 ![]() 图 6. 设置组合框的 DataSource 注意,下列对象现在被添加到该窗体的 Component Tray:
| ||||
8. | 将 DisplayMember 属性设置为 CompanyName。 注意,显示的列来自 Customers 表。 | ||||
9. | 将 ValueMember 属性设置为 CustomerID。 | ||||
10. | 展开 Properties 窗口中的 DataBindings 列表。 | ||||
11. | 右键单击 Text 属性并选择 Reset。 | ||||
12. | 展开与 SelectedValue 属性相关联的列表。 | ||||
13. | 展开 OrdersDataConnector 节点。 | ||||
14. | 选择 CustomerID。 注意,显示的列来自 Orders 表。 |
向 Employee 表添加表达式
Employee 表包含对应于 LastName 和 FirstName 的字段。然而,您希望在组合框中同时显示姓氏和名字。在这一任务中,您将向 Employee 表中添加一个将姓氏和名字组合在一起的列。
1. | 切换到 Dataset Designer。 |
2. | 右键单击 Employees 表。 |
3. | 从 Add 菜单中,选择 Column。 |
4. | 在 Properties 窗口中,将 Name 属性设置为 EmployeeName。 |
5. | 将 Expression 属性设置为: LastName + ', ' + FirstName |
将 EmployeeID 组合框绑定到 Employees 表
1. | 返回到窗体的设计视图。 |
2. | 选择 EmployeeIDComboBox 控件。 |
3. | 在 Properties 窗口中,展开与 DataSource 属性相关联的列表。 Orders、Order Details 和 Customers 表的 DataConnector 显示在该列表中。然而,您需要 Employees 表中的数据,因此您必须找到并选择 Employees 表。 |
4. | 展开 Other Data Sources 节点。 |
5. | 展开 Project Data Sources 节点。 |
6. | 展开 NorthwindDataSet 节点。 |
7. | 选择 Employees。 |
这会将 EmployeeIDComboBox 控件的 DataSource 设置为 EmployeesDataConnector。
注意该窗体的 Component Tray 中的下列对象:
• | EmployeesTableAdapter |
• | EmployeesDataConnector |
1. | 将 DisplayMember 设置为 EmployeeName。 |
2. | 将 ValueMember 属性设置为 EmployeeID。 |
3. | 展开 Properties 窗口中的 DataBindings 列表。 |
4. | 右键单击 Text 属性并选择 Reset。 |
5. | 展开与 SelectedValue 属性相关联的列表。 |
6. | 展开 OrdersDataConnector 节点。 |
7. | 选择 EmployeeID。 |
8. | 从 Debug 菜单中,选择 Start(或者按 F5)。 |
9. | 使用您刚刚添加的按钮在各个记录之间滚动。 窗体将出现,并在各自的组合框中显示客户姓名和职员姓名。 |
10. | 关闭窗体。 |
保存、插入和删除记录
DataNavigator 工具栏包含一些内置的功能。您已经了解您可以在窗体中导航数据记录。您可能已经注意到,DataNavigator 工具栏上的 Add 和 Delete 按钮已经可用。选择 Add 按钮可向 Orders Datatable 中添加空行,而选择 Delete 按钮可从 Orders Datatable 中删除当前行。
Add 和 Delete 按钮不会对基础数据进行操作。它们只对 Dataset 中的 Orders 表进行操作。除非您将所做的更改保存到基础数据,否则将不会进行任何永久性的更改。当然,这对于使用 ADO.NET 处理数据而言并不是什么新概念。您将必须编写您自己的逻辑来进行保存。这就是默认情况下 DataNavigator 工具栏上的 Save 按钮被禁用的原因。除非您编写代码以保存数据,否则单击该按钮时不会做任何事情。
在这一任务中,您将添加代码以保存和删除窗体上的主记录和详细信息记录。用于保存和删除记录的代码需要考虑 Orders 和 Order Details 之间的主从关系。
您无须添加执行插入操作的代码,因为 DataNavigator 可以添加空行。然而,在这一任务中,您将编写一些代码以自动填充 Orders 记录的 Ship To 列。
保存记录
1. | 返回到窗体的代码视图。 |
2. | 要添加一个属性以存储错误消息,请添加以下代码: Dim dataErrorValue As String Private Property DataError() As String Get Return dataErrorValue End Get Set(ByVal value As String) dataErrorValue = value End Set End Property |
3. | 要创建一个用于保存记录的函数,请在 Form1_Load 方法后添加以下代码: Private Function SaveChanges() As Boolean Try OrdersDataConnector.EndEdit() FK_Order_Details_OrdersDataConnector.EndEdit() Catch ex As Exception Me.DataError = ex.Message Return False End Try Try OrdersTableAdapter.Update(Me.NorthwindDataSet.Orders) Order_DetailsTableAdapter.Update( _ Me.NorthwindDataSet.Order_Details) Catch ex As Exception Me.DataError = ex.Message Return False End Try Return True End Function 注意,Update 方法有多个重载。此处使用的重载接受特定的 DataTable。 |
4. | 返回到窗体的设计视图。 |
5. | 选择 OrdersDataNavigator 控件。 您会发现在 Component Tray 中选择控件极为方便。 |
6. | 选择 dataNavigatorSaveItem 控件。这是 DataNavigator 工具条中的 Save 按钮。 |
7. | 将 Enabled 属性设置为 True。 |
8. | 在 Properties 窗口中,单击 Events 按钮。这是 Properties 窗口中的闪电形按钮。 |
9. | 双击 Click 事件。 注 Properties 窗口中的 Events 列表是 Visual Basic 2005 中的新增功能。它使得为事件创建处理程序或者分配现有的处理程序变得非常容易。 |
10. | 将以下代码添加到 dataNavigatorSaveItem_Click 过程中: If SaveChanges() = True Then MessageBox.Show("Changes were saved", "Orders", _ MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show(Me.DataError, "Orders", _ MessageBoxButtons.OK, MessageBoxIcon.Information) End If |
11. | 从 Debug 菜单中,选择 Start(或者按 F5)。 |
12. | 为第一个定单的 Ship To Region 输入一个值。 |
13. | 单击 Save 按钮。 |
14. | 关闭窗体。 |
15. | 从 Debug 菜单中,选择 Start(或者按 F5)。 您将看到您输入的 Ship Region 值。 |
添加记录
在这一任务中,您将编写代码,以便在 Customer 组合框中的某个客户被选中时,自动填充 Orders 表中的 Ship To 字段。
1. | 返回到窗体的设计视图。 |
2. | 选择 CustomerIDComboBox 控件。 |
3. | 在 Properties 窗口中,单击 Events 按钮。 |
4. | 双击 SelectedIndexChanged 事件。 |
5. | 将以下代码添加到 CustomerIDComboBox_SelectedIndexChanged 过程中: If CustomerIDComboBox.SelectedIndex <> -1 Then Dim customerDataRow As NorthwindDataSet.CustomersRow customerDataRow = NorthwindDataSet.Customers( _ CustomerIDComboBox.SelectedIndex) With customerDataRow ShipNameTextBox.Text = .CompanyName ShipAddressTextBox.Text = .Address ShipCityTextBox.Text = .City If customerDataRow.IsRegionNull Then ShipRegionTextBox.Text = "" Else ShipRegionTextBox.Text = .Region.ToString End If If customerDataRow.IsPostalCodeNull Then ShipPostalCodeTextBox.Text = "" Else ShipPostalCodeTextBox.Text = .PostalCode End If ShipCountryTextBox.Text = .Country End With End If |
6. | 从 Debug 菜单中,选择 Start(或者按 F5)。 |
7. | 单击导航工具栏中的 Add new 按钮。 导航工具栏中显示的定单的总数将增加 1 个。 注 请注意,您仍然位于第一个定单的位置上,而不是位于您正在添加的定单的位置。这在 Beta 1 中是一个问题。要移动到您正在添加的定单的位置,请按导航工具栏中的 Move last 按钮。 |
8. | 从 Customer 下拉列表中选择一个客户。 注意,Ship To 控件被填充了有关选定客户的适当信息。 |
9. | 从 Employee 下拉列表中选择一个职员。 |
10. | 输入以下信息以完成该定单 OrderDate = today's date RequiredDate = any date after today ShippedDate = any date after today ShipVia = any number from 1 to 3 Freight = 50.00 |
11. | 单击 DataGridView。 注意,网格中的 OrderID 被设置为正确的数字。 |
12. | 输入一个介于 1 和 77 之间的 ProductID。 |
13. | 输入一个 Quantity 和一个 UnitPrice。 |
14. | 为 Discount 输入一个数字。 注 您必须为 Discount 输入相应的内容,因为该列不得为空。 |
15. | 根据需要添加其他定单详细信息记录。 |
16. | 单击 Save 按钮。 |
17. | 关闭窗体。 |
18. | 从 Debug 菜单中,选择 Start(或者按 F5)。 |
19. | 要确认定单已添加,请导航到最后一个 Orders 记录。 您将看到您输入的 Order 和 Order Details 记录。 |
删除记录
1. | 返回到窗体的代码视图。 |
2. | 要创建用于删除记录的函数,请添加以下代码: Private Function DeleteOrder() As Boolean Dim orderDataRowView As System.Data.DataRowView orderDataRowView = OrdersDataConnector.Current orderDataRowView.Row.Delete() Try Dim detailsDataRowView As System.Data.DataRowView For Each detailsDataRowView In _ FK_Order_Details_OrdersDataConnector.List detailsDataRowView.Row.Delete() Next Catch ex As Exception Me.DataError = ex.Message Return False End Try Try OrdersDataConnector.EndEdit() FK_Order_Details_OrdersDataConnector.EndEdit() Catch ex As Exception Me.DataError = ex.Message Return False End Try Try Order_DetailsTableAdapter.Update( _ Me.NorthwindDataSet.Order_Details) OrdersTableAdapter.Update(Me.NorthwindDataSet.Orders) Catch ex As Exception Me.DataError = ex.Message Return False End Try Return True End Function |
3. | 返回到窗体的设计视图。 |
4. | 选择 OrdersDataNavigator 控件。 |
5. | 选择 dataNavigatorDeleteItem 控件。这是 DataNavigator 工具条中的 Delete 按钮。 |
6. | 在 Properties 窗口中,单击 Events 按钮。 |
7. | 双击 Click 事件。 |
8. | 将以下代码添加到 dataNavigatorDeleteItem_Click 过程中: If DeleteOrder() = True Then MessageBox.Show("Order was deleted", "Orders", _ MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show(Me.DataError, "Orders", _ MessageBoxButtons.OK, MessageBoxIcon.Information) End If |
9. | 从 Debug 菜单中,选择 Start(或者按 F5)。 |
10. | 导航到最后一个 Orders 记录。 |
11. | 单击 Delete 按钮。 |
12. | 关闭窗体。 |
13. | 从 Debug 菜单中,选择 Start(或者按 F5)。 您将再一次看到有 830 个定单。 |
14. | 要确认定单已删除,请导航到最后一个 Orders 记录。 您将看不到您添加的定单。 |
15. | 关闭窗体。 |
添加自定义导航控件
DataNavigator 是一个方便的控件,但您并非必须使用它。您可以创建您自己的用于导航的控件。在这一任务中,您将向窗体中添加您自己的按钮,以便处理在各个记录之间进行的导航,以及处理保存、插入和删除记录的操作。
添加您自己的数据导航按钮
1. | 返回到窗体的设计视图。 |
2. | 选择 OrdersDataNavigator 控件。 |
3. | 将 Visible 属性设置为 False。 注 如果您愿意,还可以删除 OrdersDataNavigator。 |
4. | 向窗体中添加一个 MenuStrip 控件。 MenuStrip 控件是窗体上的菜单结构的容器。当您在 MenuStrip 中输入各个菜单命令时,您实际上是在向 MenuStrip 中添加 ToolStripMenuItem 对象。 |
5. | 单击第一个 Type Here 文本框中的菜单条。 |
6. | 输入 First 作为菜单条项目的文本。 |
7. | 按 Tab 键切换到下一个菜单条项目。 |
8. | 输入 Previous。 |
9. | 按 Tab 键切换到下一个菜单条项目。 |
10. | 输入 Next。 |
11. | 按 Tab 键切换到下一个菜单条项目。 |
12. | 输入 Last。 |
13. | 按 Tab 键切换到下一个菜单条项目。 |
14. | 输入 Add。 |
15. | 按 Tab 键切换到下一个菜单条项目。 |
16. | 输入 Delete。 |
17. | 按 Tab 键切换到下一个菜单条项目。 |
18. | 输入 Save。 |
19. | 根据需要调整 MenuStrip1 的大小以增加其大小。 |
20. | 单击出现在菜单条右边框上的箭头。这将显示 Actions 弹出菜单。 注 每个菜单条项目都具有一个箭头及其自己的 Actions 弹出菜单。这里,你需要整个菜单条的 Actions 弹出菜单,因此您必须单击该菜单条的箭头。作为备选方法,您可以使用 Properties 窗口中的菜单条 Items 属性。 |
21. | 选择 Edit Items。这将显示 Items Collections Editor。 |
22. | 在 Items 列表中,选择 ToolStripSeparator。 |
23. | 单击 Add。 |
24. | 单击 Up 箭头三次,以使分隔符位于 Last 和 Add 菜单条项目之间。 |
25. | 单击 OK。 |
添加数据导航代码
1. | 选择 FirstToolStripMenuItem 控件。这是菜单条中的 First 菜单命令。 |
2. | 在 Properties 窗口中,单击 Events 按钮。 |
3. | 双击 Click 事件。 |
4. | 将以下代码添加到 FirstToolStripMenuItem_Click 过程中: OrdersDataConnector.MoveFirst |
5. | 选择 PreviousToolStripMenuItem 控件。这是菜单条中的 Previous 菜单命令。 |
6. | 在 Properties 窗口中,单击 Events 按钮。 |
7. | 双击 Click 事件。 |
8. | 将以下代码添加到 PreviousToolStripMenuItem_Click 过程中: OrdersDataConnector.MovePrevious |
9. | 选择 NextToolStripMenuItem 控件。这是 menustrip 中的 Next 菜单命令。 |
10. | 在 Properties 窗口中,单击 Events 按钮。 |
11. | 双击 Click 事件。 |
12. | 将以下代码添加到 NextToolStripMenuItem_Click 过程中: OrdersDataConnector.MoveNext |
13. | 选择 LastToolStripMenuItem 控件。这是 menustrip 中的 Last 菜单命令。 |
14. | 在 Properties 窗口中,单击 Events 按钮。 |
15. | 双击 Click 事件。 |
16. | 将以下代码添加到 LastToolStripMenuItem_Click 过程中: OrdersDataConnector.MoveLast DataConnector 汇集了许多数据任务。这使得 DataConnector 成为一种在应用程序中处理数据的简单而直观的方法。 |
添加用于执行添加、删除和保存操作的代码
1. | 选择 AddToolStripMenuItem 控件。这是菜单条中的 Add 菜单命令。 |
2. | 在 Properties 窗口中,单击 Events 按钮。 |
3. | 双击 Click 事件。 |
4. | 将以下代码添加到 AddToolStripMenuItem_Click 过程中: OrdersDataConnector.AddNew() 默认情况下,DataNavigator 的 Add 按钮调用上述代码。 |
5. | 选择 DeleteToolStripMenuItem 控件。这是菜单条中的 Delete 菜单命令。 |
6. | 在 Properties 窗口中,单击 Events 按钮。 |
7. | 双击 Click 事件。 |
8. | 将以下代码添加到 DeleteToolStripMenuItem_Click 过程中: If DeleteOrder() = True Then MessageBox.Show("Order was deleted", "Orders", _ MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show(Me.DataError, "Orders", _ MessageBoxButtons.OK, MessageBoxIcon.Information) End If 上述代码与您在前面与 DataNavigator 的 Delete 按钮相关联的代码相同。 |
9. | 选择 SaveToolStripMenuItem 控件。这是菜单条中的 Save 菜单命令。 |
10. | 在 Properties 窗口中,单击 Events 按钮。 |
11. | 双击 Click 事件。 |
12. | 将以下代码添加到 SaveToolStripMenuItem_Click 过程中: If SaveChanges() = True Then MessageBox.Show("Changes were saved", "Orders", _ MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show(Me.DataError, "Orders", _ MessageBoxButtons.OK, MessageBoxIcon.Information) End If 上述代码与您在前面与 DataNavigator 的 Save 按钮相关联的代码相同。 |
13. | 从 Debug 菜单中,选择 Start(或者按 F5)。 |
14. | 使用您刚刚添加的按钮在各个记录之间滚动。 |
15. | 按照前面的做法添加一个新的定单。保存该定单。 |
16. | 删除该定单。 窗体所具有的行为应该与您使用 DataNavigator 工具栏时的行为相同。 |
17. | 关闭窗体。 |
向 TableAdapter 添加查询
当您将 Orders 和 Order Details 表拖动到窗体时,您创建了 TableAdapter。TableAdapter 具有用于检索数据以及执行插入、更新和删除操作的方法。这些方法基于 Insert、Update 和 Delete 语句或基于存储过程。
并未限制您只能使用通过拖放过程生成的方法。在这一任务中,您将向 Orders TableAdapter 添加一个查询,以返回个别定单而不是所有定单。
添加基于 OrderID 返回定单的查询
1. | 返回到 Dataset Designer。 |
2. | 选择 OrdersTableAdapter。 |
3. | 右键单击 OrdersTableAdapter 并从弹出菜单中选择 Add Query。 这将显示 Data Component Query Configuration Wizard。 |
4. | 单击 Next。 |
5. | 选择 Create new stored procedure。 注 如果您没有在数据库中创建存储过程的权限,则可以在该步骤中选择 Use SQL statements。 |
6. | 单击 Next。 |
7. | 选择 SELECT which returns rows。 |
8. | 单击 Next。 |
9. | 将以下代码添加到 Select 语句的末尾: WHERE OrderID = @orderID |
10. | 单击 Next。 注 如果您不创建新的存储过程,请跳至步骤 14。 |
11. | 将该存储过程命名为 OrdersByID。 |
12. | 选择 Yes, create it in the database for me 复选框。 |
13. | 单击 Next。 |
14. | 将第一个 Method Name 更改为 FillByOrderID。 |
15. | 将第二个 Method Name 更改为 GetDataByOrderID。 |
16. | 单击 Finish。 注意,您添加的方法出现在 OrdersTableAdapter 中,如图 7 所示。 ![]() 图 7. 向 TableAdapter 添加查询 |
返回一个记录
在这一任务中,您将更改数据输入窗体以使用您刚刚创建的查询。这将使用户可以返回一个定单而不是所有定单。
限制从服务器检索到的定单记录
1. | 返回到窗体的设计视图。 |
2. | 向该窗体添加一个 MaskedTextBox。将其命名为 OrderIDMaskedTextbox。 |
3. | 单击出现在屏蔽文本框右侧的箭头。这将显示 Actions 弹出菜单。 |
4. | 选择 Set the mask associated with the control。 |
5. | 在 Mask 文本框中输入 99999。这会将数据输入限制为数字。 |
6. | 单击 OK。 |
7. | 在您刚刚添加的屏蔽文本框的旁边添加一个 button。将其命名为 FindOrderButton。将该按钮的 Text 属性设置为 Find this order。 |
8. | 再向该屏蔽文本框的旁边添加一个 button。将其命名为 AllOrdersButton。将该按钮的 Text 属性设置为 All Orders。 |
9. | 将以下代码添加到 FindOrderButton_Click 过程中: Me.OrdersTableAdapter.FillByOrderID( _ Me.NorthwindDataSet.Orders, OrderIDMaskedTextBox.Text) OrderIDMaskedTextBox.Text = "" |
10. | 将以下代码添加到 AllOrdersButton_Click 过程中: Me.OrdersTableAdapter.Fill(Me.NorthwindDataSet.Orders) OrderIDMaskedTextBox.Text = "" |
11. | 从 Debug 菜单中,选择 Start(或者按 F5)。 |
12. | 在您添加的文本框中输入 10456。 |
13. | 单击 Find this Order。 注意,现在窗体中加载了一个定单记录。 |
14. | 单击 All Orders。 注意,又一次将所有定单记录加载到窗体中。 |
15. | 关闭窗体。 |
小结
Visual Studio 2005 包含几种新增功能,这些功能使得构建可以访问数据的应用程序变得更加容易。Data Sources 窗口和 Dataset Designer 提供了用于处理基础数据的结构的方便场所。从 Data Sources 中拖放列和表即可创建数据绑定控件,而无须在代码中或在 Properties 窗口中设置数据绑定。TableAdapter 和 DataConnector 组件致力于提供一种更为直观的在客户端操纵数据的方法。