Режим управления шириной колонки можно узнать из значения свойства InheritedAutoSizeMode конкретной колонки. Узнать, но не установить, так как свойство доступно только для чтения. Значение этого свойства вычисляется следующим образом. Если свойство колонки AutoSizeMode установлено в NoSet, то значение InheritedAutoSizeMode определяется значением свойства DataGridView AutoSizeColumnsMode. Иначе значение свойства InheritedAutoSizeMode соответствует значению свойства колонки AutoSizeMode. Другими словами, если для колонки не задан конкретный автоматический режим управления размером, используется общая для всего grid-a настройка. Это позволяет задать общий режим выравнивания для всех колонок grid-a и, если это нужно, изменить режим для отдельных колонок.
AutoSizeColumnsMode и AutoSizeMode имеют тип enum (DataGridViewAutoSizeColumnsMode и DataGridViewAutoSizeColumnMode, соответственно), и их значения различаются всего на один элемент NoSet, который есть у последнего и отсутствует у первого. В таблице 3 приведены члены перечисления DataGridViewAutoSizeColumnMode.
Значение | Описание |
AllCells | Ширина колонок подбирается автоматически так, чтобы содержимое любых ячеек (и обычных и заголовочных) было видно целиком. |
AllCellsExceptHeader | То же, что и AllCells, но заголовочные ячейки в расчет не берутся. |
ColumnHeader | То же, что и AllCells, но в расчет берутся только заголовочные ячейки. |
DisplayedCells | То же, что и AllCells, но в расчет берутся только ячейки, реально отображаемые на экране. |
DisplayedCellsExceptHeader | То же, что и DisplayedCells, но заголовочные ячейки в расчет не берутся. |
Fill | Режим пропорционального масштабирования колонок при изменении размеров grid-a. Подробно рассматривается далее. |
None (по умолчанию) | Ширина колонок автоматически не подбирается. |
NoSet | Значение определяется настройками grid-a. |
Таблица 3.
|
По умолчанию свойство InheritedAutoSizeMode любой колонки, не подвергавшейся какой-либо настройке, имеет значение None, так как это соответствует значению по умолчанию свойства AutoSizeColumnsMode grid-а, а значение AutoSizeMode по умолчанию равно NoSet.
Перейдем к многочисленным сценариям автоматического подбора ширины. Первый из них, AllCells, является самым универсальным и может быть рекомендован почти в любых сценариях автоподбора ширины.
Следующий режим, AllCellsExceptHeader, рекомендован если заголовок колонки содержит очень длинный, но не очень критичный текст. Применив этот режим, можно неплохо оптимизировать использование экранного пространства. Режим ColumnHeader логически противоположен предыдущему.
Следующая пара – DisplayedCells и DisplayedCellsExceptHeader по производимому эффекту аналогичны AllCells и AllCellsExceptHeader, соответственно. Но они не рассчитывают ширину всех ячеек колонки, а оценивают только ячейки, видимые в данный момент на экране. Проблема Displayed* -режимов в том, что они НЕ пересчитывают ширину колонки при прокрутке. Если после нажатия на PgDown в область видимости попадает ячейка с содержимым длиннее любой ячейки предшествующего экрана, такое содержимое срезается по последним символам. Но при этом изменение значений ячеек при редактировании "обслуживается" нормально – ширина колонки мгновенно меняется в нужную сторону. В качестве очевидного решения лежащего на поверхности проблемы со скроллингом можно предложить подписку на событие DataGridView.Scroll с вызовом в обработчике:
// пересчитать нулевую колонку (её ширину),// принимая во внимание только реально отображаемые ячейки_grid.AutoResizeColumn(0, DataGridViewAutoSizeColumnMode.DisplayedCells); |
Все эти режимы объединяет одно обстоятельство – если колонка находится в одном из них пользователь не может "схватиться" мышкой за разделитель и регулировать её ширину по собственному усмотрению. У нас остался последний, ну очень специальный режим – режим заполнения (Fill). Он кардинально отличается от разобранных, причем разница начинается уже с его взаимодействия с пользователем. Регулировать ширину Fill-колонки пользователь может так, как сочтет нужным, при условии, что таких колонок две или более. В чем же суть режима Fill?
|
Если среди колонок имеется одна или несколько колонок, помеченные типом автовыравнивания Fill, ширина этих колонок подбирается так, чтобы эти колонки разделяли между собой часть рабочей области grid-а, не занятую другими (не помеченными типом Fill) колонками. Если для обыкновенных колонок места не хватает, появляется горизонтальная полоса прокрутки, а каждой из Fill-колонок присваивается ширина из её свойства MinimumWidth (тип int, измеряется в пикселах). Минимальное значение этого свойства – всего 2 пиксела, по умолчанию оно равно 5. Оставшаяся часть grid-а делится между Fill-колонками не абы как, а в соответствии со значениями их свойства DataGridViewColumn.FillWeight (тип float). Вот он и определит, как делить остаток клиентской части.
Чуть ранее упоминалось еще одно свойство Fill-колонок – пользователь может менять их ширину по своему усмотрению. Собственно, он может менять только ширину колонок, режим заполнения у которых выставлен в None или Fill. Ну, с первым все понятно – пользователь фактически просто меняет значение Width. А в случае Fill-колонки он будет менять весовой коэффициент.