网站首页/技术开发列表/内容

Windows Forms中的数据绑定(一)

技术开发2022-06-27阅读
Windows Forms中的数据绑定

作者:刘志波

摘要:这篇文章是讲解在Windows Forms中如何使用ADO.NET简单的将Form和包含任何结构的数据绑定在一起。通过简单或者复杂的数据绑定,把Form的control的属性绑定到指定的数据上。
目标:
 学习Microsoft.NET平台中数据绑定的基础知识
 学习怎样生成一个简单的数据绑定form
 学习如何往你生成的数据绑定form中添加ComboBox和ListBox
 Learn how to base data-bound forms on the results of parameterized queries.
 学习如何绑定TextBox的数据
前提:
阅读这篇文章应当了解一下内容:
 理解关系数据库以及知道如何访问它
 了解结构化查询语言SQL
 能够访问某一个数据库服务,比如SQL Server或者是Access
内容:
数据绑定和Windows Form的基础知识
生成简单的数据绑定Windows Form
使用ComboBox和ListBox
使用TextBox的数据绑定
总结
A. 数据绑定和Windows Form的基础知识
一般来讲,数据绑定是指在运行时期自动设置一个或者多个控件的属性从结构化的数据源自动获得数据的过程。Windows Forms使用ADO.NET来实现数据绑定。使用数据绑定,就不再需要写代码来实现连接(Connection)和生成数据集了(DataSet),当然了在一个没有绑定数据的form中,这些工作还是要自己手写的。Microsoft.NET的wizard会为你生成必要的ADO.NET代码,而不需要自己手写。
Windows Form可以让你轻松的绑定几乎是包含数据的任何结构。这就意味着你可以帮定任何传统的数据存储,比如是存储在Access或者SQL Server表中的数据,或者是从文件中读取的数据,其他控件包含的数据,数组中的数据。数据是怎样包含在结构中的对我们这篇文章来说并不重要。
在你把一个form绑定到数据上后,你就可以把form上的控件和指定的数据元素绑定起来。一般常用的数据绑定包括把TextBox的Text属性和数据源的某列绑定起来。你同样可以帮定控件的图形属性、背景图属性,或者是form上的任何控件的任何属性。
Windows Form包括两种形式的数据绑定:简单型和复杂型。他们有各自的优点。
简单绑定允许你把一个控件绑定到单独的数据元素上,这种绑定常用在把一个表中某列的值帮定到一个form的控件上。使用这种方式,一般是用在仅仅显示单个值的控件上。简单绑定一般是绑定TextBox或者Label的数据。
复杂绑定允许你绑定多个数据元素,常用在把一个表中的多个列或者是多行帮定到控件上。支持复杂绑定的控件有:DataGrid、ComboBox、ListBox。
B. 生成简单的数据绑定Windows Form
.NET开发环境中使用的最基本的数据绑定用途是在一个DataGrid中显示一个表的内容。下面的这个例子说明了几个基本的步骤:(不包括细节)
1. 生成一个Windows Form
2. 在form中生成、配置一个DataSet
3. 在form中创建一个DataGrid,并且把他绑定到数据上
使用这个步骤形成的一个例子如图1所示

图1. 生成简单的数据绑定Form的结果
生成示例Form
下面是创建示例Form的详细步骤:
1. 点击File,点击New,然后点击Project。接着会显示New Project对话框。
2. 在对话框左边的树行图中选择Project Type。就这个例子而言,选择Visual Basic Projects。
3. 在对话框右边的模板列表中选择Windows Application。
4. 填写一个名称,并且选择你要保存的路径。接着点击OK来生成这个Project。
5. 按下F4来显示这个form的属性视图。将form的Name属性改为frmCustomers。
6. 将form的Text属性改为Customer Information。
生成并且配置数据集(DataSet)
一旦你创建好project和form后,就可以创建和配置隐藏在form下的DataSet。一个DataSet是存储在内存中的包含表、关系、约束的缓存。DataSet中的每一个Table都包含有Row和Column的一个集合。由于DataSet中记录了数据的原始状态和当前状态,就可以跟踪在数据上所做的任何操作。DataSet中的数据是可以被更新的。
数据绑定前要创建包含有SQL语句的DataAdaper。按照下面的步骤生成Connection和DataAdaper。
1. 在ToolBox的Data标签上,选择SqlDataAdaper,把他拖放到form中。接着会显示Data Adapter Configuration Wizard。然后点击Next。
2. 点击New Connection来生成一个新的数据连接。接着会显示如下图2所示的Data Link Properties对话窗。

