DataGrid 控件概述(Windows 窗体)

注释

DataGridView 控件替换并添加 DataGrid 控件的功能;但是,如果选择,则保留 DataGrid 控件以实现后向兼容性和将来使用。 有关详细信息,请参阅 Windows 窗体 DataGridView 控件与 DataGrid 控件之间的区别

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

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

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

显示绑定到多个表的数据的 DataGrid 的 WinForms 应用。

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

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

注释

如果你熟悉 Visual Basic 6.0 中的 DataGrid 控件,你将在 Windows 窗体 DataGrid 控件中找到一些显著差异。

当网格绑定到 DataSet时,将自动创建、格式化和填充列和行。 有关更多信息,请参见数据绑定和 Windows 窗体。 在生成 DataGrid 控件后,可以根据需求添加、删除、重新排列和设置列和行的格式。

将数据绑定到控件

若要使 DataGrid 控件正常工作,应在设计时使用 DataSourceDataMember 属性或运行时 SetDataBinding 方法绑定到数据源。 此绑定将 DataGrid 指向实例化的数据源对象,例如 DataSetDataTable)。 DataGrid 控件显示对数据执行的操作的结果。 大多数特定于数据的操作不通过 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 链接的列表。 当用户选择链接时,将显示子表。 单击“显示/隐藏父行”图标(显示/隐藏父行图标)将隐藏有关父表的信息,或者如果用户以前隐藏了父表,则会导致其重新出现。 用户可以单击后退按钮以返回到以前查看的表。

列和行

DataGridDataGridTableStyle 控件 DataGrid 属性中包含的 TableStyles 对象的集合组成。 表样式可能具有 DataGridColumnStyleGridColumnStyles 属性中包含的 DataGridTableStyle 对象集合。 可以使用通过 TableStyles 窗口访问的集合编辑器编辑 GridColumnStyles 属性。

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

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

显示 DataGrid 控件中包含的对象的示意图。

表样式和列样式通过将其 DataTable 属性设置为适当的 DataColumnMappingName 属性,与 TableName 对象和 ColumnName 对象同步。 如果将一个没有列样式的 DataGridTableStyle 添加到绑定了有效数据源的 DataGrid 控件,而该表样式的 MappingName 属性已设置为有效的 TableName 属性,则会创建一个 DataGridColumnStyle 对象的集合供该表样式使用。 每当在 DataColumnColumns 集合中找到一个 DataTable 时,相应的 DataGridColumnStyle 就会被添加到 GridColumnStylesCollection。 可通过 GridColumnStylesCollectionGridColumnStyles 属性访问 DataGridTableStyle。 可以使用 Add上的 RemoveGridColumnStylesCollection 方法在网格中添加或删除列。 有关详细信息,请参阅 如何:将表和列添加到 Windows 窗体 DataGrid 控件如何:删除或隐藏 Windows 窗体 DataGrid 控件中的列。

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

列名称 DESCRIPTION
DataGridTextBoxColumn 接受数据并将其显示为格式化字符串或未格式化字符串。 编辑功能与在简单的 TextBox 中编辑数据相同。 继承自 DataGridColumnStyle
DataGridBoolColumn 接受并显示 truefalse和 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 事件。

另请参阅