




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第32章数 据 绑 定第26章介绍了选择和修改数据的各种方式,本章接着第25章的内容,继续介绍如何把绑定到各种Windows控件上的数据显示给用户。本章主要内容如下:使用DataGridView控件显示数据.NET数据绑定功能及其工作方式如何使用Server Explorer创建连接,生成DataSet类(不需要编写代码)如何对DataGrid中的数据行进行测试和反射本章的示例代码可以从Wrox网站上下载。32.1 DataGridView控件.NET的最初版本中的DataGrid控件有强大的功能,但在许多方面,它都不适用于商业应用程序,例如不能显示图像、下拉控件或锁定列等。该控件给人感觉只完成了一半,所以许多控件经销商都提供了定制的栅格控件,以克服这些缺陷,并提供更多的功能。在.NET 2.0中有了另一个栅格控件DataGridView。它解决了DataGrid控件最初的许多问题,还增加了许多只能在插件产品中使用的功能。新控件具有与DataGrid类似的绑定功能,可以绑定到Array、DataTable、DataView或DataSet类,或者绑定到实现IListSource或IList接口的组件上。DataGridView控件可以显示数据的许多视图。在最简单的情况下,设置DataSource和DataMember属性,就可以显示数据(与DataSet类一样)。注意,这个新控件不是DataGrid的插件替代品,所以其编程接口完全不同于DataGrid。这个控件还提供了更复杂的功能,本章将讨论这些功能。32.1.1 显示列表数据第19章介绍了选择数据和把数据放在一个数据表中的各种方式,但仅使用了Console. WriteLine()方法以非常基本的形式显示数据。下面的示例将说明如何获取一些数据,并在DataGridView控件中显示,为此,建立一个新的应用程序DisplayTabularData,如图32-1所示。(点击查看大图)图 32-1 这个简单的应用程序从Northwind数据库的customer表中选择每个记录,在DataGridView控件中把它们显示给用户。其代码如下所示(不包含窗体和控件定义代码):using System;using System.Configuration;using System.Data;using System.Data.Common;using System.Data.SqlClient;using System.Windows.Forms;namespace DisplayTabularDatapartial class Form1: Formpublic Form1()InitializeComponent();private 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);dataGridView.AutoGenerateColumns = true;dataGridView.DataSource = ds;dataGridView.DataMember = Customers; 窗体包含getData按钮,单击它会调用示例代码中的getData_Click方法。这段代码使用ConfigurationManager类的属性ConnectionStrings构建了SqlConnection对象。之后构建一个DataSet,使用DataAdapter对象填充数据库表中的数据。然后设置DataSource和DataMember属性,在DataGridView控件中显示数据。注意AutoGenerateColumns属性也设置为true,以确保给用户显示一些数据。如果这个标记没有指定,就需要自己创建所有的列。32.1.2 数据源DataGridView控件是一种显示数据的非常灵活的方式。除了把DataSource设置为DataSet,DataMember设置为要显示的表名之外,DataSource属性还可以设置为下述任何一个数据源:数组(网格可以绑定到任何一个一维数组上)DataTableDataViewDataSet或DataViewManager实现IListSource接口的组件实现IList接口的组件泛型集合类或派生于泛型集合类的对象下面几节将给出这些数据源的示例。1. 显示数组中的数据这初看起来非常简单,创建一个数组,填充一些数据,再在DataGridView控件上设置DataSource属性。下面是一些示例代码:string stuff = new string One, Two, Three;dataGridView. DataBinding = stuff;如果数据源包含多个表(例如使用DataSet 或 DataViewManager),就需要设置DataMember属性。可以用这个数组代码替换上面示例中的getData_Click事件处理程序,这段代码的结果如图32-2所示。可以看出,网格显示出了数组中定义的字符串的长度,而不是这些字符串。原因是在把数组用作DataGridView控件的数据源时,网格会查找数组中对象的第一个公共属性,并显示这个值,而不会显示字符串值。字符串的第一个(也是唯一的)公共属性是其长度,所以就显示这个长度值。使用TypeDescriptor类的GetProperties方法可以获得任意类的属性列表,该方法返回的是一个PropertyDescriptor对象集合,接着,就可以在显示数据时使用它。.NET 的PropertyGrid控件在显示任意对象时,就使用这个方法。在DataGridView中显示字符串的一种解决方法是创建一个包装器类,如下所示:protected class Itempublic Item(string text)_text = text;public string Textgetreturn _text;private string _text;在数据源数组代码中添加这个Item类(从进行的各种处理来讲,它也可以是一个结构)的数组后,结果如图32-3所示。(点击查看大图)图 32-2 (点击查看大图)图 32-3 2. DataTable有两种方式在DataGridView控件中显示DataTable:如果DataTable是独立的,就把控件的DataSource属性设置为这个表。如果在DataSet中包含DataTable,就把控件的DataSource属性设置为DataSet,DataMember属性设置为DataSet中的DataTable名。图32-4所示为运行DataSourceDataTable示例代码的结果。(点击查看大图)图 32-4 注意,最后一列显示了一个复选框,而不是更常见的编辑控件。DataGridView控件没有显示其他信息,而是从数据源中读取模式(在本例中是Products表),根据列的类型推断应显示什么控件。与以前的DataGrid控件不同,DataGridView控件还可以显示图像列、按钮和组合框。在修改了DataGrid中的字段时,数据库中的数据不会改变,因为此时数据仅存储在本地计算机上- 没有与数据库的活动连接。后面将讨论更新数据源中的数据。3. 显示DataView中的数据DataView提供了一种过滤和排序DataTable中数据的一种方式。在从数据库中选择数据时,用户一般可以单击列标题,对数据排序。此外,还可以只过滤要显示在某些行中的数据,例如用户修改过的所有数据。DataView允许过滤要显示给用户的数据行,但不允许过滤DataTable中的数据列。提示:DataView不允许过滤要显示的数据列,只允许过滤要显示的数据行。根据现有的DataTable创建DataView的代码如下所示:DataView dv = new DataView(dataTable);创建好后,就可以改变DataView上的设置,当该视图显示在DataGrid中时,这些设置会影响要显示的数据,以及对这些数据进行的操作。例如:设置AllowEdit = false表示在数据行上禁用所有列的编辑功能。设置AllowNew = false 表示禁用新行功能。设置AllowDelete = false表示禁用删除行的功能。设置RowStateFilter只显示指定状态的行。设置RowFilter 可过滤数据行。下一节将介绍如何使用RowStateFilter设置,其他选项都很容易理解。(1) 通过数据过滤数据行创建好DataView后,就可以通过设置RowFilter属性,来改变视图显示的数据。这个属性是一个字符串,可用作按照给定条件过滤数据的一种方式- 该字符串的值就是过滤条件。其语法类似于一般SQL中的WHERE子句,但主要是对已经从数据库中选择出来的数据进行操作。过滤子句的一些示例如表32-1所示。表 32-1子 句说 明UnitsInStock 50只显示UnitsInStock列大于50的行Client = Smith只返回给定客户的记录County LIKE C*返回County字段以C开头的所有记录 例如返回Cornwall、Cumbria、Cheshire和Cambridgeshire所在的行。可以使用表示匹配一个字符的通配符,而*表示匹配0个或多个字符的通配符运行库尽可能在过滤表达式中使用与源列相匹配的数据类型。例如,在前面的示例中,使用UnitsInStock 50表达式就是合法的,尽管该列是一个整数列。但如果提供了一个无效的过滤字符串,就会产生EvaluateException异常。(2) 根据状态过滤数据行DataView中的每一行都有一个定义好的行状态,它们的值如表32-2所示,这些状态也可以用于过滤用户查看的行。表 32-2DataViewRowState说 明Added列出新创建的所有行CurrentRows列出除了被删除的行以外的其他行Deleted列出最初被选中,且已经删除的行 不显示已经删除的新建行ModifiedCurrent列出所有已被修改的行,并显示这些行的当前值ModifiedOriginal列出所有已被修改的行,但显示这些行的初值,而不是当前值OriginalRows列出最初从数据源中选中的所有行,不包括新行。显示列的初值(即如果进行了修改,不显示当前值)Unchanged列出没有修改的行图32-5显示了两个网格,一个网格显示已添加、删除或修改的数据行,另一个网格显示状态为表32-2中一种的行。图 32-5过滤器不仅可以用于可见的行,还可以用于这些行中列的状态。在进行Modified- Original 或 ModifiedCurrent选择时,这是很明显的。这两个状态都在第20章介绍过了,它们都是基于DataRowVersion枚举的。例如,如果用户更新了数据行中的一列,该行就会在选择ModifiedOriginal或 ModifiedCurrent时显示出来,但其实际值可以是从数据库中选择出来的初值(如果选择了ModifiedOriginal),或者DataColumn中的当前值(如果选择了ModifiedCurrent)。(3) 对数据行进行排序除了过滤数据外,有时还需要对DataView中的数据进行排序。可以在DataGridView控件中单击列标题,这会按照升序或降序的顺序对该列进行排序,如图32-6所示。唯一的问题是控件只能对一列进行排序,而底层的DataView控件可以对多个列进行排序。在对数据列进行排序时,可以单击列的标题(例如上面的ProductName列),也可以通过代码排序,DataGrid会显示一个箭头位图,表示对哪一列进行排序。要编程设置列的排列顺序,可以使用DataView的Sort属性:dataView.Sort = ProductName;dataView.Sort = ProductName ASC, ProductID DESC; 上面的第一行按照ProductName列对数据排序,如图32-6所示。第二行按照ProductName列对数据进行升序排序,再以ProductID的降序来排序。DataView支持对列进行升序或降序排序- 默认为升序。如果选择对DataView中的多个列进行排序,DataGridView就不会显示任何排序箭头。(点击查看大图)图 32-6 网格中的每一列都是强类型化的,其排序顺序不是基于列的字符串表示,而是基于该列的数据。如果DataGrid有一个日期列,要对它进行排序,网格就会按日期来进行排序,而不是按日期字符串来进行排序。4. 显示DataSet类中的数据DataSet有一个DataGridView不匹配DataGrid的特性:DataSet定义时包含了表之间的关系。和以前的DataGridView示例一样,DataGrid一次只能显示一个DataTable,但在下面的示例DataSourceDataSet中,可以在屏幕上浏览DataSet中的关系。下面的代码可以根据Northwind数据库中的Customers和Orders表生成这样一个DataSet。这个示例从两个DataTable中加载数据,然后在这些表之间创建了一个关系CustomerOrders:string orders = SELECT * FROM Orders;string customers = SELECT * FROM Customers;SqlConnection conn = new 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);创建好后,通过调用SetDataBinding,就可以把DataSet绑定到DataGrid上:dataGrid1.SetDataBinding(ds, Customers);这会得到如图32-7所示的屏幕图。(点击查看大图)图 32-7 与本章前面的DataGridView示例不同,每个记录的左边都有一个+号,这表示DataSet在customers 和orders表之间有一个可导航的关系。在代码中可以定义许多这类关系。单击+号,就会显示关系列表(如果关系已经显示出来,单击+号就会隐藏该关系)。单击关系名,就可以定位到链接的记录上,如图32-8所示,在本例中是列出选中客户的所有订单。(点击查看大图)图 32-8 DataGrid控件的右上角还包含两个新图标。箭头允许用户导航回父行,显示上一页的内容。标题行显示父记录的细节,单击另一个按钮会隐藏或显示该箭头。在DataViewManager中显示数据DataViewManager中显示的数据与DataSet中显示的数据相同,但在为DataSet创建DataViewManager时,会为每个DataTable创建一个单独的 DataView,再执行代码,根据过滤条件或者行的状态改变显示出来的行,如上面的DataView示例所示。即使代码不需要过滤数据,也可以把DataSet包装到 DataViewManager中以进行显示,因为这样在修改源代码时可以使用更多的选项。下面的示例根据上一例中的DataSet 创建一个DataViewManager,然后改变Customer表中的DataView,使之只显示来自英国的客户:DataViewManager dvm = new DataViewManager(ds);dvm.DataViewSettingsCustomers.RowFilter = Country=UK;dataGrid.SetDataBinding(dvm, Customers);如图32-9所示为DataSourceDataViewManager示例代码的运行结果。(点击查看大图)图 32-95. IListSource和 IList接口DataGridView还支持执行IListSource和IList接口之一的所有对象。IListSource只有一个方法GetList(),它返回一个IList接口,而IList比较有趣,它可由运行库中的许多类执行,执行这个接口的类有Array、ArrayList和StringCollection。在使用IList时,对前面Array的警告也适用于集合中的对象- 如果使用StringCollection作为DataGrid的数据源,网格就会显示字符串的长度,而不是我们希望显示的元素文本。6. 显示泛型集合除了已介绍的类型之外,DataGridView还可以绑定到泛型集合上。其语法与本章前面的示例相同,也是把DataSource属性设置为该集合,控件就会生成相应的显示结果。所显示的列也基于对象的属性:在DataGridView中显示所有公共的可读字段。下面的示例显示了一个定义好的list类:class PersonList : List class Personpublic Person( string name, Sex sex, DateTime dob )_name = name;_sex = sex;_dateOfBirth = dob; public string Nameget return _name; set _name = value; public Sex Sexget return _sex; set _sex = value; public DateTime DateOfBirthget return _dateOfBirth; set _dateOfBirth = value; private string _name;private Sex _sex;private DateTime _dateOfBirth;enum SexMale,Female这段代码显示了Person类的几个实例,它们是在PersonList类中构建的,如图32-10所示。(点击查看大图)图 32-10在一些情况下,需要在网格中隐藏某些属性,此时可以使用Browsable特性,如上面的代码所示。标记为non-browsable的属性不会显示在属性网格中。Browsable(false)public bool IsEmployed.DataGridView使用Browsable特性确定是显示还是隐藏一个属性。如果没有设置Browsable特性,就默认为显示属性。如果属性是只读的,网格控件就显示对象的值,但在网格中它是只读的。在网格视图中进行的所有修改都会反映到底层对象上。例如,如果在上面的代码中,修改了用户界面上的人名,就会调用该属性的设置器方法。32.2 DataGridView类的层次结构DataGridView主要部分的类层次结构如图32-11所示。(点击查看大图)图 32-11 DataGridView控件在显示数据时利用了派生自DataGridViewColumn的对象,如图32-11所示。现在,显示数据的选项比以前的DataGrid控件多。一个大的变化是在DataGrid中显示下拉列的这个功能,现在DataGridView以DataGridViewComboBoxColumn的形式提供。在为DataGridView指定数据源时,默认要自动构建列。这些列是根据数据源中的数据类型创建的,所以布尔字段映射为DataGridViewCheckBoxColumn。如果要自己完成列的创建,就可以把AutoGenerateColumns属性设置为false,自己构建列。下面的例子演示了如何构建列,并包含一个图像和一列ComboBox。代码利用了一个DataSet,把数据提取到两个DataTable中。第一个DataTable包含Northwind数据库中的雇员信息,第二个表包含EmployeeID列和自动生成的Name列,在显示ComboBox时要使用这两列:using (SqlConnection con = new SqlConnection ( ConfigurationSettings.ConnectionStringsnorthwind.ConnectionString ) )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 = new SqlDataAdapter(select, con);da.Fill(ds, Managers); / Construct the columns in the grid viewSetupColumns(ds); / Set the default height for a rowdataGridView.RowTemplate.Height = 100 ; / Then setup the datasourcedataGridView.AutoGenerateColumns = false;dataGridView.DataSource = ds.TablesEmployees;这里要注意两个地方。第一个select语句用0替代ReportsTo列中的null值,数据库中有一行在这个字段中包含了NULL值,表示这个人没有上级。但是,在绑定数据时,ComboBox需要这个列中有值,否则在显示网格时会抛出一个异常。在这个例子中,选择显示0,因为表中不存在0- 这通常称为sentinel值,因为它对应用程序有特殊的含义。第二个SQL子句给ComboBox选择数据,包括创建值Zero和(None)时生成的行。在图32-12中,第二行显示了(None)。图 32-12定制的列用下面的函数创建:private void SetupColumns(DataSet ds)DataGridViewTextBoxColumn forenameColumn = new DataGridViewTextBoxColumn();forenameColumn.DataPropertyName = FirstName;forenameColumn.HeaderText = Forename;forenameColumn.ValueType = typeof(string);forenameColumn.Frozen = true;dataGridView.Columns.Add(forenameColumn);DataGridViewTextBoxColumn surnameColumn = new DataGridViewTextBoxColumn();surnameColumn.DataPropertyName = LastName;surnameColumn.HeaderText = Surname;surnameColumn.Frozen = true;surnameColumn.ValueType = typeof(string);dataGridView.Columns.Add(surnameColumn); DataGridViewImageColumn photoColumn = new DataGridViewImageColumn();photoColumn.DataPropertyName = 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;reportsToColumn.DataSource = ds.TablesManagers;reportsToColumn.DisplayMember = Name;reportsToColumn.ValueMember = EmployeeID;reportsToColumn.DataPropertyName = ReportsTo;dataGridView.Columns.Add(reportsToColumn);ComboBox在本例的最后创建,并使用传送过来的DataSet中的Managers表用作其数据源。该表包含Name和EmployeeID列,它们分别赋予DisplayMember和ValueMember属性。这两个属性定义了ComboBox的数据来自何方。DataPropertyName设置为组合框链接的主表中的列,它提供了列的初始值,如果用户从组合框中选择另一个值,就更新这个值。这个例子还需要在更新数据库时正确处理空值。目前,如果在屏幕上选择了(None),该例子仅把值0写入数据行。在SQL Server中,这会引发一个异常,因为这违反了ReportsTo列的外键码约束。为了解决这个问题,需要在把数据发送回SQL Server之前,预先处理它,即把行中值为0的ReportsTo列再设置为NULL。32.3 数据绑定前面的示例都使用了DataGrid控件和DataGridView控件,这是在.NET运行库中可以显示数据的两个控件。把控件链接到数据源的过程称为数据绑定。在MFC库中,把数据从类变量链接到一组控件上的过程称为对话框数据交换(Dialog Data Exchange,DDX)。在.NET中,可用于把数据绑定到控件上的功能更容易使用,也更强大。例如,在.NET中,可以把数据绑定到控件的大多数属性上,而不仅仅是文本属性。还可以用类似的方式把数据绑定到ASP.NET控件上(参阅第37章)。32.3.1 简单的绑定支持单一绑定的控件一般一次只显示一个值,例如文本框或单选按钮,下面的示例说明了如何把DataTable中的一列绑定到TextBox上:DataSet ds = CreateDataSet();textBox1.DataBindings.Add(Text, ds , Products.ProductName);用上面的方法CreateDataSet()从Products表中检索一些数据,并保存到返回的DataSet中,之后,第二行代码把控件(textBox1)的Text属性绑定到Products.ProductName列上。图32-13显示了这种数据绑定的结果。(点击查看大图)图 32-13文本框显示了数据库中的一个字符串,要检查这个数据是否放在正确的列上并有正确的值,可以使用SQL Server Management Studio工具,验证Products表中的内容,如图32-14所示。(点击查看大图)图 32-14 屏幕上有一个文本框,既不能滚动到下一个或上一个记录上,也不能更新数据库,因此下一节介绍一个更真实的示例,说明如何使用其他对象绑定数据。32.3.2 数据绑定对象图32-15显示了数据绑定中使用的对象的类层次结构。本节将讨论System.Windows. Forms 命名空间中的类BindingContext、CurrencyManager和PropertyManager,说明在把数据绑定到窗体上的一个或多个控件上时,它们是如何交互的。带阴影的对象就是在绑定中使用的对象。在前面的示例中,我们使用TextBox控件的DataBindings属性把DataSet的一列绑定到控件的Text属性上,DataBindings属性是图32-15所示的ControlsBindingsCollection的一个实例。(点击查看大图)图 32-15textBox1.DataBindings.Add(Text, ds, Products.ProductName);这行代码给ControlBindingsCollection添加一个Binding对象。1. BindingContext每个Windows窗体都有BindingContext属性,实际上,Form派生自Control,该属性是在Control中定义的,所以大多数控件都有这个属性。BindingContext对象有一个BindingManager Base实例集合,如图32-16所示。在对控件进行数据绑定时,就会创建这些实例,并把它们添加到绑定管理器对象中。图 32-16BindingContext可以包含几个数据源,包装在CurrencyManager或PropertyManager中。使用哪个类取决于数据源本身。如果数据源包含一个项目列表,例如DataTable、DataView或实现IList接口的对象,就使用CurrencyManager,因为它可以在该数据源中保存当前位置。如果数据源只返回一个值,就把PropertyManager存储在BindingContext中。只为给定的数据源创建一次CurrencyManager或PropertyManager。如果把两个文本框绑定到DataTable的一个行上,则在BindingContext中只创建一个CurrencyManager。添加到窗体中的每个控件都链接到窗体的绑定管理器上,因此所有的控件都共享相同的实例。在最初创建一个控件时,其BindingContext属性为空。在把控件添加到窗体的Controls集合中时,就把BindingContext设置为该窗体的Controls集合。要把控件绑定到一个列上,需要给其DataBindings属性添加一项,这是ControlBindings Collection的一个实例。下面的代码可以创建一个新绑定:textBox1.DataBindings.Add(Text, ds, Products.ProductName);ControlBindingsCollection的Add()方法会从传递给它的参数中创建Binding对象的一个实例,并把它添加到绑定集合中,如图32-17所示。图32-17显示了把Binding实例添加到控件中的情况。绑定把控件链接到数据源上,存储在Form(或控件本身)的BindingContext中。数据源内部的改变会反映到控件上,控件中的改变也会反映到数据源上。(点击查看大图)图 32-172. Binding类这个类把控件的一个属性链接到数据源的一个成员上。在改变该成员时,控件的属性会更新,以反映这个改变。反之亦然,如果文本框中的文本被更新,这个改变也会反映到数据源上。可以把任何列绑定到控件的任何属性上,例如,可以把列绑定到一个文本框的Text属性中,也可以把另一个列绑定到文本框的Color属性上。可以把控件的属性绑定到完全不同的数据源上,例如,单元格的颜色在一个颜色表中定义,而实际的数据在另一个表中定义。3. CurrencyManager和PropertyManager 在创建Binding对象时,如果这是第一次绑定数据源中的数据,就会创建对应的CurrencyManager或PropertyManager对象。这个类的作用是定义当前记录在数据源中的位置,在改变当前的记录时,需要调整所有的ListBindings。图32-18显示了Products表中的两个字段,包含一种通过跟踪栏控件在记录之间移动的方式。(点击查看大图)图 32-18ScrollingDataBinding示例的代码如下所示:namespace ScrollingDataBindingpartial class Form1: Formpublic 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, 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);textQuan.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会更新显示在屏幕中的数据。在retrieveButton_Click事件中添加一个数据绑定表达式,就把数据绑定到两个文本框上,这里控件的Text属性设置为数据源中的字段。可以把控件的任意简单数据绑定到数据源的一项上,例如,可以绑定text color、enabled等属性。在开始检索数据时,跟踪栏的最大位置就设置为记录的个数。接着在上面的滚动方法中,把Products数据表中BindingContext的位置设置为滚动条的位置,这样就可以有效地改变DataTable中的当前记录,绑定到当前行上的所有控件(在本例中是两个文本框)就会被更新。本节介绍了如何绑定到各种数据源(例如数组、数据表、数据视图和各种其他数据容器)上,如何排序和过滤数据。下一节将讨论如何扩展Visual Studio,以允许进行数据访问,得到与应用程序的更好集成。32.4 Visual Studio和数据访问本节讨论Visual Studio把数据集成到GUI中的一些新方式,具体地说,就是讨论如何创建连接,选择一些数据,生成一个DataSet,再使用生成的所有对象创建一个简单的应用程序。Visual Studio提供的工具可以使用OleDbConnection或SqlConnection类创建一个数据库连接,使用哪个类取决于要连接的数据库类型。定义了一个连接后,就可以创建一个DataSet,在Visual Studio中给它填充数据,这会为DataSet生成一个XSD文件和.cs代码,最终会创建一个类型安全的DataSet。32.4.1 创建一个连接首先,创建一个新的Windows应用程序,之后创建一个数据库连接。使用Server Explorer,可以管理数据访问的各个方面,如图32-19所示。在本例中,需要创建Northwind数据库的一个连接。从Data Connections项的弹出菜单中选择Add Connection选项,会打开一个向导,该向导允许选择数据库提供程序。这里选择.NET Framework Provider for SQL Server。Add Connection对话框如图32-20所示。(点击查看大图)图 32-19(点击查看大图)图 32-20根据.NET Framework安装,示例数据库可能位于SQL Server、MSDE(Microsoft SQL Server Data Engine),或者在这两个地方都有。要连接本地MSDE数据库(如果有),键入(Local)NETSDK作为服务器的名称。要连接一般的SQL Server实例,应键入(local)或.,选择当前机器上的一个数据库,或者选择网络上需要的服务器名称。还需要输入用户名和密码来访问数据库。从数据库的下拉列表中选择Northwind数据库,为了确保正确安装了所有的文件,单击Test Connection按钮,如果一切安装正确,就应显示一个包含确认信息的消息框。Visual Studio 2005在数据访问方面有许多变化,这些在用户界面的几个地方可以看出。我喜欢使用新的Data菜单,它可以查看已添加到项目中的数据源,添加新数据源,预览底层数据库(或其他数据源)中的数据。下面的例子使用Northwind数据库连接生成一个用户界面,用于从Employees表中选择数据。第一步是从Data菜单中选择Add New Data Source,打开一个向导,利用该向导完成后面的步骤。图32-21显示了Data Sources Configuration向导的一部分,从中可以为数据源选择合适的表。(点击查看大图)图 32-21在向导中,可以选择数据源,它可以是数据库、本地数据库文件(例如.mdb文件)、Web服务或一个对象。接着向导要求用户根据所选择的数据源类型提供更详细的信息。对于数据库连接,要提供的信息有连接名称(它随后存储在应用程序配置文件中,如下面的代码所示),接着选择提供数据的表、视图或存储过程。最后,这会在应用程序中生成一个强类型化的DataS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 备选公益岗位发言稿
- 学生开学典礼发言稿
- 时间的脚印微课课件
- 时间序列课件王燕
- 金蝶销售流程培训
- 2025版大型企业总部办公室设备搬迁与配置服务合同
- 2025版跨境电商玩具出口合同文本
- 2025版电子商务平台用户体验优化托管服务合同
- 二零二五年度产品发布会速记工作及保密协议
- 二零二五年度商业综合体电梯购置、安装及运营合同
- 留疆战士考试试题及答案
- 大学生创新创业基础(创新创业课程)完整全套教学课件
- 楼板下加钢梁加固施工方案
- 智能渔业养殖系统开发合同
- 组织行为学复习纲要冬课件
- TGDMDMA 0026-2023 牙科种植用导板
- 医院发生火灾的应急预案及处理流程
- LY/T 1828-2009黄连木栽培技术规程
- X射线衍射课件(XRD)
- 常见皮肤病的种类及症状图片、简介大全课件
- 吊篮拆除安全技术交底方案
评论
0/150
提交评论