分享(C#高级编程第6版doc):第32章数据绑定.pdf
《分享(C#高级编程第6版doc):第32章数据绑定.pdf》由会员分享,可在线阅读,更多相关《分享(C#高级编程第6版doc):第32章数据绑定.pdf(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 32 章数据 绑 定第 26 章介绍了选择和修改数据的各种方式,本章接着第25 章的内容,继续介绍如何把绑定到各种 Windows 控件上的数据显示给用户。本章主要内容如下:使用 DataGridView 控件显示数据 .NET 数据绑定功能及其工作方式如何使用Server Explorer 创建连接,生成DataSet 类(不需要编写代码)如何对 DataGrid 中的数据行进行测试和反射本章的示例代码可以从Wrox 网站 上下载。32.1 DataGridView控件.NET 的最初版本中的DataGrid 控件有强大的功能,但在许多方面,它都不适用于商业应用程序,例如不能显示图像、下
2、拉控件或锁定列等。该控件给人感觉只完成了一半,所以许多控件经销商都提供了定制的栅格控件,以克服这些缺陷,并提供更多的功能。在.NET 2.0 中有了另一个栅格控件DataGridView。它解决了DataGrid 控件最初的许多问题,还增加了许多只能在插件产品中使用的功能。新控件具有与DataGrid 类似的绑定功能,可以绑定到Array、DataTable、DataView 或 DataSet 类,或者绑定到实现IListSource 或 IList 接口的组件上。DataGridView 控件可以显示数据的许多视图。在最简单的情况下,设置DataSource和 DataMember 属性,
3、就可以显示数据(与 DataSet 类一样)。注意,这个新控件不是DataGrid 的插件替代品,所以其编程接口完全不同于DataGrid。这个控件还提供了更复杂的功能,本章将讨论这些功能。32.1.1 显示列表数据第 19 章介绍了选择数据和把数据放在一个数据表中的各种方式,但仅使用了Console.WriteLine()方法以非常基本的形式显示数据。下面的示例将说明如何获取一些数据,并在DataGridView 控件中显示,为此,建立一个新的应用程序 DisplayTabularData,如图 32-1 所示。(点击查看大图)图32-1 这个简单的应用程序从Northwind 数据库的cu
4、stomer 表中选择每个记录,在DataGridView 控件中把它们显示给用户。其代码如下所示(不包含窗体和控件定义代码):using System;using System.Configuration;using System.Data;using System.Data.Common;using System.Data.SqlClient;using System.Windows.Forms;namespace DisplayTabularData partial class Form1:Form public Form1()InitializeComponent();private
5、void getData_Click(object sender,EventArgs e)string customers=SELECT*FROM Customers;using(SqlConnection con=new SqlConnection(ConfigurationSettings.ConnectionStringsnorthwind.ConnectionString)DataSet ds=new DataSet();SqlDataAdapter da=new SqlDataAdapter(customers,con);da.Fill(ds,Customers);dataGridV
6、iew.AutoGenerateColumns=true;dataGridView.DataSource=ds;dataGridView.DataMember=Customers;窗体包含getData 按钮,单击它会调用示例代码中的getData_Click 方法。这段代码使用ConfigurationManager 类的属性ConnectionStrings 构建了 SqlConnection 对象。之后构建一个DataSet,使用 DataAdapter 对象填充数据库表中的数据。然后设置 DataSource 和 DataMember属性,在 DataGridView 控件中显示数据。
7、注意AutoGenerateColumns 属性也设置为true,以确保给用户显示一些数据。如果这个标记没有指定,就需要自己创建所有的列。32.1.2 数据源DataGridView 控件是一种显示数据的非常灵活的方式。除了把DataSource设置为 DataSet,DataMember 设置为要显示的表名之外,DataSource 属性还可以设置为下述任何一个数据源:数组(网格可以绑定到任何一个一维数组上)DataTable DataView DataSet或 DataViewManager 实现 IListSource 接口的组件实现 IList 接口的组件泛型集合类或派生于泛型集合类的
8、对象下面几节将给出这些数据源的示例。1.显示数组中的数据这初看起来非常简单,创建一个数组,填充一些数据,再在 DataGridView 控件上设置DataSource属性。下面是一些示例代码:string stuff=new string One,Two,Three;dataGridView.DataBinding=stuff;如果数据源包含多个表(例如使用DataSet 或 DataViewManager),就需要设置DataMember 属性。可以用这个数组代码替换上面示例中的getData_Click 事件处理程序,这段代码的结果如图32-2所示。可以看出,网格显示出了数组中定义的字符串
9、的长度,而不是这些字符串。原因是在把数组用作DataGridView 控件的数据源时,网格会查找数组中对象的第一个公共属性,并显示这个值,而不会显示字符串值。字符串的第一个(也是唯一的)公共属性是其长度,所以就显示这个长度值。使用TypeDescriptor 类的 GetProperties 方法可以获得任意类的属性列表,该方法返回的是一个PropertyDescriptor 对象集合,接着,就可以在显示数据时使用它。.NET 的 PropertyGrid 控件在显示任意对象时,就使用这个方法。在 DataGridView 中显示字符串的一种解决方法是创建一个包装器类,如下所示:protect
10、ed class Item public Item(string text)_text=text;public string Text getreturn _text;private string _text;在数据源数组代码中添加这个Item 类(从进行的各种处理来讲,它也可以是一个结构)的数组后,结果如图32-3 所示。(点击查看大图)图32-2(点击查看大图)图32-3 2.DataTable有两种方式在DataGridView 控件中显示DataTable:如果 DataTable 是独立的,就把控件的DataSource属性设置为这个表。如果在 DataSet 中包含 DataTab
11、le,就把控件的DataSource 属性设置为DataSet,DataMember属性设置为DataSet 中的 DataTable 名。图 32-4 所示为运行DataSourceDataTable 示例代码的结果。(点击查看大图)图32-4 注意,最后一列显示了一个复选框,而不是更常见的编辑控件。DataGridView 控件没有显示其他信息,而是从数据源中读取模式(在本例中是Products 表),根据列的类型推断应显示什么控件。与以前的 DataGrid 控件不同,DataGridView 控件还可以显示图像列、按钮和组合框。在修改了DataGrid 中的字段时,数据库中的数据不会改
12、变,因为此时数据仅存储在本地计算机上-没有与数据库的活动连接。后面将讨论更新数据源中的数据。3.显示 DataView 中的数据DataView 提供了一种过滤和排序DataTable 中数据的一种方式。在从数据库中选择数据时,用户一般可以单击列标题,对数据排序。此外,还可以只过滤要显示在某些行中的数据,例如用户修改过的所有数据。DataView 允许过滤要显示给用户的数据行,但不允许过滤DataTable 中的数据列。提示:DataView 不允许过滤要显示的数据列,只允许过滤要显示的数据行。根据现有的DataTable 创建 DataView 的代码如下所示:DataView dv=new
13、 DataView(dataTable);创建好后,就可以改变DataView 上的设置,当该视图显示在DataGrid 中时,这些设置会影响要显示的数据,以及对这些数据进行的操作。例如:设置 AllowEdit=false表示在数据行上禁用所有列的编辑功能。设置 AllowNew=false 表示禁用新行功能。设置 AllowDelete=false表示禁用删除行的功能。设置 RowStateFilter 只显示指定状态的行。设置 RowFilter 可过滤数据行。下一节将介绍如何使用RowStateFilter 设置,其他选项都很容易理解。(1)通过数据过滤数据行创建好 DataView
14、后,就可以通过设置RowFilter 属性,来改变视图显示的数据。这个属性是一个字符串,可用作按照给定条件过滤数据的一种方式-该字符串的值就是过滤条件。其语法类似于一般SQL 中的 WHERE 子句,但主要是对已经从数据库中选择出来的数据进行操作。过滤子句的一些示例如表32-1 所示。表32-1 子句说明UnitsInStock 50 只显示 UnitsInStock 列大于 50 的行Client=Smith 只返回给定客户的记录County LIKE C*返回 County字段以 C开头的所有记录 例如返回 Cornwall、Cumbria、Cheshire和 Cambridgeshire
15、所在的行。可以使用表示匹配一个字符的通配符,而*表示匹配0个或多个字符的通配符运行库尽可能在过滤表达式中使用与源列相匹配的数据类型。例如,在前面的示例中,使用UnitsInStock 50 表达式就是合法的,尽管该列是一个整数列。但如果提供了一个无效的过滤字符串,就会产生EvaluateException 异常。(2)根据状态过滤数据行DataView 中的每一行都有一个定义好的行状态,它们的值如表32-2 所示,这些状态也可以用于过滤用户查看的行。表32-2 DataViewRowState 说明Added 列出新创建的所有行CurrentRows 列出除了被删除的行以外的其他行Delete
16、d 列出最初被选中,且已经删除的行 不显示已经删除的新建行ModifiedCurrent 列出所有已被修改的行,并显示这些行的当前值ModifiedOriginal 列出所有已被修改的行,但显示这些行的初值,而不是当前值OriginalRows 列出最初从数据源中选中的所有行,不包括新行。显示列的初值(即如果进行了修改,不显示当前值)Unchanged 列出没有修改的行图 32-5 显示了两个网格,一个网格显示已添加、删除或修改的数据行,另一个网格显示状态为表 32-2 中一种的行。图32-5 过滤器不仅可以用于可见的行,还可以用于这些行中列的状态。在进行Modified-Original 或
17、ModifiedCurrent 选择时,这是很明显的。这两个状态都在第20 章介绍过了,它们都是基于DataRowVersion 枚举的。例如,如果用户更新了数据行中的一列,该行就会在选择ModifiedOriginal或 ModifiedCurrent时显示出来,但其实际值可以是从数据库中选择出来的初值(如果选择了ModifiedOriginal),或者 DataColumn 中的当前值(如果选择了ModifiedCurrent)。(3)对数据行进行排序除了过滤数据外,有时还需要对DataView 中的数据进行排序。可以在DataGridView 控件中单击列标题,这会按照升序或降序的顺序对
18、该列进行排序,如图32-6 所示。唯一的问题是控件只能对一列进行排序,而底层的DataView 控件可以对多个列进行排序。在对数据列进行排序时,可以单击列的标题(例如上面的ProductName 列),也可以通过代码排序,DataGrid 会显示一个箭头位图,表示对哪一列进行排序。要编程设置列的排列顺序,可以使用DataView 的 Sort 属性:dataView.Sort=ProductName;dataView.Sort=ProductName ASC,ProductID DESC;上面的第一行按照ProductName 列对数据排序,如图32-6 所示。第二行按照ProductName
19、 列对数据进行升序排序,再以ProductID 的降序来排序。DataView 支持对列进行升序或降序排序-默认为升序。如果选择对DataView 中的多个列进行排序,DataGridView 就不会显示任何排序箭头。(点击查看大图)图32-6 网格中的每一列都是强类型化的,其排序顺序不是基于列的字符串表示,而是基于该列的数据。如果 DataGrid 有一个日期列,要对它进行排序,网格就会按日期来进行排序,而不是按日期字符串来进行排序。4.显示 DataSet 类中的数据DataSet 有一个 DataGridView 不匹配 DataGrid 的特性:DataSet定义时包含了表之间的关系。
20、和以前的 DataGridView 示例一样,DataGrid 一次只能显示一个DataTable,但在下面的示例DataSourceDataSet中,可以在屏幕上浏览DataSet中的关系。下面的代码可以根据Northwind 数据库中的 Customers 和 Orders 表生成这样一个DataSet。这个示例从两个DataTable 中加载数据,然后在这些表之间创建了一个关系CustomerOrders:string orders=SELECT*FROM Orders;string customers=SELECT*FROM Customers;SqlConnection conn=n
21、ew SqlConnection(source);SqlDataAdapter da=new SqlDataAdapter(orders,conn);DataSet ds=new DataSet();da.Fill(ds,Orders);da=new SqlDataAdapter(customers,conn);da.Fill(ds,Customers);ds.Relations.Add(CustomerOrders,ds.TablesCustomers.ColumnsCustomerID,ds.TablesOrders.ColumnsCustomerID);创建好后,通过调用SetDataB
22、inding,就可以把DataSet 绑定到 DataGrid 上:dataGrid1.SetDataBinding(ds,Customers);这会得到如图32-7 所示的屏幕图。(点击查看大图)图32-7 与本章前面的DataGridView 示例不同,每个记录的左边都有一个+号,这表示 DataSet 在 customers 和 orders 表之间有一个可导航的关系。在代码中可以定义许多这类关系。单击+号,就会显示关系列表(如果关系已经显示出来,单击+号就会隐藏该关系)。单击关系名,就可以定位到链接的记录上,如图32-8 所示,在本例中是列出选中客户的所有订单。(点击查看大图)图32-
23、8 DataGrid 控件的右上角还包含两个新图标。箭头允许用户导航回父行,显示上一页的内容。标题行显示父记录的细节,单击另一个按钮会隐藏或显示该箭头。在 DataViewManager 中显示数据DataViewManager 中显示的数据与DataSet中显示的数据相同,但在为DataSet 创建DataViewManager 时,会为每个DataTable 创建一个单独的DataView,再执行代码,根据过滤条件或者行的状态改变显示出来的行,如上面的DataView 示例所示。即使代码不需要过滤数据,也可以把DataSet包装到DataViewManager 中以进行显示,因为这样在修改
24、源代码时可以使用更多的选项。下面的示例根据上一例中的DataSet 创建一个DataViewManager,然后改变Customer 表中的DataView,使之只显示来自英国的客户:DataViewManager dvm=new DataViewManager(ds);dvm.DataViewSettingsCustomers.RowFilter=Country=UK;dataGrid.SetDataBinding(dvm,Customers);如图 32-9 所示为 DataSourceDataViewManager 示例代码的运行结果。(点击查看大图)图32-9 5.IListSourc
25、e 和 IList 接口DataGridView 还支持执行IListSource 和 IList 接口之一的所有对象。IListSource 只有一个方法GetList(),它返回一个IList 接口,而IList 比较有趣,它可由运行库中的许多类执行,执行这个接口的类有 Array、ArrayList 和 StringCollection。在使用 IList 时,对前面Array 的警告也适用于集合中的对象-如果使用StringCollection 作为DataGrid 的数据源,网格就会显示字符串的长度,而不是我们希望显示的元素文本。6.显示泛型集合除了已介绍的类型之外,DataGrid
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分享 C# 高级 编程 doc 32 数据 绑定
限制150内