




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.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.StoryTableAdapterstoryTableAdapter;另外,在 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 控件属性属性 描述AllowNew BindingSource 控件是否允许数据绑定控件添加新项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 用户是否可以调整列的大小SortMode Automatic(根据底层列名和类型排序)、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).Rowas 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).Rowas 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 列的属性属性 值HeaderText ClassificationDisplayStyle (无)DataSource 数据集 FolkDBDataSet2 中的 Classification 表(选择“其他数据源”“项目数据源”“FolkDBDataSet2”)DisplayMember ClassificationValueMember Classification(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 中的列列 要添加的控件 列 要添加的控件CharaterId Label Email TextBoxSpeciesId 无 Occupaion TextBoxName TextBox Age TextBoxGender TextBox MotherId 无Noes TextBox FatherId 无(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过滤数据(1)将项目 C:BegVC#DatabasesChapter03Ex0306 Detail Binding 复制为新项目C:BegVC#DatabasesChapter03Ex0307 Filtering。(2)在设计视图中打开 Form1。(3)将组成详细视图的控件稍微往下移,为添加一个工具栏腾出空间。(4)在窗体中任何数据绑定控件的“任务”窗口中选择“ 添加查询 ”。(5)在“查询条件生成器” 窗口中,添加一个新查询,将命名为 FillByGender,查询的文本如下(见图 3.31) ,然后单击“确定”。图 3.31 添加过滤器查询SELECT CharacterId, SpeciesId, MotherId, FatherId, Name, Gender, Notes, Email, Occupation, AgeFROM CharacterWHERE Gender = Gender(6)运行程序。在窗体顶端的“Gender” 文本框中输入性别(Female 或 Male) ,然后单击“FillByGender”对显示结果进行过滤,如图 3.32 所示。图 3.32 过滤结果(7)关闭程序与 Visual C#速成版。2解释在这个例子中,通过添加参数化查询对可以查看的数据进行过滤以及显示详细信息。通过包含查询,自动生成了: 为类型化数据集中 Character 表的表适配器生成的新查询; 调用参数化查询的方法,这是在类型化数据集的代码中定义的; 新工具栏; 新工具栏中用于配置和执行查询的标签、文本框和按钮的组合; 应用过滤器(单击工具栏中的按钮)时执行的代码。这很好,但有两个问题要处理。首先,工具栏中按钮的文本被设置为新查询的名称,这里为 FillB
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 60364-1:2025 EN Low-voltage electrical installations - Part 1: Fundamental principles,assessment of general characteristics,and definitions
- 【正版授权】 IEC 60072-2:2025 EN Dimensions and output series for rotating electrical machines - Part 2: Frame numbers 355 to 1 000 and flange numbers 1 180 to 2 360
- 基础力量瑜伽课件
- 冬奥志愿服务培训
- 仓储主管培训报告
- 读书分享交流课件
- 课件模板人物主题
- 网络医生技巧培训
- 线描画女孩课件
- 培训生毕业汇报
- 乡村医生法律法规知识
- 2025年广东省中考物理试题卷(含答案)
- 第一单元 写作《热爱写作学会观察》课件 学年统编版语文七年级上册
- 钙钛矿有机叠层太阳能电池界面工程与载流子传输机制
- 病媒生物防培训课件
- 2025秋人教版(2024)八年级上册地理 【教学课件】1.1.1 《疆域》
- 《生产运营管理》 课件 第15章-数字化转型背景下生产运营模式
- 净菜加工培训
- 中国肿瘤药物相关血小板减少诊疗专家共识(2023版)
- 皮带厂车间管理制度
- 2025年福建省中考英语试卷真题(含标准答案)
评论
0/150
提交评论