DataGrid 控件概述(Windows 窗体)

更新:2007 年 11 月

说明:

DataGridView 控件替换了 DataGrid 控件并添加了功能;但是也可选择保留 DataGrid 控件以备向后兼容和将来使用。有关更多信息,请参见 Windows 窗体 DataGridView 控件和 DataGrid 控件之间的区别

Windows 窗体 DataGrid 控件在一系列行和列中显示数据。最简单的情况就是当网格绑定到只有一个表(不包含关系)的数据源时。在这种情况下,数据在简单行和列中的显示方式与在电子表格中相同。有关将数据绑定到其他控件的更多信息,请参见 数据绑定和 Windows 窗体

如果将 DataGrid 绑定到具有多个相关表的数据,并且在网格上启用了导航功能,则该网格将在每行中都显示展开器。使用展开器,用户可以从父表移动到子表。单击某个节点可显示子表,而单击“后退”按钮可显示原始父表。网格通过这种方式显示各表间的层级关系。

下面的屏幕快照显示了绑定到多个表中的数据的 DataGrid。

绑定到具有多个表的数据的 DataGrid

绑定到多个表的数据的 DataGrid

DataGrid 可以为数据集提供用户界面、相关表之间的导航以及丰富的格式设置和编辑功能。

数据的显示和操作是两种不同的功能:用户界面由控件处理,而数据更新则由 Windows 窗体数据绑定结构和 .NET Framework 数据提供程序处理。因此,绑定到同一个数据源的多个控件将保持同步。

Visual Basic 说明:

如果您熟悉 Visual Basic 6.0 中的 DataGrid 控件,就会发现 Windows 窗体 DataGrid 控件中存在的一些显著差异。使用 Visual Studio 创建数据应用程序
适用于 Visual Basic 6.0 用户的 DataGrid 控件
使用 Visual Studio 创建数据应用程序
适用于 Visual Basic 6.0 用户的 DataGrid 控件

将网格绑定到 DataSet 时,会自动创建列和行,并对其进行格式设置和填充。有关更多信息,请参见数据绑定和 Windows 窗体。生成 DataGrid 控件后,您就可以根据自己的需要添加、删除、重排列和行,还可以对列和行的格式进行设置。

将数据绑定到控件

为使 DataGrid 控件正常工作,应该在设计时使用 DataSourceDataMember 属性,或在运行时使用 SetDataBinding 方法,将该控件绑定到数据源。此绑定可以使 DataGrid 指向实例化的数据源对象,如 DataSetDataTableDataGrid 控件显示对数据执行的操作的结果。大部分数据特定的操作都是通过数据源而不是 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 链接的列表,这些链接指向各个子表。用户选择某个链接后,将显示相应的子表。单击“显示/隐藏父行”图标 (显示/隐藏父行图标) 将隐藏有关父表的信息或重新显示该信息(如果以前已经隐藏)。用户可以单击“后退”按钮返回到以前查看的表。

列和行

DataGridDataGridTableStyle 对象的集合组成,这些对象包含在 DataGrid 控件的 TableStyles 属性中。表样式可能包含 DataGridColumnStyle 对象的集合,这些对象包含在 DataGridTableStyleGridColumnStyles 属性中。使用通过“属性”窗口访问的集合编辑器,可以编辑 TableStylesGridColumnStyles 属性。

DataGrid 控件关联的所有 DataGridTableStyle 都可以通过 GridTableStylesCollection 进行访问。GridTableStylesCollection 可以在设计器中使用 DataGridTableStyle 集合编辑器进行编辑,也可以通过 DataGrid 控件的 TableStyles 属性以编程方式进行编辑。

下图显示了包含在 DataGrid 控件中的对象。

DataGrid 控件中包含的对象

通过将表样式和列样式的 MappingName 属性设置为相应的 TableNameColumnName 属性,可使它们与 DataTable 对象和 DataColumn 对象保持同步。向绑定到有效数据源的 DataGrid 控件添加没有列样式的 DataGridTableStyle,并将该表样式的 MappingName 属性设置为有效的 TableName 属性时,将会为该表样式创建 DataGridColumnStyle 对象的集合。对于 DataTableColumns 集合中的每个 DataColumn,均会将对应的 DataGridColumnStyle 添加到 GridColumnStylesCollectionGridColumnStylesCollection 可通过 DataGridTableStyleGridColumnStyles 属性进行访问。通过对 GridColumnStylesCollection 使用 AddRemove 方法,可以在网格中添加或删除列。有关更多信息,请参见 如何:向 Windows 窗体 DataGrid 控件添加表和列如何:在 Windows 窗体 DataGrid 控件中删除或隐藏列

