Windows 窗体 DataGridView 控件中的大小调整选项

DataGridView 行、列和标题会因许多不同的事件而改变大小。 下表显示了这些事件。

出现次数 说明
用户调整大小 用户可以通过拖动或双击行、列或标题分隔条来调整大小。
控件调整大小 在列填充模式下,列宽随着控件宽度的变化而变化;例如,当控件停靠到父窗体并且用户调整窗体大小时。
单元格值变化 在基于内容的自动调整大小模式下,会根据新的显示值改变大小。
方法调用 借助基于内容的程序化调整大小,可以在调用方法时根据单元格值进行机会性大小调整。
属性设置 还可以设置特定的高度和宽度值。

默认情况下,系统会启用用户调整大小,禁用自动调整大小,并剪裁比其列更宽的单元格值。

下表显示了可用于调整默认行为或使用特定调整大小选项来实现特定效果的方案。

方案 实现
使用列填充模式在相对较少的列中显示大小相似的数据,这些列占据了控件的整个宽度,而不显示水平滚动条。 AutoSizeColumnsMode 属性设置为 Fill
对大小不一的显示值使用列填充模式。 AutoSizeColumnsMode 属性设置为 Fill。 通过设置列 FillWeight 属性或在用数据填充控件后调用控件 AutoResizeColumns 方法来初始化相对列宽。
对具有不同重要性的值使用列填充模式。 AutoSizeColumnsMode 属性设置为 Fill。 为必须始终显示部分数据的列设置较大的 MinimumWidth 值,或为特定列使用填充模式以外的调整大小选项。
使用列填充模式来避免显示控件背景。 将最后一列的 AutoSizeMode 属性设置为 Fill,并对其他列使用其他调整大小选项。 如果其他列使用太多可用空间,请设置最后一列的 MinimumWidth 属性。
显示固定宽度的列,例如图标或 ID 列。 将列的 AutoSizeMode 设置为 None 并将 Resizable 设置为 False。 通过设置 Width 属性或在用数据填充控件后调用控件 AutoResizeColumn 方法来初始化其宽度。
每当单元格内容发生变化时自动调整大小,以避免剪裁并优化空间的使用。 将自动调整大小属性设置为表示基于内容的调整大小模式的值。 为避免在处理大量数据时出现性能损失,请使用仅计算显示行的调整大小模式。
根据显示行中的值调整大小,以避免在处理多行时出现性能损失。 使用适当的调整大小模式枚举值进行自动或程序化调整大小。 若要在滚动时根据新显示行中的值调整大小,请在 Scroll 事件处理程序中调用调整大小方法。 若要自定义用户双击调整大小,以便仅根据显示行中的值确定新大小,请在 RowDividerDoubleClickColumnDividerDoubleClick 事件处理程序中调用调整大小方法。
仅在特定时间根据单元格内容调整大小,以避免性能损失或启用用户调整大小。 在事件处理程序中调用基于内容的调整大小方法。 例如,使用 DataBindingComplete 事件在绑定后初始化大小,并处理 CellValidatedCellValueChanged 事件来调整大小,以补偿用户对绑定数据源的编辑或更改。
调整多行单元格内容的行高。 确保列宽适合显示文本段落,并使用基于内容的自动或程序化行调整大小来调整高度。 还要确保使用 WrapMode 单元格样式值 True 来显示具有多行内容的单元格。

通常,你将使用自动列调整大小模式来保持列宽,或在调整行高之前将它们设置为特定宽度。

使用鼠标调整大小

默认情况下,用户可以根据单元格值对不使用自动调整大小模式的行、列和标题调整大小。 若要防止用户使用其他模式(如列填充模式)调整大小,请设置以下一个或多个 DataGridView 属性:

你还可以通过设置单个行或列的 Resizable 属性来阻止用户调整该行或列的大小。 默认情况下,Resizable 属性值基于列的 AllowUserToResizeColumns 属性值和行的 AllowUserToResizeRows 属性值。 但是,如果将 Resizable 显式设置为 TrueFalse,则指定的值会替代该行或列的控件值。 将 Resizable 设置为 NotSet 可恢复继承。

由于 NotSet 会恢复值继承,因此,除非尚未将行或列添加到 DataGridView 控件,否则 Resizable 属性永远不会返回 NotSet 值。 如果需要确定行或列的 Resizable 属性值是否被继承,请检查其 State 属性。 如果 State 值包含 ResizableSet 标记,则表示 Resizable 属性值未被继承。

自动调整大小

DataGridView 控件中有两种自动调整大小模式:列填充模式和基于内容的自动调整大小。

列填充模式使控件中的可见列填充控件显示区域的宽度。 有关此模式的详细信息,请参阅 Windows 窗体 DataGridView 控件中的列填充模式