图2. 使用Data Link Properties对话框指定连接信息
3. 将Server Name改为你要连接的数据库的名字。在我们这个例子中,是(local)。
4. 将User Name、Password改为连接数据库必要的验证信息。
5. 选择Northwind数据库作为示例使用的数据库。
6. 点击OK返回到Wizard,然后点击Next。
7. Wizard允许你指定Query Type,如下图3所示。选择Use SQL Statements,然后点击Next。

图3. 指定查询类型
8. 输入SQL查询语句或者是点击Query Builder来生成你所需要的查询语句。在我们这个示例中,输入如下的查询语句:
9. select CustomerID, CompanyName, ContactName, ContactTitle, Country from Customers
10. 点击Next,然后点击Finish来完成这个过程。注意,向导已经为你生成了sqlConnection1和sqlDataAdatper1两个对象。
sqlConnection1对象包括了怎样连接数据库的信息。sqlDataAdaper1对象包括了从数据库中返回表和列的查询信息。
注意:由于我们的示例使用的是SQL Server数据库,因此使用了SqlDataAdapter,他仅仅用在访问SQL Server数据库上。如果你使用OLEDB连接其他类型的数据库,你应该使用OleDbDataAdapter。
生成数据集对象(DataSet)
接着就是生成一个数据集对象(DataSet),这个DataSet使用的是刚才生成的DataAdapter的查询语句。按照下面的步骤来生成一个DataSet:
1. 点击Data,然后点击Generate DataSet。接着会显示如下图4所示的Generate DataSet对话框。

图4. Generate Dataset对话框指定对象名和其他的属性
2. 输入dsCustomers作为要生成的DataSet对象的名字。注意保证你选择了Add this dataset to the designer选项。点击OK。就这样生成了所需要的DataSet。
这一步完成之后,你就可以在form的非可视控件区看到一个新的控件dsCustomers1。这个控件是文件dsCustomers.xsd的一个引用,我们可以在Solution Explorer窗口中看到这个文件。在这个XSD文件有一个不显示的类文件,我们可以通过点击Project菜单中的Show All Files来显示这个文件。接着就可以点击dsCustomers.xsd文件左边的+号后看到这个类文件dsCustomers.vb,如下图5所示。