列类型集合扩展了 DataGridColumnStyle 类,使其具有丰富的格式设置和编辑功能。所有列类型都继承自 DataGridColumnStyle 基类。创建的类取决于 DataGridColumn 所基于的 DataColumnDataType 属性。例如,通过将 DataColumnDataType 属性设置为 Boolean,可将其与 DataGridBoolColumn 相关联。下表对这些列类型逐一进行说明。

列类型

说明

DataGridTextBoxColumn

将数据作为格式化或未格式化的字符串接受并显示。编辑功能与在简单的 TextBox 中用于数据编辑的功能相同。继承自 DataGridColumnStyle

DataGridBoolColumn

接受并显示 true、false 和 null 值。继承自 DataGridColumnStyle

双击列的右边缘可以调整列大小,从而显示其完整标题和最宽的项。

表样式和列样式

建立 DataGrid 控件的默认格式后,即可自定义在数据网格内显示某些表时使用的颜色。

这一点是通过创建 DataGridTableStyle 类的实例来实现的。表样式指定了特定表的格式设置,该设置与 DataGrid 控件本身的默认格式设置不同。每个表一次只能定义一个表样式。

有时,您会需要让特定数据表中某一特定列的外观不同于其余列。可以使用 GridColumnStyles 属性创建一组自定义列样式。

列样式与数据集中的列相关,如同表样式与数据表相关一样。就像一次只能为每个表定义一种表样式一样,在特定的表样式中只能为每个列定义一种列样式。这种关系是在列的 MappingName 属性中定义的。

如果已经创建表样式,但未向其中添加列样式,则 Visual Studio 将在运行时创建窗体和网格时添加默认列样式。但是,如果已经创建了表样式并将向其添加了任何列样式,Visual Studio 将不会创建任何列样式。此外,您需要定义列样式并为它们分配映射名称,以使所需的列出现在网格中。

因为您通过为列分配一个列样式来指定在数据网格中包含哪些列,而以前没有为列分配列样式,所以您可以将没有显示在网格中的数据列包含在数据集中。但是,由于数据列包含在数据集中,因此可以通过编程方式编辑未显示的数据。

说明:

一般情况下,应该先创建列样式,并将该列样式添加到列样式集合中,然后再将表样式添加到表样式集合中。向集合中添加空白表样式时,将会为您自动生成列样式。因此,如果试图将具有重复 MappingName 值的新的列样式添加到列样式集合中,将会引发异常。

有时,您只需要调整许多列中的一列(例如,数据集包含 50 列,而您只需要其中的 49 列)。在这种情况下,与以编程方式逐个添加所需的 49 列相比,导入所有 50 列并以编程方式移除一列较为轻松。

格式设置

可应用于 DataGrid 控件的格式设置包括边框样式、网格线样式、字体、标题属性、数据对齐和行间的交替背景色。有关更多信息,请参见 如何:设置 Windows 窗体 DataGrid 控件的格式

事件

除了诸如 MouseDownEnterScroll 之类的常见控件事件外,DataGrid 控件还支持与在网格内进行编辑和导航关联的事件。CurrentCell 属性确定选择哪一个单元格。在用户定位到新单元格时,会引发 CurrentCellChanged 事件。在用户通过父/子关系定位到新表时,会引发 Navigate 事件。用户在查看子表时单击“后退”按钮会引发 BackButtonClick 事件,而单击“显示/隐藏父行”图标时会引发 ShowParentDetailsButtonClick 事件。

请参见

任务

如何:将 Windows 窗体 DataGrid 控件绑定到数据源

如何:向 Windows 窗体 DataGrid 控件添加表和列

如何:在 Windows 窗体 DataGrid 控件中删除或隐藏列

如何:设置 Windows 窗体 DataGrid 控件的格式

其他资源

DataGrid 控件(Windows 窗体)