运行 我们运行这个程序来看看是否国家可以正常的显示了。 1. 按下F5来运行程序。 2. 点击Countries下拉框来看看是否国家数据已经可以显示了。如果正常的话,你就可以看到如下图8所示的程序:
图8.使用ComboBox来显示小数据集可以提高性能 带参数的查询来显示数据 现在已经可以看到ComboBox中的国家数据了,接着我们就来做选择ComboBox中的一个国家,在DataGrid中只显示这个国家的客户资料。我们按照这些步骤来做: 1. 把form的load事件中读取DataGrid中数据的代码删掉。 2. 修改sqlDataAdapter1的SelectCommand属性的SQL查询语句,在查询语句中增加我们要使用的参数。 3. 增加代码来处理用户选择国家后的事件。 删掉form的load事件中的读取DataGrid数据的代码 因为DataGrid中的数据显示将由ComboBox中被选择的国家来定,我们就不再需要form的load事件中使用的代码。把form的load事件中的下列代码删掉: DsCustomers1.Clear() SqlDataAdapter1.Fill(DsCustomers1, "Customers") 修改SelectCommand属性 接着我们就来修改sqlDataAdapter1的SelectCommand属性,把要使用的参数加到这个查询中去。按照下面的步骤操作: 1. 在form的设计窗口,点击sqlDataAdapter1对象。 2. 按下F4来显示属性窗口。 3. 点击SelectCommand左边的+号来展开SelectCommand的子属性。 4. 点击CommandText属性,点击Build(…)来显示Query Builder对话框。 5. 在SQL查询语句中增加下面的where语句: SELECT CustomerID, CompanyName, ContactName, Country FROM Customers WHERE Country = @CountryParam 6. 点击OK 7. 点击sqlDataAdapter1对象 8. 点击Data,点击Generate DataSet,然后点击OK来重新生成已有的DataSet。
图9. 在SQL查询语句中增加查询参数 增加代码来处理用户选择国家之后的事件 当用户选择了国家之后,我们来添加要改变DataGrid中数据的代码。照下面的步骤作就可以实现这个功能: 1. 点击cboCountry的SelectedIndexChanged事件 2. 设置DataGrid的查询参数为cboCountry中被选择的值 3. 填充DataSet中的数据 按照以下步骤来增加代码: 1. 打开form为设计窗口 2. 双击cboCountry来显示SelectedIndexChanged事件的代码。这个事件发生在用户改变选择的cboCountry值的时候。 3. 在这个事件中手写下面的代码: Private Sub cboCountry_SelectedIndexChanged( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles cboCountry.SelectedIndexChanged ' Get the Parameter object and Set value With SqlDataAdapter1.SelectCommand.Parameters .Item("@CountryParam").Value = _ cboCountry.SelectedValue End With ' Clear the dataset DsCustomers1.Clear() ' Load the dataset using the parameter value SqlDataAdapter1.Fill(DsCustomers1, "Customers") End Sub 我们使用sqlDataAdapter1的SelectCommand属性来取得Parameter对象,然后把这个对象的Value属性设为cboCountry的SelectedValue属性。由于我们设置了cboCountry的ValueMember属性为Country字段,因此cboCountry的SelectedValue属性就为国家的值。设置好Value属性后,就可以把数据填充到DataSet中了,DataGrid就自动显示对应国家的客户资料。 运行 现在可以看看我们的程序究竟是怎么工作的了。 1. 按下F5来运行程序。 2. 在ComboBox中选择一个国家,就可以在DataGrid中看到对应国家的客户资料 3. 选择不同的国家,来显示不同国家的客户资料 D. 使用TextBox的数据绑定 前面的例子都是使用DataGrid来显示数据,在我们的程序中,使用TextBox来显示单独的行数据提供编辑同样是非常重要的。这篇文章没有将怎样编辑数据,我们只讲如何在TextBox中显示数据。下面是主要的步骤: 1. 生成一个类似于图10的Form 2. 生成、配置你要使用的DataSet 3. 添加控件到form中,并且把他们绑定到数据源上 4. 添加导航按钮,提供一行一行浏览数据的功能 按照上面的几个步骤做下来,我们创建一个读取Customers表的DataSet。在添加SqlDataAdapter的时候,我们选择已有的连接到Northwind数据库的连接,生成的SQL查询语句中从Customers表中的CustomerID, CompanyName, ContactName, 和ContactTitle列。接着就可以添加控件,并且绑定数据了。
图10. 我们使用的简单的例子窗口 添加控件到form并且绑定数据 添加控件到form中,并且设置他们的属性为表1指定的值: 表1.用于form的控件(如图10所示) Control Type Property Value Label Name Label1 Text CustomerID TextBox Name txtCustomerID Text Blank Label Name Label2 Text Company Name TextBox Name txtCompanyName Text Blank Label Name Label3 Text Contact Name TextBox Name txtContactName Text Blank Label Name Label4 Text Contact Title TextBox Name txtContactTitle Text Blank CommandButton Name btnPrevious Text < CommandButton Name btnNext Text > 接着就把每一个TextBox绑定到DataSet的一列上,我们按照下面的步骤作: 1. 选择要绑定数据的TextBox 2. 按下F4来显示属性窗口 3. 点击展开DataBindings属性 4. 在DataBindings属性下,选择Text属性 5. 打开下拉列表把数据绑定到对应的列上。 比如:要绑定txtCustomerID到CustomerID列上,点击dsCustomers1的+号,然后选择CustomerID。 在所有的TextBox都绑定好之后,就像是在DataGrid中显示数据那样,我们同样要在form的load事件中手写代码来导出数据。下面就是我们添加的代码: Public Sub New() MyBase.New() ' This call is required by the ' Windows Form Designer. InitializeComponent() ' Add any initialization ' after the InitializeComponent() call DsCustomers1.Clear() SqlDataAdapter1.Fill(DsCustomers1, "Customers") End Sub 添加按钮来实现一行一行的导航 最后一步就是添加按钮和代码来允许用户实现一行一行的导航。向前导航的按钮代码如下所示: Private Sub btnPrevious_Click _ (ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles btnPrevious.Click Me.BindingContext(DsCustomers1, _ "Customers").Position -= 1 End Sub 程序中使用BindingContext来减少数据集的记录指针。BindingContext跟踪form上每一个数据源的当前项。向后导航的按钮代码如下: Private Sub btnNext_Click _ (ByVal sender As Object, ByVal e As _ System.EventArgs) Handles btnNext.Click Me.BindingContext(DsCustomers1, _ "Customers").Position += 1 End Sub 程序中使用BindingContext来增加数据集的记录指针。我们的例子结果就如图10所示的那样。 注意:和DataGrid控件例子一样,在实际的应用中,我们同样要减少显示在form上的数据。比如,我们应该在form中添加一个ComboBox,并且允许用户选择指定国家的客户资料。导航按钮的作用就只是在这个国家的客户资料中实现。 Visual Basic 6.0中的不同点 Data binding with Windows Forms is far more robust than data binding in Visual Basic 6.0. With Visual Basic 6.0, you had little control over how the data was bound or what was going on underneath the covers. Using Visual Basic 6.0, when you used bound forms you added a data control and data entry controls to a form. You were basically stuck with the functionality that the data control provided. It was very difficult to troubleshoot or modify the behavior of the data control, because Microsoft did not reveal the source code behind the control to you. Using data binding with Windows Forms and ADO.NET, you have much better control how the data is bound and how the form behaves. Data binding utilizes the ADO.NET classes and generates class code that you can view and modify. This means that when things don't work, or don't work the way that you intended them to, you are not left with your hands up in the air as you were with Visual Basic 6.0. Data binding with all its limitations in Visual Basic 6.0 was not the optimal choice for production applications; data binding with Windows Forms and ADO.NET is a viable option for the .NET developer. /* .NET中的数据绑定比Visual Basic 6.0中的数据绑定健壮多了。在Visual Basic 6.0中,我们能够使用的数据绑定的控件很少,后台的程序同样也支持不够。在Visual Basic 6.0中, */ E. 总结 数据绑定让我们在编写程序的时候节省相当多的时间。使用数据绑定就不再需要写像在Visual Basic 6.0要的所有的绑定数据的代码了。在这篇文章里,我们介绍了如何使用连接SQL Server数据库的特定的对象,连接其他的数据库同样有相应的对象。一般的,这些都不需要手写太多的代码。 在这篇文章中,我们学到了: 1. 数据绑定的基本知识 2. 如何生成数据绑定的form 3. 如何和TextBox、ComboBox、DataGrid协作 4. 如何限制显示在DataGrid中的数据 5. 如何创建数据导航的form 6. 如何实现数据导航
|