图5.XML schema definition (XSD)文件有一个类文件来把DataSet调入内存
dsCustomers.vb有对应到实际DataSet的属性和对应到查询语句中指定的每一列的属性。虽然,我们并不需要对这个类文件做什么操作,不过了解它的存在是非常有用的。
添加一个DataGrid控件来显示数据
现在可以生成一个form来显示包含在DataSet中的数据了。在这个例子里,添加一个单独的DataGrid控件到form中。这个DataGrid用来显示包含在DataSet中的数据。按照下面的步骤开始:
1. 在窗口的顶端,点击标签来显示frmCustomers form。
2. 点击ToolBox标签的Windows Forms,把一个DataGrid控件拖到form中来。调整DataGrid的Size属性到一个适当的大小。
3. 按下F4来显示这个DataGrid的属性窗口。
4. 选择DataSource属性的值为dsCustomers1
5. 选择DataMember属性的值为Customers
这些步骤就完成了把一个DataGrid绑定到一个DataSet上。为了看到显示的数据,还需要下面的一步工作。
把数据填到DataGrid控件上
虽然DataGrid控件已经绑定到了DataSet上,不过当form调入的时候,DataSet并不自动的把数据导出导DataGrid上。我们使用form的load事件在from调入的时候来填充DataGrid的数据。
Private Sub frmCustomers_Load( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
' Load the Data Grid Control
DsCustomers1.Clear()
SqlDataAdapter1.Fill(DsCustomers1, "Customers")
End Sub
在load事件中,首先清除dsCustomers1中的数据(Clear),然后用sqlDataAdapter1的Fill方法来填充dsCustomers1中的数据。在这里,要填写第二个参数为表名,这个表名用于我们先前指定的DataGrid的DataMember属性。
运行
现在就可以在DataGrid中看到显示的Customers表中的数据了。在运行之前我们还要做一个工作。由于我们更改了form的Name属性,因此要告诉Project从哪个form开始运行。
1. 在Solution Explorer窗口中,点击项目名称。
2. 右击然后在快捷菜单中选择Properties
3. 点击Startup Object,然后从列表中选择frmCustomers。
4. 点击OK
5. 按下F5来运行程序。如果你所作的都正确的话,就可以看到如图1显示的DataGrid中的Customer表中的数据。
C. 使用ComboBox和ListBox
刚才的例子适合于小数据集,如果用在一个客户表有成千上万的资料的时候就不太合适了。问题就在于它把所有的客户资料都读取出来并且显示在DataGrid上。作为例子可以采用,如果作为一个产品程序的话就不再合适了。
数据库服务器对于读取大量数据进行了优化,不过我们应当只读取小数据集。如果我们在前面的例子中加上一个ComboBox来选择国家并且只显示这个国家的客户的话,将会变得更加的有效。在这一节里,我们就这么做。下一节讲怎样使用ComboBox来限制显示在DataGrid中的数据。我们按照下面的步骤来做:
1. 向form中添加第二个DataAdapter
2. 生成第二个DataSet
3. 向form中添加一个ComboBox
4. 把ComboBox绑定到刚才生成的DataSet上
5. 从DataAdapter中获得要显示在ComboBox中的数据
向form添加第二个DataAdapter
在使用ComboBox之前,先增加一个DataAdapter。并且使用这个DataAdapter来生成包含有不重复的国家列表的DataSet数据。添加DataAdapter按照下面步骤作:
1. 在Toolbox的Data标签,选择SqlDataAdapter,拖放到form中。接着就会显示DataAdapter Configuration Wizard对话框。点击Next。
2. 选择连接到Northwind数据库的连接。点击Next
3. 选择Use SQL Statements,点击Next
4. 输入下面的SQL语句:
select distinct Country from Customers
5. 点击对话框上的Advanced Options按钮
6. 清除如下图6所示的Generate Insert, Update, and Delete Statements选项。在我们使用ComboBox显示国家的时候,这些语句用不上。点击OK来关闭这个对话框。

图6.不要选择Generate Insert, Update and Delete Statement选项
7. 点击Finish来生成DataAdapter
现在在form中就有一个名字为sqlDataAdapter2的对象了。
生成第二个DataSet
接着就来生成用于这个新DataAdapter的DataSet类和XSD文件。按照这些步骤作:
1. 点击Data,然后电击Generate DataSet。接着就显示Generate DataSet对话框。
2. 保证选择了列表框中的Customers(sqlDataAdapter2)
3. 点击New,然后输入名字dsCountries。保证选择了Add this DataSet to the Designer选项。点击OK。就生成了DataSet。
就这样,添加了一个新的对象dsCountries和一个新的XSD文件dsCountries.xds。这两项生成了DataSet类和接着就会用在ComboBox的数据绑定中。
添加ComboBox
现在可以添加ComboBox了,调整一下form的大小和DataGrid的大小来显示这个ComboBox。接着,就可以从Toolbox中拖放一个ComboBox到form中,把他放在DataGrid的上面,就像下面的图7那样:

图7. 包含有ComboBox和DataGrid的Form
把ComboBox绑定到DataAdapter上
刚才添加的ComboBox还没有绑定到任何数据上。按照如下步骤把他绑定到dsCountries上:
1. 选择这个ComboBox
2. 把Name属性改为cboCountry
3. 设置DataSource属性为dsCountries1。这样就指定了他的数据源。
4. 把DropDownStyle属性改为DropDownList。
5. 设置DisplayMember属性为Customers.Country。点击DisplayMember属性的下拉列表,然后展开Customers来显示可以使用的列。这个步骤就指定了要显示的列。
6. 设置ValueMember属性为Customers.Country。ValueMember属性用在当选择项时,实际使用的值。
导出数据到ComboBox
和使用DataGrid一样,我们要手写一些代码来导出数据到ComboBox。在form的load事件中我们在原有的代码后再添加如下的代码:
Private Sub frmCustomers_Load( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
' Load the data grid control
DsCustomers1.Clear()
SqlDataAdapter1.Fill(DsCustomers1, "Customers")
' Load the Combo Box
DsCountries1.Clear()
SqlDataAdapter2.Fill(DsCountries1, "Customers")
End Sub
用黑体显示的代码就是我们要添加的代码。看上去,它和显示DataGrid数据的代码几乎是一样的。

……

相关阅读