c#2005数据库编程经典教程.doc_第1页
c#2005数据库编程经典教程.doc_第2页
c#2005数据库编程经典教程.doc_第3页
c#2005数据库编程经典教程.doc_第4页
c#2005数据库编程经典教程.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

c#2005数据库编程经典教程2009-09-27 22:563.2 绑定到数据源创建数据源后,就可以使用数据绑定技术将窗体控件同数据源关联起来。这可能很简单,也可能很复杂,就看要怎么实现,可能同时要用到声明式方法(通常是使用向导)和编程式方法(使用自己的代码定制行为)。本章将采用较简单的方法,只使用向导将数据绑定到控件。本书后面将介绍更高级的定制。可以将数据绑定到很多控件,但使用向导只能绑定到下列控件: 列表控件:在列表中显示单列数据; DataGridView控件:以类似于表格的格式显示数据; BindingNavigator控件:在表中的多条记录之间导航; 由基本控件(如TextBox和Label)组成的详细视图:显示单行数据。稍后将介绍如何完成这些工作,但在此之前先来看一下另一个控件:BindingSource,它是数据绑定的核心。3.2.1 BindingSource控件BindingSource控件充当数据绑定控件和数据源之间的中介。它提供了一个通用接口,其中包含控件绑定到数据源时所需的所有功能。使用向导将控件绑定到数据源时,实际上创建并配置了一个BindingSource控件实例,并绑定到该实例。这种架构提供了很大的灵活性,尤其是在复杂的情形下,因为这样可以将数据源设计为任何形式,只要它能够与BindingSource控件进行通信。这意味着可以使用非数据库数据源,或使用极其复杂的数据访问机制的自定义数据源。然而,在本书的大部分地方,都将使用BindingSource控件来访问类型化数据集类。前面提到过,配置BindingSource控件通常都是自动完成的。然而,为避免后台发生太多看不到的操作,需要对这个控件的工作原理进行较深入研究,看看如何手工配置它。可以手工地将该控件的实例添加到窗体中。它是不可见的组件,在窗体中看不到。添加的实例将出现在窗体下面,如图3.17所示。在图3.17所示中,添加的BindingSource实例使用默认名bindingSource1。当然,可以修改它的名称,但在这里的讨论中,将使用该名称。如果创建了一个新的Windows窗体程序,并在主窗口Form1中添加了一个Binding Source控件,则完成本节后将产生一些代码。配置BindingSource实例的第一步是设置其DataSource属性。这可以是几种数据源中的任何一种,包括自己创建的数据源,但通常是类型化数据集。使用属性窗口,可以绑定到项目中类型化数据集,如图3.18所示。如果读者在自己的项目中进行操作,则需要添加数据源到项目中,才能看到与图3.18相同的显示(添加数据源后,选择bindingSource1控件;然后,在属性窗口中选择DataSource属性,并单击下拉箭头。在下拉列表中,选择要使用的数据源。对于使用类型化数据集的数据源,应展开“其他数据源”,然后展开“项目数据源”,才能找到数据源)。 图3.17 窗体中的BindingSource控件 图3.18 为BindingSource组件选择数据源图3.18选择了类型化数据集FolktaleDBDataSet作为数据源。以这种方式选择类型化数据集类时,将生成该类的一个实例。在这个示例中,选择了类型化数据集FolktaleDBDataSet,导致在窗体中添加了成员字段folktaleDBDataSet。它在Form1.Designer.cs中定义如下:private FolktaleDBDataSet folktaleDBDataSet;正是这个成员被用作BindingSource控件的数据源。选择数据源后,设置BindingSource控件的DataMember属性,更详细地指定要绑定到数据源中的哪些数据。绑定到类型化数据集时,将该属性设置为数据表,该表可用本章前面介绍的任何方法填充。在属性窗口中,可用从数据集中的多个表中选择,如图3.19所示。图3.19以这种方式添加DataMember时,将在代码中添加另一个新成员一个数据适配器:private .FolktaleDBDataSetTableAdapters.StoryTableAdapter storyTableAdapter;另外,在Form.cs中的Load事件处理程序中,添加了使用这个数据适配器填充数据集实例中相关表的代码:private void Form1_Load(object sender, EventArgs e) / TODO: This line of code loads data into the folktaleDBDataSet.Story table. / You can move, or remove it, as needed. this.storyTableAdapter.Fill(this.folktaleDBDataSet.Story);自动生成的注释指出,这只是为方便而添加的,可以将它移到任何位置。上述代码表明,窗体加载时将加载数据,使其立即可用,这通常是程序员希望的。数据适配器和类型化数据集实例都显示在窗体设计器的组件部分,在BindingSource控件的旁边。可以在这里通过属性配置控件,包括指定是否在代码中生成成员等。表3.2描述了BindingSource控件中其他几个可能要修改的属性,它们都是可选的。表3.2 程序员可能要修改的BindingSource控件属性 属性描述AllowNewBindingSource控件是否允许数据绑定控件添加新项Filter一个过滤器表达式,指定数据绑定控件可使用哪些项。它并不影响存储在底层数据源中的数据,这不同于本章前面介绍过的过滤器查询Sort一系列用逗号分隔的要根据它们进行排序的列,使用SQL格式,使得必要时可包含关键字ASC或DESCName控件的名称GenerateMember是否在窗体类定义中生成字段来引用BindingSourcModifiers如果添加了字段,该字段使用什么访问修饰符配置好BindingSource控件后,可用于将数据绑定到其他控件。也可以在配置其他控件时配置BindingSource控件;前面提到过,向导可以完成这项任务。3.2.2 绑定到列表控件有两种Windows窗体控件支持数据绑定:ListBox和ComboBox。第2章使用了ListBox来执行简单绑定。这两个控件都可以使用数据源中的两列来创建列表,一列用于显示文本项,另一列用于显示文本项的值。也可以将同一列用于这两种用途。ListView控件更复杂读者可能会问,为什么ListView控件不支持数据绑定?毕竟它也是一个显示列表的控件。ListView控件是一种更复杂的列表创建方法,它可以显示更复杂的内容,而不仅仅是字符表;它有很多选项。因此,不能使用向导将数据绑定到ListView控件。这并不是说不能使用这种控件来显示数据库中的数据,只是必须使用其他方法:编写自定义代码来管理ListView控件的数据绑定。很多人编写继承这个类的控件,并添加自定义的数据绑定逻辑来实现所需的行为。在ListBox控件和ComboBox控件中,有3个与数据绑定相关的重要属性。 DataSource:指向数据源的对象引用; DisplayMember:一个列的字符串名,将从该列提取字符串以显示在列表中; ValueMember:一个列的字符串名,将从该列提取列表项的值数据。对于这两个控件,可在属性窗口中或窗体的隐藏代码中手工设置其属性;也可以使用控件的任务窗口来设置。第2章使用了后一种方法,将数据绑定到一个ListBox控件。图3.20显示了ListBox任务窗口,其中的“使用数据绑定项”选项被选中。图3.20 使用任务窗口将数据绑定到ListBox注意,这里有第4个选项“选定值”。使用它可以将当前选定的值绑定到数据。这通常用于列表需要根据窗体其他地方显示的数据进行更新,并能够绑定到可能由其他数据控件使用的其他数据集实例的情形。就当前而言,读者最好将注意力放在其他3个属性上。要将数据绑定到ListBox或ComboBox,首先要选择数据源。如果已经创建了BindingSource控件,只需选择该控件暴露的表。也可以选择类型化数据集中的表,这将自动检测所有需要的对象:数据集实例、BindingSource实例和表适配器实例。与添加BindingSource控件一样,也将自动在窗体的Load事件处理程序中添加一些代码,用于填充类型化数据集。数据加载后,ListBox或ComboBox将自动绑定到数据。然而,除非设置了显示和值成员,否则将看不到什么有趣的东西;看到的结果将是一个列表,它是将数据绑定到列表时调用ToString()的默认实现获得的:绑定到类型化数据集的数据时,将是System.Data.DataRowView对象组成的一个列表。这将使ListBox包含多项(每项对应绑定的数据中的一行),这些项都读取System.Data.DataRowView。每项都正确地表示底层数据表中的一行,然而,如果根据行显示数据将更友好,这样就可以区分出哪些数据来自哪行。3.2.3 绑定到DataGridView控件将数据绑定到DataGridView控件时,不需要什么工作就可获得很多功能。这些功能包括允许用户编辑数据、对数据进行排序、调整列的大小和顺序等。只要设置相关的属性就可以实现这些功能。与前一节介绍的列表控件一样,可以使用属性来配置DataGridView的数据绑定,属性可用多种方法来设置,包括使用“DataGridView任务”窗口,如图3.21所示。图3.21 “DataGridView任务”窗口使用下拉列表“选择数据源”来绑定到表数据源时,将创建一个数据集实例、一个BindingSource实例和一个表适配器实例。然而,这里配置了数据绑定控件的更多方面。例如,不必选择用作列表项的显示文本和值的列,而将显示表中定义的所有列(如果不需要这么多列,以后可以修改)。只要选择数据源,就可以获得用户可与之交互的界面。如果使用图3.21所示的默认选项,还可以让用户能够编辑数据集的内容(然而,如果不对应用程序做进一步修改,用作所做的编辑将不会提交给数据库)。DataGridView控件最重要的功能之一是修改显示的列,包括列的类型。单击“DataGridView任务”窗口中的“编辑列”链接,可以访问DataGridView中的列集合,这将打开“编辑列”窗口,如图3.22所示。图3.22 DataGridView的列编辑器“编辑列”窗口分为两个主要部分。左边是当前被显示的所有列,每列都显示了其类型和名称。在图3.22所示中,左边列出了6个文本列,其中StoryId列被选中(从左边列表中的图标及右边加亮显示的ColumnType属性都可以看出来)。右边是与选定列相关的属性。选定列的类型不同,显示的属性也不同,但其中有很多属性适用于所有类型的列。不是每列都必须绑定到数据源中的列,同样,也不是数据源的每列都必须绑定到DataGridView中的列。列的类型有下列几种。 DataGridViewTextBoxColumn:文本框,主要用于显示简单文本属性的,也可用于其他类型(尤其是数值类型)。 DataGridViewCheckBoxColumn:复选框,主要用于类型为布尔值(bit)的列值。 DataGridViewComboBoxColumn:下拉列表框,允许从一系列列表项中选择。可以将可用项列表绑定到另一个数据源,这使它非常适用于一对多关系的“多”端。 DataGridViewButtonColumn:按钮,它并不常用于绑定数据,但它可用于布尔数据或调用包含较长文本数据的对话框。较常见的一种用法是,对行执行某种操作,如确认对数据库的修改。 DataGridViewLinkColumn:与DataGridViewButtonColumn类似,但显示为LinkButton。常用于查看长文本字段的值,也可以用于在浏览器窗口中打开URL等。 DataGridViewImageColumn:图像显示,在数据库包含二进制格式的图像数据时使用。在稍后的练习中,将查看文本数据以及将其他数据绑定到组合框。现在先看一下下表,它描述了编辑DataGridView中的列时可使用的一些属性,尤其是适用于所有列类型的属性。表3.3 编辑DataGridView中的列时可使用的一些属性 属性描述DefaultCellStyle与样式相关的属性集合,可用于控制列中单元格的外观。例如,可以设置单元格的前景颜色和背景颜色HeaderText显示在列标题中的文本。这些文本不一定要与数据库中的列名相同;通常使用对用户更友好的文本ContextMenuStrip如果使用了上下文菜单,该属性可用于将列同菜单相关联ReadOnly列是否可编辑Resizable用户是否可以调整列的大小SortModeAutomatic(根据底层列名和类型排序)、Programmatic(编写代码来根据该列排序)或NotSortable(用户不能根据该列进行排序)AutoSizeMode列如何自动调整大小。有几种选择,可以根据列的值、列标题文本、可见单元格的值等自动调整大小Frozen用户滚动屏幕时,是否移动列。将该属性设置为true,可以锁定重要的列,如ID值,使这些列总是可见,而不管用户如何滚动下面的练习将显示大型文本字段。1显示长文本当列中包含大量文本时(例如,在SQL Server中,使用可以包含较多字符的text数据类型或varchar时),在DataGridView的单个文本框中显示这些文本通常并不是很有用。一种流行的做法是提供一个链接,当用户单击该链接时,在弹出的对话框中显示这些文本。下面是实现这种功能的步骤。(1)使用前一个练习介绍的步骤,将项目C:BegVC#DatabasesChapter03Ex0302 Manual Configuration复制为新的项目C:BegVC#DatabasesChapter03Ex0303 Large Text。(2)在设计视图中打开Form1。(3)添加一个DataGridView控件到Form1中。(4)在“DataGridView任务”窗口中,选择“在父容器中停靠”。(5)在“DataGridView任务”窗口中,从下拉列表“数据源”中,选择“其他数据源”“项目数据源”“FolktaleDBDataSet2”,然后单击“Story”。(6)调整Form1的大小,使得不用水平滚动滚动条就能显示窗体中的所有列。(7)在“DataGridView任务”窗口中,禁用添加、编辑和删除,然后单击“编辑列”。(8)修改Summary列的类型,将ColumnType属性改为DataGridViewLinkButton。(9)将Summary列的Text属性设置为Show,并将UseColumnTypeForLinkValue设置为true。单击“确定”关闭“编辑列”对话框。(10)在DataGridView控件上双击,为DataGridView.CellConnectClick添加一个事件处理程序。(11)按如下修改该事件处理程序的代码:private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)if (dataGridView1.CurrentCell.OwningColumn.DataPropertyName =Summary) string summaryText = (dataGridView1.CurrentRow.DataBoundItem as DataRowView).Row as FolkDBDataSet2.StoryRow).Summary; MessageBox.Show(summaryText, Story Summary, MessageBoxButtons.OK);(12)运行程序,然后单击某行的“Show”,结果应如图3.23所示。(13)关闭程序和Visual C#速成版。2解释在这个示例中,读者完成了两项任务。首先,将控件绑定到在前一个练习创建的数据源中的一个表。其次,对数据绑定进行定制,以便在弹出对话框中显示表Story的Summary字段(长文本字段)。图3.23 长文本视图这种定制要求对列进行一些操作以及编写一些定制代码(但不至于多到不能在本章中介绍)。有必要更详细地介绍这些代码,因为它演示了DataGridView的一些很有用的属性。用户单击某个单元格时,将执行事件处理程序。代码首先检查用户单击的列:if (dataGridView1.CurrentCell.OwningColumn.DataPropertyName = Summary)DataGridView.CurrentCell用于获得用户单击的单元格。也可以使用事件参数对象来获悉,但DataGridViewCellEventArgs类只暴露了单元格的索引。在这种情况下,要确保正确地获得列,不应使用索引,以防列已经被删除、改变了顺序等。获得当前单击的单元格后,使用属性CurrentCell.OwningColumn.DataProperty检查它是否引用了数据库中的Summary列。确定用户单击了“Show”链接后,就可以提取并显示列值,如下所示: string summaryText = (dataGridView1.CurrentRow.DataBoundItem as DataRowView).Row as FolkDBDataSet2.StoryRow).Summary; MessageBox.Show(summaryText, Story Summary, MessageBoxButtons.OK);第一行代码获得summaryText,这里需要解释一下:(1)DataGridView.CurrentRow属性暴露DataGridView的当前行,即包含用户单击的单元格的行。该属性是一个DataGridViewRow对象。(2)以这种方式获得的DataGridViewRow对象包含一个DataBoundItem属性,它暴露绑定到DataGridView的底层数据,负责当前行显示的数据。这个属性是object类型,因为没有限制DataGridView必须绑定到数据库。然而,绑定到数据集时,该属性实际上是一个DataGridView对象,因此可以将它强制转换为这种类型。(3)DataGridView类有一个Row属性,用于访问数据集中的数据行。该属性的类型是DataRow,由于使用的类型化数据集定义可以知道实际的行类型,因此可以将它强制转换为适当的类型。这里的类型是FolkDBDataSet2.StoryRow。(4)通过类型化数据集的行FolkDBDataSet2.StoryRow,可以使用属性Summary获得Summary列的值。为保持DataGridView的灵活性,必须采用这种方式。例如,如果采用较简单的方式,将不能把DataGridView绑定到其他数据源。与.NET中的所有东西一样,如果这是个问题,可创建继承DataGridView的类,并提供必要的功能使这些更容易实现,但这种复杂性可能是不必要的。无论如何,所有这些步骤旨在获得所需的长文本值,并将它显示给用户。在下一个练习中,将把一个外键列绑定到相关数据表,以更具可读性的方式显示文本。3将ComboBox绑定到父数据在这个练习中,将使用组合框,使编辑列更容易(这并不是本章讨论的主题)。下面是如何实现的步骤:(1)将项目C:BegVC#DatabasesChapter03Ex0303 Large Text复制为新项目C:BegV C#DatabasesChapter03Ex0304 Parent Binding。(2)在设计视图中打开Form1。(3)在dataGridView1的“DataGridView任务”窗口中,单击“编辑列”。(4)将ClassificationId列的类型改为DataGridViewComboButton。(5)按表3.4设置ClassificationId列的属性。表3.4 设置ClassificationId列的属性 属性值HeaderTextClassificationDisplayStyle(无)DataSource数据集FolkDBDataSet2中的Classification表(选择“其他数据源”“项目数据源”“FolkDBDataSet2”)DisplayMemberClassificationValueMemberClassification(6)单击“确定”退出“编辑列”对话框。(7)运行程序,确定显示的是人类可读的分类信息,如图3.24所示。图3.24 父绑定的显示结果(8)关闭程序与Visual C#速成版。4解释通过简单地调整一个原本显示Story表中ClassificationId列的列定义,使其显示了Classification表的数据。当然,也可以通过视图或其他方法来实现这一点,但这里使用这种方法有一个主要优点,那就是可以获得一个组合框。在这个练习中,组合框被禁用,但可以启用它以便编辑数据。为此,只要将该列的DisplayStyle属性设置为其他值:DropDownButton或ComboBox。通过为父项列表添加一个数据源(该列表的内容和显示的主要内容来自同一个类型化数据集),无需再创建数据集的实例。Visual C# Express只是添加一个新的绑定源和一个新的表适配器,以便从Classification表中获取数据,并将其存储到已有的成员变量folkDbDataSet2中。为确保正确运行,还需要设置另外两个属性: DisplayMember:指定父表中要显示的列; ValueMember:父表中链接到外键值的列,以决定要显示的数据来自父表中的哪行。这通常是父表的主键,就像这个例子中那样。在这个练习中,很容易确定这些属性,因为除ID列外只用到一列Classification列。在其他情况下,这些属性可能没有这么容易确定,例如,显示Source表的两列时。在这种情况下,可以包含更多的列来提供更多信息,并将它们绑定到外键表的同一列。编辑数据也如此:修改一列的值将自动修改其他列的值,因为它们通过外键值链接起来。也可以用另一个DataGridView控件来显示相关数据,这将在本书后面介绍。3.2.4 BindingNavigator控件BindingNavigator控件是从ToolStrip派生而来的,让用户能够标准界面在数据中导航。本质上,它是一个ToolStrip控件,包含一些有用的按钮和指向数据源的链接。图3.25显示了Binding Navigator控件。使用BindingNavigator控件,可以在行间移动:每次移动一行;直接跳到数据集的第一行或最后一行;通过输入数字跳到指定的行。还有一些按钮用于在数据集中添加(+)、删除(x)行(对只读数据,可以禁用或删除这些按钮)。要使用BindingNavigator控件在数据集中导航,只需将其BindingSource属性设置为BindingSource类的一个实例。例如,可将其设置为被绑定到已有控件(如DataGridView)的BindingSource对象。在这种情况下(BindingSource同时绑定到数据绑定控件和BindingNavigator控件),BindingNavigator控件将让用户能够在数据绑定控件中导航记录。如果读者认为这听起来好得令人无法相信,很可能过去花了很多时间编写代码来实现这样的功能。现在不必这么做了。1使用BindingNavigator控件演示BindingNavigator控件的最好方法是通过示例,因此请执行下列步骤:(1)将项目C:BegVC#DatabasesChapter03Ex0304 Parent Binding复制为新项目C:BegVC#DatabasesChapter03Ex0305 BindingNavigatorg。(2)在设计视图中打开Form1。(3)添加一个BindingNavigator控件到窗体中。(4)在“BindingNavigator任务”窗口中,选择下列选项: 嵌入ToolStripContainer中; 停靠填充在窗体中(Dock Fill in Form); 重新设置控件的父控件(Re-parent Controls); 编辑项。(5)在“项集合编辑器”对话框中,找到“BindingSource”属性,通过下拉列表将该属性设置为storyBindingSource。(6)单击“确定”退出“项集合编辑器”对话框。(7)删除编辑和删除行的按钮,并删除这些行左边的按钮分隔符。要删除按钮或分隔符,先单击然后再按Delete键。(8)运行程序,确认导航控件能够正常工作,当选择数据网格时,控件能够自动更新当前的位置,如图3.26所示。图3.26 使用BindingNavigator控件(9)关闭程序与Visual C#速成版。2解释这个练习的大部分工作都与在窗体中的定位BindingNavigator,以免遮盖显示的数据有关。传统上,在Windows窗体程序中实现这种功能需要很高的技巧,但Visual C#提供的自动化任务使得这项工作容易得多。只要按顺序单击一些任务,将自动创建布局,且是比较美观的布局。将导航器绑定到数据需要做的工作实际很少,虽然这主要是由于已经有绑定到BindingSource的DataGridView。通过在BindingNavigator中也使用该BindingSource,就能将所有的对象都集成在一起,并能够正常运行。在这个例子中,所做的其他工作是删除用于添加和删除行的按钮,这是因为本章的重点是数据显示。3.2.5 一步添加可导航的DataGridView在完成上一节后,现在要说的是,实际上这些步骤都可以跳过,可以一步添加DataGridView和BindingNavigator的组合。为此,首先必须有一个已配置好的数据源,通过向导很容易配置。有了数据源后,就可以在“数据源”窗口中将数据源层次结构展开到表级,这时选择表时,将出现一个包含很多选项的下拉列表。这些选项是各种可用于自动将数据添加到窗体中的技术,包括本章已介绍过的三种和下面将介绍的一种(“详细信息”)。图3.27显示了如何选择DataGridView选项。表名左边的图标显示了当前为该表选中的选项。在图3.27中,所有表都选择了DataGridView选项。选择DataGridView后,将表拖放到窗体中,这将自动生成一个DataGridView控件和一个BindingNavigator控件,以及所需的类型化数据集实例(如folkDBDataSet2)、Binding Source和表适配器。当然,这能够节省时间,可能也比以后再添加Binding Navigator更合理。然而,仍需要设置控件的布局和格式化,包括前面讨论过的修改列。这也就是为什么要用这种技术的原因可以使用更多的技术,而不会陷入这种技术带来的复杂性中。3.2.6 绑定到详细视图(Detail Views)上面的讨论涉及到了详细视图。在这里,详细视图指的是以更直接的方式显示一行数据,而不显示表中的其他数据。数据不是显示在DataGridView的一行中,详细视图通常由众多控件组成,如文本框。这样可以更好地控制要显示什么,使显示的数据更具可读性。例如,可以使用多行文本框来显示长文本数据,而不是在一个DataGridView单元格中显示或像本章前面那样在弹出对话框中显示。如果愿意,可以采用自底向上的方法来设计详细视图:添加相关的控件到窗体中,将它们绑定到数据源列,然后添加一个用于在行数据间导航的BindingNavigator。然而,让Visual C#完成所有这些繁琐的工作将容易得多,也快得多。与前一小节中添加可导航的DataGridView一样,可通过“数据源”窗口完成这些工作。要通过“数据源”窗口添加详细视图,需要做两项准备工作。首先,在表的下拉列表中选择“详细信息”;其次,确保表中要添加的列与要添加到窗体中的控件相关联。为此,在“数据源”窗口中展开表,单击每列并通过出现的下拉列表进行修改,如图3.28所示。列的数据类型不同,可绑定到该列的控件也不同。通过在下拉列表中选择“自定义”(见图3.28),可对控件进行定制,甚至提供自己的控件。选择要绑定到的控件类型后,将表拖放到窗体中。图3.29显示了得到的结果(使用图3.28所示的控件)。 图3.28 自定义详细视图 图3.29 添加详细视图与自动生成的DataGridView控件一样,还需要进行一些配置,如调整生成的控件的大小和位置等。然而,即使在配置前,应用程序也是可以运行的,通过该应用程序可以在数据库中导航和浏览其中的数据。自动生成的BindingNavigator控件多了一个按钮:Save Data按钮。使用这个按钮可以将对数据集的修改存储到数据库中;下一章将更详细地介绍这一点。1绑定到详细视图(1)将项目C:BegVC#DatabasesChapter03Ex0302 Manual Binding复制为新项目C:BegVC#DatabasesChapter03Ex0306 Detail Binding。(2)在设计视图中打开Form1。(3)在“数据源”窗口中,展开FolktaleDBDataSet和Character。(4)在表Character的下拉列表中选择合适的选项,以便能够使用它来添加详细视图。(5)按表3.5配置表Character中的列。(6)将表Character从“数据源”窗口拖放到窗体中。(7)调整字段的位置和大小,使布局美观些。另外,必须将Notes列绑定到的TextBox控件的MultiLine属性设置为True。表3.5 配置表Character中的列 列要添加的控件列要添加的控件CharaterIdLabelEmailTextBoxSpeciesId无OccupaionTextBoxNameTextBoxAgeTextBoxGenderTextBoxMotherId无NoesTextBoxFatherId无(8)运行程序。结果如图3.30所示。图3.30 父绑定的显示结果(9)关闭程序与Visual C#速成版。2解释在这个例子中,创建了一个界面,用于查看和导航示例数据库中Character表的行。使用“数据源”窗口自动创建了一个详细视图(同时创建了一个BindingNavigator控件),并对生成的控件进行部分格式化。在这个例子采用的方式中,有两点需要注意。首先,Age列显示在TextBox控件中,而不是读者可能期望的NumbericUpDown控件中。这是因为Age列允许为空,以便处理像神这样永恒人物。如果使用NumbericUpDown控件,空值将对显示的值没有影响。也就是说,看到的是上一行的Age列值,因此显示的值是过期的。使用自定义代码可以解决这种问题,然而,为简单起见,这个例子没有使用NumbericUpDown控件,以避免这个问题。其次,省略了相关的数据。其中部分原因是为简单起见,部分原因是当前版本的Visual C#不能很好地处理具有层次结构的数据。表Character包含这种数据,因为每行有两个外键,它们指向同一个表中的父记录:关联到人物的父亲和母亲。要正确地将字段绑定到这些数据,必须实现自定义的绑定方案。不幸的是,在Visual C#速成版提供的自动数据绑定中还不能实现这种层次关系。3.2.7 过滤数据通过对表适配器应用额外的查询,可过滤显示的数据。本章前面介绍了如何添加这样的查询,然而

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论