你还可以将行、列和标题配置为根据其单元格内容自动调整大小。 在这种情况下,只要单元格内容发生变化,就会调整大小。

注意

如果你使用虚拟模式在自定义数据缓存中维护单元格值,则在用户编辑单元格值时会发生自动调整大小操作,但在你更改 CellValuePushed 事件处理程序外部的缓存值时不会发生。 在这种情况下,应调用 UpdateCellValue 方法强制控件更新单元格显示并应用当前的自动调整大小模式。

如果仅针对一个维度(即针对行但不针对列,或针对列但不针对行)启用基于内容的自动调整大小,同时还启用 WrapMode,则只要其他维度发生更改,也会调整大小。 例如,如果为行而非列配置自动调整大小并启用 WrapMode,则用户可以拖动列分隔条来更改列宽,行高将自动调整,以便单元格内容仍能完全显示。

如果为行和列均配置基于内容的自动调整大小并启用 WrapModeDataGridView 控件将在单元格内容更改时调整大小,并在计算新大小时使用理想的单元格高宽比。

若要为不替代控件值的标题、行和列配置调整大小模式,请设置以下一个或多个 DataGridView 属性:

若要为单个列替代控件的列调整大小模式,请将其 AutoSizeMode 属性设置为 NotSet 以外的值。 列的调整大小模式实际上由其 InheritedAutoSizeMode 属性确定。 此属性的值基于列的 AutoSizeMode 属性值,除非该值为 NotSet,在这种情况下,将继承控件的 AutoSizeColumnsMode 值。

处理大量数据时,请谨慎使用基于内容的自动调整大小。 为避免性能损失,请使用自动调整大小模式,该模式仅根据显示的行而不是通过分析控件中的每一行来计算大小。 为了获得最佳性能,请改用程序化调整大小,以便在特定时间调整大小,例如在加载新数据后立即调整大小。

基于内容的自动调整大小模式不会影响通过以下方式隐藏的行、列或标题:将行或列的 Visible 属性或控件的 RowHeadersVisibleColumnHeadersVisible 属性设置为 false。 例如,如果某个列在根据较大单元格值自动调整大小后被隐藏,那么在删除包含较大单元格值的行时,被隐藏的列不会改变大小。 可见性更改时不会自动调整大小,因此将列的 Visible 属性改回为 true 不会强制它根据当前内容重新计算大小。

基于内容的程序化调整大小会影响行、列和标题,而不考虑其可见性。

程序化调整大小

禁用自动调整大小后,可以通过以下属性以编程方式设置行、列或标题的确切宽度或高度:

你还可以使用以下方法以编程方式根据内容调整行、列和标题的大小:

这些方法将一次性调整行、列或标题的大小,而不是将其配置为连续调整大小。 系统会自动计算新大小,以显示所有单元格内容而不进行剪裁。 但是,当以编程方式调整 InheritedAutoSizeMode 属性值为 Fill 的列的大小时,将使用计算出的基于内容的宽度按比例调整列的 FillWeight 属性值,然后根据这些新比例计算实际列宽,以便所有列填充控件的可用显示区域。

程序化调整大小有助于避免连续调整大小造成的性能损失。 为用户可调整大小的行、列和标题以及列填充模式提供初始大小也很有用。

你通常会在特定时间调用程序化调整大小方法。 例如,你可以在加载数据后立即以编程方式调整所有列的大小,或者在修改特定单元格值后以编程方式调整特定行的大小。

自定义基于内容的调整大小行为

处理派生的 DataGridView 单元格、行和列类型时,可以通过替代 DataGridViewCell.GetPreferredSizeDataGridViewRow.GetPreferredHeightDataGridViewColumn.GetPreferredWidth 方法或通过在派生的 DataGridView 控件中调用受保护的调整大小方法重载来自定义调整大小行为。 受保护的调整大小方法重载旨在成对工作,以实现理想的单元格高宽比,避免单元格过宽或过高。 例如,如果调用 AutoResizeRows 方法的 AutoResizeRows(DataGridViewAutoSizeRowsMode,Boolean) 重载并为 Boolean 参数传入值 false,重载将计算行中单元格的理想高度和宽度,但它只会调整行高。 然后,你必须调用 AutoResizeColumns 方法将列宽调整为计算出的理想值。

基于内容的调整大小选项

对于基于内容的调整大小,调整大小属性和方法使用的枚举具有相似的值。 借助这些值,可以限制使用哪些单元格来计算首选大小。 对于所有调整大小枚举,名称引用显示单元格的值将其计算项限制为显示行中的单元格。 在处理大量行时,排除行有助于避免性能损失。 你还可以将计算项限制为标题或非标题单元格中的单元格值。

另请参阅