DataGrid 控件概述(Windows 窗体)

注意

DataGridView 控件取代了 DataGrid 控件并添加了功能;但是,可以选择保留 DataGrid 控件以实现向后兼容并供将来使用。 有关详细信息,请参阅 Windows 窗体 DataGridView 控件与 DataGrid 控件之间的区别

Windows 窗体 DataGrid 控件将数据显示在一些列行和列中。 最简单的情况是网格绑定到不包含任何关系的单个表的数据源。 在这种情况下,数据显示在简单的行和列中,如在电子表格中一样。 有关将数据绑定到其他控件的详细信息,请参阅数据绑定和 Windows 窗体

如果 DataGrid 绑定到多个相关表的数据,并在网格上启用了导航功能,则网格中的每行都将显示扩展器。 借助扩展器,用户可以从父表移到子表。 单击节点将显示子表,单击后退按钮将显示原始父表。 网格以这种方式显示表与表之间的层次结构关系。

下面的屏幕截图显示了绑定到多个表的数据的 DataGrid:

A WinForms app showing a DataGrid bound to data with multiple tables.

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

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

注意

如果你熟悉 Visual Basic 6.0 中的 DataGrid 控件,就会发现 Windows 窗体 DataGrid 控件中的一些重要差异。

当网格绑定到 DataSet 时,会自动创建列和行,同时对其格式进行设置并填充数据。 有关更多信息,请参见 Data Binding and Windows Forms。 生成 DataGrid 控件后,可根据需要对列和行进行添加、删除、重新排列以及设置格式。

将数据绑定到控件

若要使 DataGrid 控件起作用,应在设计时使用 DataSourceDataMember 属性或在运行时使用 SetDataBinding 方法将该控件绑定到数据源。 通过这种绑定,可以使 DataGrid 指向一个实例化的数据源对象,如 DataSetDataTableDataGrid 控件显示对数据执行操作所产生的结果。 大多数特定于数据的操作并不是通过 DataGrid 执行的,而是通过数据源执行。

如果绑定数据集中的数据通过任何机制进行了更新,那么 DataGrid 控件会反映这些变化。 如果数据网格及其表样式和列样式的 ReadOnly 属性设置为 false,则可以通过 DataGrid 控件更新数据集中的数据。

DataGrid 一次只能显示一张表。 如果在表与表之间定义了父-子关系,则用户可以在相关表之间移动以选择要显示在 DataGrid 控件中的表。 若要了解如何在设计或运行时将 DataGrid 控件绑定到 ADO.NET 数据源的信息,请参阅如何:将 Windows 窗体 DataGrid 控件绑定到数据源

DataGrid 的有效数据源包括:

如果源是一个数据集,那么该数据集可能是窗体中的某个对象或由 XML Web 服务传递到该窗体的某个对象。 可以绑定到类型化数据集,也可以绑定到非类型化数据集。

如果结构中的对象(例如数组中的元素)公开公共属性,则还可以将 DataGrid 控件绑定到其他结构。 网格将显示结构中该元素的所有公共属性。 例如,如果将 DataGrid 控件绑定到客户对象数组,那么网格将显示这些客户对象的所有公共属性。 某些情况下,这意味着尽管可以绑定到结构,但最终绑定的结构可能不具有实际应用程序。 例如,你可以绑定到整数数组,但由于 Integer 数据类型不支持公共属性,因此该网格不会显示任何数据。

如果其元素公开公共属性,则可以绑定到以下结构:

  • 实现 IList 接口的任意组件。 这包括单维数组。

  • 实现 IListSource 接口的任意组件。

  • 实现 IBindingList 接口的任意组件。

有关可能数据源的详细信息,请参阅 Windows 窗体支持的数据源

网格显示

DataGrid 控件的一个常见用途是显示数据集中的单个数据表。 但是,该控件还可以用于显示多个表,包括相关表。 网格的显示可根据数据源自动调整。 下表显示各种配置显示的内容。

