首页 > 技术文章 > WINFORM 关于DataGridView列宽界面调整的配置

sunlyk 2017-09-05 09:38 原文

关于列宽调整找到四个属性,看似都与列宽有关,但实际上关系好像比较复杂,针对性的做了一下测试。测试结果见最后。
此外,找到了一个非常好的方法:
dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.ColumnHeader);
从参数可以看出他的可以在不改变AutoSizeColumnsMode的前提下,进行DataGridViewAutoSizeColumnsMode枚举类型的一次性列宽调整。非常实用!
当然,应该仅限于AutoSizeColumnsMode为None或Fill下才可调整。

1. AllowUserToResizeColumns 
获取或设置一个值,该值指示用户是否可以调整列的大小。
MSDN

2. Frozen
获取或设置一个值,指示当用户水平滚动 DataGridView 控件时,列是否移动。
不影响手工调整列宽。
MSDN

3. Resizable
获取或设置一个值,指示该列的大小是否可调。
 
如果 Resizable 属性为 False,用户将不能手动调整列宽度。
 
默认情况下,Resizable 属性值将根据 DataGridView.AllowUserToResizeColumns 属性值而定。 但是,如果显式地将 Resizable 设置为 True 或 False,此控件值会被忽略。 将 Resizable 设置为 NotSet 可恢复值的继承行为。 
 
因为 NotSet 恢复了值继承,所以除非尚未向 DataGridView 控件添加该列,否则 Resizable 属性将永远不会返回 NotSet 值。 如果您需要确定列的 Resizable 属性值是否是继承而来的,请选中该列的 State 属性。 如果 State 属性值包括 ResizableSet 标记,则 Resizable 属性值不是继承而来的。
 
DataGridViewTriState:
False    
此属性的状态为 false。
NotSet    
此属性尚未设置,将采用默认方式。
True     
此属性的状态为 true。
MSDN

4. AutoSizeColumnsMode
要更改单个列的大小调整模式,请设置该列的 AutoSizeMode 属性。此属性的默认值为 NotSet,这指示此列从控件继承它的行为和 InheritedAutoSizeMode 属性值。
处于填充模式下的列按照其 FillWeight 属性值所指示的比例对可用控件宽度进行划分。可用于填充模式的宽度由某一个值决定,该值等于控件工作区的宽度减去其他所有列的宽度。如果此宽度小于所有填充模式列的 MinimumWidth 值的总和,则将显示水平滚动条,所有填充模式列都按其最小宽度显示,而且用户对列进行调整的功能将被禁用。有关列填充模式的更多信息,请参见 Windows 窗体 DataGridView 控件中的列填充模式。
只能自动调整 Visible 属性值为 true 的列的大小,更改列的可见性不会导致进行大小调整。另外,在列设置为自动调整大小时,用户不能用鼠标调整列宽。
要以编程方式调整列宽,请使用 AutoResizeColumn 或 AutoResizeColumns 方法,或者设置列的 Width 属性。
MSDN

4.1 DataGridViewAutoSizeColumnsMode 枚举
DataGridView 控件可以调整它的列的大小,使它们填充控件的可用水平宽度,或使它们显示所有单元格或指定单元格的全部内容。
使用 Fill 模式时,通过调整该模式中所有列的大小来确定一个列的首选宽度,这样控件中的所有可见列将准确填充可用显示区域的水平宽度。使用其他模式时,首选列宽为显示该列中所有单元格或单元格子集(如当前显示行中的单元格子集)的最大单元格值所需的最小宽度。使用单元格子集来确定新的宽度有利于在处理多个数据行时避免性能下降。  
基于内容的自动大小调整可以防止用户使用鼠标调整列宽。但是在填充模式下,用户可以调整大小。  
此枚举由 DataGridView 控件的 AutoSizeColumnsMode 属性和 AutoResizeColumns 方法使用。  
MSDN

5. 测试结果
AutoSizeColumnsMode (DGV属性)
允许设置列宽
AllowUserToResizeColumns (DGV属性)
Resizable (DGVC属性)
None
有效(对整个DGV生效,高于Resizable)
有效
ColumnHeader
无效
无效
AllCellsExceptHeader
无效
无效
AllCells
无效
无效
DisplayedCellsExceptHeader
无效
无效
DisplayedCells
无效
无效
Fill
有效(对整个DGV生效,高于Resizable)
有效
总结,如果需要手工调整列宽,则必须选择AutoSizeColumnsMode下None或Fill模式,之后AllowUserToResizeColumns =True,再次通过列属性Resizable对各列进行设置。
Frozen不影响手工调整列宽。

6. DataGridView.AutoResizeColumns方法
AutoResizeColumns() 
調整寬度,以適合其所有儲存格,包括標題儲存格內容的所有資料行。 
AutoResizeColumns(DataGridViewAutoSizeColumnsMode) 
調整寬度,使用指定的大小模式的所有資料行。 
AutoResizeColumns(DataGridViewAutoSizeColumnsMode, Boolean) 
調整寬度,使用指定的大小模式中,選擇性地計算寬度,並在預期接下來將調整資料列高度的情況的所有資料行。 
這個方法會很有用,如果您要控制何時調整資料行的大小。 資料行寬度會一次調整每個方法呼叫。 如果稍後在資料行的內容變更,資料行就不會自動調整。 若要調整大小的特定資料行,請使用AutoResizeColumn方法。 若要設定的資料行自動調整內容變更時,使用AutoSizeColumnsMode屬性或資料行AutoSizeMode屬性。
 
這個多載可讓您指定調整大小模式,用來計算一組有限的儲存格,例如,只有顯示資料列中的值計算新的寬度。 當控制項包含大量的資料列,這樣可以改善效能。
MSDN

推荐阅读