分享(C#高级编程第6版doc):第32章数据绑定.pdf

上传人:索**** 文档编号:75154458 上传时间:2023-03-02 格式:PDF 页数:35 大小:2.14MB
返回 下载 相关 举报
分享(C#高级编程第6版doc):第32章数据绑定.pdf_第1页
第1页 / 共35页
分享(C#高级编程第6版doc):第32章数据绑定.pdf_第2页
第2页 / 共35页
点击查看更多>>
资源描述

《分享(C#高级编程第6版doc):第32章数据绑定.pdf》由会员分享,可在线阅读,更多相关《分享(C#高级编程第6版doc):第32章数据绑定.pdf(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

26、View 还可以绑定到泛型集合上。其语法与本章前面的示例相同,也是把 DataSource属性设置为该集合,控件就会生成相应的显示结果。所显示的列也基于对象的属性:在DataGridView 中显示所有公共的可读字段。下面的示例显示了一个定义好的list 类:class PersonList:List class Person public Person(string name,Sex sex,DateTime dob)_name=name;_sex=sex;_dateOfBirth=dob;public string Name get return _name;set _name=value

27、;public Sex Sex get return _sex;set _sex=value;public DateTime DateOfBirth get return _dateOfBirth;set _dateOfBirth=value;private string _name;private Sex _sex;private DateTime _dateOfBirth;enum Sex Male,Female 这段代码显示了Person 类的几个实例,它们是在PersonList 类中构建的,如图32-10 所示。(点击查看大图)图32-10 在一些情况下,需要在网格中隐藏某些属性,此

28、时可以使用Browsable 特性,如上面的代码所示。标记为 non-browsable 的属性不会显示在属性网格中。Browsable(false)public bool IsEmployed .DataGridView 使用 Browsable 特性确定是显示还是隐藏一个属性。如果没有设置Browsable 特性,就默认为显示属性。如果属性是只读的,网格控件就显示对象的值,但在网格中它是只读的。在网格视图中进行的所有修改都会反映到底层对象上。例如,如果在上面的代码中,修改了用户界面上的人名,就会调用该属性的设置器方法。32.2 DataGridView类的层次结构DataGridView

29、主要部分的类层次结构如图32-11 所示。(点击查看大图)图32-11 DataGridView 控件在显示数据时利用了派生自DataGridViewColumn的对象,如图32-11 所示。现在,显示数据的选项比以前的DataGrid 控件多。一个大的变化是在DataGrid 中显示下拉列的这个功能,现在DataGridView 以 DataGridViewComboBoxColumn的形式提供。在为 DataGridView 指定数据源时,默认要自动构建列。这些列是根据数据源中的数据类型创建的,所以布尔字段映射为DataGridViewCheckBoxColumn。如果要自己完成列的创建,

30、就可以把AutoGenerateColumns 属性设置为false,自己构建列。下面的例子演示了如何构建列,并包含一个图像和一列ComboBox。代码利用了一个DataSet,把数据提取到两个DataTable 中。第一个 DataTable 包含 Northwind 数据库中的雇员信息,第二个表包含 EmployeeID 列和自动生成的Name 列,在显示ComboBox 时要使用这两列:using(SqlConnection con=new SqlConnection(ConfigurationSettings.ConnectionStringsnorthwind.ConnectionS

31、tring)string select=SELECT EmployeeID,FirstName,LastName,Photo,IsNull(ReportsTo,0)as ReportsTo FROM Employees;SqlDataAdapter da=new SqlDataAdapter(select,con);DataSet ds=new DataSet();da.Fill(ds,Employees);select=SELECT EmployeeID,FirstName+LastName as Name FROM Employees UNION SELECT 0,(None);da=ne

32、w SqlDataAdapter(select,con);da.Fill(ds,Managers);/Construct the columns in the grid view SetupColumns(ds);/Set the default height for a row dataGridView.RowTemplate.Height=100;/Then setup the datasource dataGridView.AutoGenerateColumns=false;dataGridView.DataSource=ds.TablesEmployees;这里要注意两个地方。第一个s

33、elect 语句用 0 替代 ReportsTo 列中的 null 值,数据库中有一行在这个字段中包含了NULL 值,表示这个人没有上级。但是,在绑定数据时,ComboBox 需要这个列中有值,否则在显示网格时会抛出一个异常。在这个例子中,选择显示0,因为表中不存在0-这通常称为 sentinel 值,因为它对应用程序有特殊的含义。第二个 SQL 子句给 ComboBox 选择数据,包括创建值Zero 和(None)时生成的行。在图 32-12 中,第二行显示了(None)。图32-12 定制的列用下面的函数创建:private void SetupColumns(DataSet ds)Dat

34、aGridViewTextBoxColumn forenameColumn=new DataGridViewTextBoxColumn();forenameColumn.DataPropertyName=FirstName;forenameColumn.HeaderText=Forename;forenameColumn.ValueType=typeof(string);forenameColumn.Frozen=true;dataGridView.Columns.Add(forenameColumn);DataGridViewTextBoxColumn surnameColumn=new D

35、ataGridViewTextBoxColumn();surnameColumn.DataPropertyName=LastName;surnameColumn.HeaderText=Surname;surnameColumn.Frozen=true;surnameColumn.ValueType=typeof(string);dataGridView.Columns.Add(surnameColumn);DataGridViewImageColumn photoColumn=new DataGridViewImageColumn();photoColumn.DataPropertyName=

36、Photo;photoColumn.Width=100;photoColumn.HeaderText=Image;photoColumn.ReadOnly=true;photoColumn.ImageLayout=DataGridViewImageCellLayout.Normal;dataGridView.Columns.Add(photoColumn);DataGridViewComboBoxColumn reportsToColumn=new DataGridViewComboBoxColumn();reportsToColumn.HeaderText=Reports To;report

37、sToColumn.DataSource=ds.TablesManagers;reportsToColumn.DisplayMember=Name;reportsToColumn.ValueMember=EmployeeID;reportsToColumn.DataPropertyName=ReportsTo;dataGridView.Columns.Add(reportsToColumn);ComboBox 在本例的最后创建,并使用传送过来的DataSet 中的 Managers 表用作其数据源。该表包含 Name 和 EmployeeID 列,它们分别赋予DisplayMember 和 V

38、alueMember 属性。这两个属性定义了 ComboBox 的数据来自何方。DataPropertyName 设置为组合框链接的主表中的列,它提供了列的初始值,如果用户从组合框中选择另一个值,就更新这个值。这个例子还需要在更新数据库时正确处理空值。目前,如果在屏幕上选择了(None),该例子仅把值 0 写入数据行。在SQL Server 中,这会引发一个异常,因为这违反了ReportsTo 列的外键码约束。为了解决这个问题,需要在把数据发送回SQL Server 之前,预先处理它,即把行中值为0 的 ReportsTo列再设置为NULL。32.3 数据绑定前面的示例都使用了DataGrid

39、 控件和 DataGridView 控件,这是在.NET 运行库中可以显示数据的两个控件。把控件链接到数据源的过程称为数据绑定。在 MFC 库中,把数据从类变量链接到一组控件上的过程称为对话框数据交换(Dialog Data Exchange,DDX)。在.NET 中,可用于把数据绑定到控件上的功能更容易使用,也更强大。例如,在.NET中,可以把数据绑定到控件的大多数属性上,而不仅仅是文本属性。还可以用类似的方式把数据绑定到 ASP.NET 控件上(参阅第 37 章)。32.3.1 简单的绑定支持单一绑定的控件一般一次只显示一个值,例如文本框或单选按钮,下面的示例说明了如何把DataTable

40、 中的一列绑定到TextBox 上:DataSet ds=CreateDataSet();textBox1.DataBindings.Add(Text,ds,Products.ProductName);用上面的方法CreateDataSet()从 Products 表中检索一些数据,并保存到返回的DataSet 中,之后,第二行代码把控件(textBox1)的 Text 属性绑定到Products.ProductName 列上。图32-13 显示了这种数据绑定的结果。(点击查看大图)图32-13 文本框显示了数据库中的一个字符串,要检查这个数据是否放在正确的列上并有正确的值,可以使用 SQL

41、Server Management Studio 工具,验证Products 表中的内容,如图32-14 所示。(点击查看大图)图32-14 屏幕上有一个文本框,既不能滚动到下一个或上一个记录上,也不能更新数据库,因此下一节介绍一个更真实的示例,说明如何使用其他对象绑定数据。32.3.2 数据绑定对象图 32-15 显示了数据绑定中使用的对象的类层次结构。本节将讨论System.Windows.Forms 命名空间中的类BindingContext、CurrencyManager 和 PropertyManager,说明在把数据绑定到窗体上的一个或多个控件上时,它们是如何交互的。带阴影的对象就

42、是在绑定中使用的对象。在前面的示例中,我们使用 TextBox 控件的 DataBindings 属性把 DataSet的一列绑定到控件的Text属性上,DataBindings 属性是图32-15 所示的 ControlsBindingsCollection的一个实例。(点击查看大图)图32-15 textBox1.DataBindings.Add(Text,ds,Products.ProductName);这行代码给ControlBindingsCollection添加一个Binding 对象。1.BindingContext每个 Windows 窗体都有BindingContext 属性

43、,实际上,Form 派生自 Control,该属性是在Control中定义的,所以大多数控件都有这个属性。BindingContext 对象有一个BindingManager Base 实例集合,如图 32-16 所示。在对控件进行数据绑定时,就会创建这些实例,并把它们添加到绑定管理器对象中。图32-16 BindingContext 可以包含几个数据源,包装在CurrencyManager 或 PropertyManager 中。使用哪个类取决于数据源本身。如果数据源包含一个项目列表,例如DataTable、DataView 或实现 IList 接口的对象,就使用CurrencyManage

44、r,因为它可以在该数据源中保存当前位置。如果数据源只返回一个值,就把PropertyManager 存储在 BindingContext 中。只为给定的数据源创建一次CurrencyManager 或 PropertyManager。如果把两个文本框绑定到DataTable 的一个行上,则在BindingContext 中只创建一个CurrencyManager。添加到窗体中的每个控件都链接到窗体的绑定管理器上,因此所有的控件都共享相同的实例。在最初创建一个控件时,其BindingContext 属性为空。在把控件添加到窗体的Controls 集合中时,就把BindingContext 设置为

45、该窗体的Controls 集合。要把控件绑定到一个列上,需要给其 DataBindings 属性添加一项,这是 ControlBindings Collection的一个实例。下面的代码可以创建一个新绑定:textBox1.DataBindings.Add(Text,ds,Products.ProductName);ControlBindingsCollection的 Add()方法会从传递给它的参数中创建Binding 对象的一个实例,并把它添加到绑定集合中,如图32-17 所示。图 32-17 显示了把 Binding 实例添加到控件中的情况。绑定把控件链接到数据源上,存储在 Form(或

46、控件本身)的 BindingContext 中。数据源内部的改变会反映到控件上,控件中的改变也会反映到数据源上。(点击查看大图)图32-17 2.Binding 类这个类把控件的一个属性链接到数据源的一个成员上。在改变该成员时,控件的属性会更新,以反映这个改变。反之亦然,如果文本框中的文本被更新,这个改变也会反映到数据源上。可以把任何列绑定到控件的任何属性上,例如,可以把列绑定到一个文本框的Text 属性中,也可以把另一个列绑定到文本框的Color 属性上。可以把控件的属性绑定到完全不同的数据源上,例如,单元格的颜色在一个颜色表中定义,而实际的数据在另一个表中定义。3.CurrencyMana

47、ger和 PropertyManager在创建 Binding 对象时,如果这是第一次绑定数据源中的数据,就会创建对应的CurrencyManager或 PropertyManager 对象。这个类的作用是定义当前记录在数据源中的位置,在改变当前的记录时,需要调整所有的ListBindings。图 32-18 显示了 Products 表中的两个字段,包含一种通过跟踪栏控件在记录之间移动的方式。(点击查看大图)图32-18 ScrollingDataBinding示例的代码如下所示:namespace ScrollingDataBinding partial class Form1:Form

48、public Form1()InitializeComponent();private DataSet CreateDataSet()string customers=SELECT*FROM Products;DataSet ds=new DataSet();using(SqlConnection con=new SqlConnection(ConfigurationSettings.ConnectionStringsnorthwind.ConnectionString)SqlDataAdapter da=new SqlDataAdapter(customers,con);da.Fill(ds

49、,Products);return ds;private void trackBar_Scroll(object sender,EventArgs e)this.BindingContextds,Products.Position=trackBar.Value;private void retrieveButton_Click(object sender,EventArgs e)retrieveButton.Enabled=false;ds=CreateDataSet();textName.DataBindings.Add(Text,ds,Products.ProductName);textQ

50、uan.DataBindings.Add(Text,ds,Products.QuantityPerUnit);trackBar.Minimum=0;trackBar.Maximum=this.BindingContextds,Products.Count-1;textName.Enabled=true;textQuan.Enabled=true;trackBar.Enabled=true;private DataSet ds;滚动机制在trackBar_Scroll 事件处理程序中提供,该处理程序把BindingContext 的位置设置为跟踪条的当前位置,改变BindingContext 会

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