数据集内容 显示内容
单个表。 表显示在网格中。
多个表。 网格可以显示树视图,用户可以通过浏览树视图找到希望显示的表。
多个相关表。 网格可以显示树视图以便选择表格,你也可指定网格显示父表。 通过父表中的记录,用户可导航到相关的子行。

注意

使用 DataRelation 使数据集中的表相关。 另请参阅创建数据集之间的关系

DataGrid 控件显示表并且 AllowSorting 属性设置为 true 时,可通过单击列标题对数据重新排序。 用户还可以添加行和编辑单元格。

通过使用父/子导航结构,向用户显示一组表之间的关系。 父表是最高级别的数据,子表是派生自父表中各个列表的数据表。 扩展器显示在包含子表的每个父行中。 单击扩展器将生成指向子表的类似 Web 链接的列表。 当用户选择某个链接时,将显示子表。 单击“显示/隐藏父行”图标 (Show/hide parent rows icon) 将隐藏父表的相关信息,如果用户之前已经执行过隐藏操作,则将重新显示父表相关信息。 用户可以单击后退按钮,返回到之前查看的表。

列和行

DataGridDataGrid 控件的 TableStyles 属性中包含的 DataGridTableStyle 对象集合组成。 表样式可能具有 DataGridTableStyleGridColumnStyles 属性中包含的 DataGridColumnStyle 对象集合。 可通过使用“属性”窗口中的集合编辑器编辑 TableStylesGridColumnStyles 属性

任何与 DataGrid 控件关的联 DataGridTableStyle 都可通过 GridTableStylesCollection 进行访问。 可利用 DataGridTableStyle 集合编辑器在设计器中编辑 GridTableStylesCollection,或以编程方式通过 DataGrid 控件的 TableStyles 属性进行编辑。

下图显示 DataGrid 控件中包含的对象:

Diagram that shows objects included in the DataGrid control.

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

列类型的集合可扩展具有丰富格式设置和编辑功能的 DataGridColumnStyle 类。 所有列类型都继承自 DataGridColumnStyle 基类。 创建的类取决于 DataGridColumn 基于的 DataColumnDataType 属性。 例如,DataType 属性设置为 BooleanDataColumn 将与 DataGridBoolColumn 关联。 下表描述了每种列类型。

列类型 说明
DataGridTextBoxColumn 接受并显示数据为格式化或非格式化的字符串。 编辑功能与在简单的 TextBox 中编辑数据相同。 继承自 DataGridColumnStyle
DataGridBoolColumn 接受并显示 truefalse 和 null 值。 继承自 DataGridColumnStyle

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

表样式和列样式

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

这可通过创建 DataGridTableStyle 类中的实例得以实现。 表样式指定了与 DataGrid 控件本身默认格式设置不同的特定表的格式设置。 每张表每次只能定义一种表样式。

有时,你会希望特定数据表中的特定列不同于表中的其他列。 你可以通过使用 GridColumnStyles 属性创建一组自定义的列样式。

列样式与数据集中列相关,同样,表样式也与数据表相关。 与每张表每次只能定义一种表样式相同,在特定的表样式中每列也只能定义一种列样式。 此关系在列的 MappingName 属性中定义。

如果已经创建了表样式,但未向其中添加列样式,则在运行时创建窗体和网格时,Visual Studio 将添加默认列样式。 然而,如果已经创建了表样式,并且向其中添加了列样式,那么 Visual Studio 将不会创建任何列样式。 此外,还需要定义列样式,并向它们分配映射名称以便在网格中显示你希望显示的列。

由于数据网格中包含的列是通过向它们分配列样式指定的,而尚未向列分配列样式,因此可包含网格中未显示的数据集中的数据列。 然而,由于数据列包含在数据集中,因此可采用编程方式来编辑未显示的数据。

注意

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

有时,你可能只希望微调众多列中的某一列,例如,数据集包含 50 列,而你只需要其中的 49 列。 在这种情况下,相对简单的办法是导入所有 50 列,然后以编程方式删除其中的一列,而不是以编程方式添加 49 个单独的列。

格式化

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

事件

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

另请参阅