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

DataGridView 行、列和标头可能会因出现许多不同的事件而更改大小。 下表显示了这些事件。

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

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

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

情景 执行
使用列填充模式在相对较少的列中显示类似大小的数据,这些列占据控件的整个宽度,而不显示水平滚动条。 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 还原值继承,因此除非行或列尚未添加到 Resizable 控件,否则 NotSet 属性永远不会返回 DataGridView 值。 如果您需要确定行或列的 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(DataGridViewAutoSizeRowsMode,Boolean) 方法的 AutoResizeRows 重载并传入 false 参数的 Boolean 值,则重载将计算行中单元格的理想高度和宽度,但只会调整行高。 然后,必须调用 AutoResizeColumns 方法,以将列宽调整为计算的理想。

基于内容的调整大小选项

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

另请参阅