DataGrid 控件概述(Windows 窗体)
更新:2007 年 11 月
说明: |
---|
DataGridView 控件替换了 DataGrid 控件并添加了功能;但是也可选择保留 DataGrid 控件以备向后兼容和将来使用。有关更多信息,请参见 Windows 窗体 DataGridView 控件和 DataGrid 控件之间的区别。 |
Windows 窗体 DataGrid 控件在一系列行和列中显示数据。最简单的情况就是当网格绑定到只有一个表(不包含关系)的数据源时。在这种情况下,数据在简单行和列中的显示方式与在电子表格中相同。有关将数据绑定到其他控件的更多信息,请参见 数据绑定和 Windows 窗体。
如果将 DataGrid 绑定到具有多个相关表的数据,并且在网格上启用了导航功能,则该网格将在每行中都显示展开器。使用展开器,用户可以从父表移动到子表。单击某个节点可显示子表,而单击“后退”按钮可显示原始父表。网格通过这种方式显示各表间的层级关系。
下面的屏幕快照显示了绑定到多个表中的数据的 DataGrid。
绑定到具有多个表的数据的 DataGrid
DataGrid 可以为数据集提供用户界面、相关表之间的导航以及丰富的格式设置和编辑功能。
数据的显示和操作是两种不同的功能:用户界面由控件处理,而数据更新则由 Windows 窗体数据绑定结构和 .NET Framework 数据提供程序处理。因此,绑定到同一个数据源的多个控件将保持同步。
Visual Basic 说明: |
---|
如果您熟悉 Visual Basic 6.0 中的 DataGrid 控件,就会发现 Windows 窗体 DataGrid 控件中存在的一些显著差异。使用 Visual Studio 创建数据应用程序 |
将网格绑定到 DataSet 时,会自动创建列和行,并对其进行格式设置和填充。有关更多信息,请参见数据绑定和 Windows 窗体。生成 DataGrid 控件后,您就可以根据自己的需要添加、删除、重排列和行,还可以对列和行的格式进行设置。
将数据绑定到控件
为使 DataGrid 控件正常工作,应该在设计时使用 DataSource 和 DataMember 属性,或在运行时使用 SetDataBinding 方法,将该控件绑定到数据源。此绑定可以使 DataGrid 指向实例化的数据源对象,如 DataSet 或 DataTable。DataGrid 控件显示对数据执行的操作的结果。大部分数据特定的操作都是通过数据源而不是 DataGrid 来执行的。
如果通过任何机制更新绑定数据集内的数据,则 DataGrid 控件会反映所做的更改。如果数据网格及其表样式和列样式的 ReadOnly 属性设置为 false,则该数据集内的数据可以通过 DataGrid 控件进行更新。
在 DataGrid 中,一次只能显示一个表。如果在表之间定义了父子关系,则用户可以在相关表之间移动,以选择要在 DataGrid 控件中显示的表。有关在设计或运行时将 DataGrid 控件绑定到 ADO.NET 数据源的信息,请参见 如何:将 Windows 窗体 DataGrid 控件绑定到数据源。
对于 DataGrid,有效的数据源包括:
如果源是数据集,则该数据集可能是窗体中的一个对象或者是由 XML Web services 传递给窗体的对象。可以绑定到类型化或非类型化数据集。
如果结构中的对象(例如数组中的元素)公开公共属性,则也可以将 DataGrid 控件绑定到其他结构。网格将显示结构中元素的所有公共属性。例如,如果将 DataGrid 控件绑定到一个客户对象数组,则网格将显示这些客户对象的所有公共属性。在某些情况下,这意味着虽然可以绑定到结构,但最终的绑定结构可能没有实际用处。例如,可以绑定到一个整数数组,但是因为 Integer 数据类型不支持公共属性,所以该网格无法显示任何数据。
如果下列结构的元素公开公共属性,则可以绑定到这些结构:
实现 IList 接口的任何组件。这包括一维数组。
实现 IListSource 接口的任何组件。
实现 IBindingList 接口的任何组件。
有关可能的数据源的更多信息,请参见 Windows 窗体支持的数据源。
网格显示
DataGrid 控件的常见用途是显示数据集中的单个数据表。但是,该控件也可用来显示多个表,包括一些相关表。网格的显示内容会根据数据源自动进行调整。下表显示在各种配置下显示的内容。
数据集的内容 |
显示的内容 |
---|---|
单个表。 |
表显示在一个网格中。 |
多个表。 |
网格可显示一个树视图,用户可通过浏览该树视图找到他们想要显示的表。 |
多个相关表。 |
网格显示一个树视图,您可以使用该树视图选择表,或者可以指定让网格显示父表。父表中的记录使用户可以定位到相关的子行。 |
说明: |
---|
数据集中的各个表是使用 DataRelation 相关联的。数据集中的关系 |
如果 DataGrid 控件显示的是一个表,并且将 AllowSorting 属性设置为 true,则可以通过单击列标头对数据进行重新排序。用户还可以添加行并编辑单元格。
一组表之间的关系使用具有导航功能的父/子结构进行显示。父表是数据的最高级别,而子表是从父表的各个列表派生的数据表。展开器显示在包含子表的每个父行中。单击展开器会生成一个类似 Web 链接的列表,这些链接指向各个子表。用户选择某个链接后,将显示相应的子表。单击“显示/隐藏父行”图标 () 将隐藏有关父表的信息或重新显示该信息(如果以前已经隐藏)。用户可以单击“后退”按钮返回到以前查看的表。
列和行
DataGrid 由 DataGridTableStyle 对象的集合组成,这些对象包含在 DataGrid 控件的 TableStyles 属性中。表样式可能包含 DataGridColumnStyle 对象的集合,这些对象包含在 DataGridTableStyle 的 GridColumnStyles 属性中。使用通过“属性”窗口访问的集合编辑器,可以编辑 TableStyles 和 GridColumnStyles 属性。
与 DataGrid 控件关联的所有 DataGridTableStyle 都可以通过 GridTableStylesCollection 进行访问。GridTableStylesCollection 可以在设计器中使用 DataGridTableStyle 集合编辑器进行编辑,也可以通过 DataGrid 控件的 TableStyles 属性以编程方式进行编辑。
下图显示了包含在 DataGrid 控件中的对象。
通过将表样式和列样式的 MappingName 属性设置为相应的 TableName 和 ColumnName 属性,可使它们与 DataTable 对象和 DataColumn 对象保持同步。向绑定到有效数据源的 DataGrid 控件添加没有列样式的 DataGridTableStyle,并将该表样式的 MappingName 属性设置为有效的 TableName 属性时,将会为该表样式创建 DataGridColumnStyle 对象的集合。对于 DataTable 的 Columns 集合中的每个 DataColumn,均会将对应的 DataGridColumnStyle 添加到 GridColumnStylesCollection。GridColumnStylesCollection 可通过 DataGridTableStyle 的 GridColumnStyles 属性进行访问。通过对 GridColumnStylesCollection 使用 Add 或 Remove 方法,可以在网格中添加或删除列。有关更多信息,请参见 如何:向 Windows 窗体 DataGrid 控件添加表和列 和 如何:在 Windows 窗体 DataGrid 控件中删除或隐藏列。
列类型集合扩展了 DataGridColumnStyle 类,使其具有丰富的格式设置和编辑功能。所有列类型都继承自 DataGridColumnStyle 基类。创建的类取决于 DataGridColumn 所基于的 DataColumn 的 DataType 属性。例如,通过将 DataColumn 的 DataType 属性设置为 Boolean,可将其与 DataGridBoolColumn 相关联。下表对这些列类型逐一进行说明。
列类型 |
说明 |
---|---|
将数据作为格式化或未格式化的字符串接受并显示。编辑功能与在简单的 TextBox 中用于数据编辑的功能相同。继承自 DataGridColumnStyle。 |
|
接受并显示 true、false 和 null 值。继承自 DataGridColumnStyle。 |
双击列的右边缘可以调整列大小,从而显示其完整标题和最宽的项。
表样式和列样式
建立 DataGrid 控件的默认格式后,即可自定义在数据网格内显示某些表时使用的颜色。
这一点是通过创建 DataGridTableStyle 类的实例来实现的。表样式指定了特定表的格式设置,该设置与 DataGrid 控件本身的默认格式设置不同。每个表一次只能定义一个表样式。
有时,您会需要让特定数据表中某一特定列的外观不同于其余列。可以使用 GridColumnStyles 属性创建一组自定义列样式。
列样式与数据集中的列相关,如同表样式与数据表相关一样。就像一次只能为每个表定义一种表样式一样,在特定的表样式中只能为每个列定义一种列样式。这种关系是在列的 MappingName 属性中定义的。
如果已经创建表样式,但未向其中添加列样式,则 Visual Studio 将在运行时创建窗体和网格时添加默认列样式。但是,如果已经创建了表样式并将向其添加了任何列样式,Visual Studio 将不会创建任何列样式。此外,您需要定义列样式并为它们分配映射名称,以使所需的列出现在网格中。
因为您通过为列分配一个列样式来指定在数据网格中包含哪些列,而以前没有为列分配列样式,所以您可以将没有显示在网格中的数据列包含在数据集中。但是,由于数据列包含在数据集中,因此可以通过编程方式编辑未显示的数据。
说明: |
---|
一般情况下,应该先创建列样式,并将该列样式添加到列样式集合中,然后再将表样式添加到表样式集合中。向集合中添加空白表样式时,将会为您自动生成列样式。因此,如果试图将具有重复 MappingName 值的新的列样式添加到列样式集合中,将会引发异常。 有时,您只需要调整许多列中的一列(例如,数据集包含 50 列,而您只需要其中的 49 列)。在这种情况下,与以编程方式逐个添加所需的 49 列相比,导入所有 50 列并以编程方式移除一列较为轻松。 |
格式设置
可应用于 DataGrid 控件的格式设置包括边框样式、网格线样式、字体、标题属性、数据对齐和行间的交替背景色。有关更多信息,请参见 如何:设置 Windows 窗体 DataGrid 控件的格式。
事件
除了诸如 MouseDown、Enter 和 Scroll 之类的常见控件事件外,DataGrid 控件还支持与在网格内进行编辑和导航关联的事件。CurrentCell 属性确定选择哪一个单元格。在用户定位到新单元格时,会引发 CurrentCellChanged 事件。在用户通过父/子关系定位到新表时,会引发 Navigate 事件。用户在查看子表时单击“后退”按钮会引发 BackButtonClick 事件,而单击“显示/隐藏父行”图标时会引发 ShowParentDetailsButtonClick 事件。
请参见
任务
如何:将 Windows 窗体 DataGrid 控件绑定到数据源
如何:向 Windows 窗体 DataGrid 控件添加表和列
如何:在 Windows 窗体 DataGrid 控件中删除或隐藏列
如何:设置 Windows 窗体 DataGrid 控件的格式