Изменение размеров управления DataGridView в Windows Forms

Размер строк, столбцов и заголовков DataGridView изменяется в результате различных событий. Эти события рассмотрены в следующей таблице.

Вхождение Description
Изменение размера пользователем Для изменения размера пользователи могут перетащить или дважды щелкнуть разделители строк, столбцов или заголовков.
Изменение размера элемента управления В режиме заполнения столбцов ширина столбцов изменяется при изменении ширины элемента управления. Например, если элемент управления прикреплен к своей родительской форме, и пользователь изменяет размер формы.
Изменение значения ячейки В режимах автоматического изменения размера на основе содержимого размеры изменяются в соответствии с новыми отображаемыми значениями.
Вызов метода Изменение размера на основе программного содержимого позволяет нежестким образом корректировать размер на основе значений ячеек во время вызова метода.
Задание параметра свойства Также можно задать конкретные значения для высоты и ширины.

По умолчанию изменение пользователем размера включено, автоматическое изменение размера отключено, а значения ячеек, ширина которых превышает их столбцы, обрезаются.

В следующей таблице показаны сценарии, которые можно использовать для настройки поведения по умолчанию или использования определенных параметров изменения размера для достижения определенных эффектов.

Сценарий Внедрение
Используйте режим заполнения столбцов для отображения данных аналогичного размера в относительно небольшом количестве столбцов, которые занимают всю ширину элемента управления без отображения горизонтальной полосы прокрутки. Установите свойство AutoSizeColumnsMode в значение Fill.
Используйте режим заполнения столбцов с отображаемыми значениями различного размера. Установите свойство AutoSizeColumnsMode в значение Fill. Инициализируйте относительные ширины столбцов путем задания свойств FillWeight столбца или вызова метода AutoResizeColumns управления после заполнения данными элемента управления.
Используйте режим заполнения столбцов со значениями разной степени важности. Установите свойство AutoSizeColumnsMode в значение Fill. Задайте более крупные значения MinimumWidth для столбцов, которые всегда должны отображать некоторые данные, или используйте параметр изменения размера, отличный от режима заполнения для определенных столбцов.
Чтобы предотвратить отображение фона элемента управления, используйте режим заполнения столбцов. Задайте для свойства AutoSizeMode последнего столбца значение Fill и используйте другие параметры изменения размера для других столбцов. Если другие столбцы используют слишком много доступного пространства, задайте свойство MinimumWidth последнего столбца.
Отображение столбца фиксированной ширины, например значка или столбца идентификатора. Задайте для AutoSizeMode значение None и для Resizable значение False для столбца. Инициализируйте его ширину, задав свойство Width или вызвав метод AutoResizeColumn элемента управления после заполнения элемента управления данными.
Всегда автоматически изменяйте размеры при изменении содержимого ячейки, чтобы избежать обрезки и оптимизировать использование пространства. Задайте для свойства автоматического изменения размера значение, представляющее режим изменения размера на основе содержимого. Чтобы избежать снижения производительности при работе с большими объемами данных, используйте режим изменения размера, который вычисляет только отображаемые строки.
Настраивайте размеры в соответствии со значениями в отображаемых строках, чтобы избежать снижения производительности при работе с большим количеством строк. Используйте соответствующие значения перечисления в режиме изменения размера с автоматическим или программным изменением размера. Чтобы настроить размеры в соответствии со значениями в недавно отображаемых строках во время прокрутки, вызовите метод изменения размера в обработчике событий Scroll. Чтобы настроить изменение размера при двойном щелчке пользователя, чтобы только значения в отображаемых строках определяли новые размеры, вызовите метод изменения размера в обработчике событий RowDividerDoubleClick или ColumnDividerDoubleClick.
Настраивайте размеры в соответствии с содержимым ячейки только в определенное время, чтобы избежать снижения производительности или включить изменение размера пользователем. Вызовите метод изменения размера на основе содержимого в обработчике событий. Например, используйте событие DataBindingComplete для инициализации размеров после привязки и обрабатывайте события CellValidated или CellValueChanged для изменения размеров, чтобы компенсировать изменения, вносимые пользователем в привязанном источнике данных.
Настройте высоту строк для содержимого многострочных ячеек. Убедитесь, что ширина столбцов подходит для отображения абзацев текста и используйте автоматическое или программное определение размера строк на основе содержимого для настройки высоты. Кроме того, убедитесь, что ячейки с многострочным содержимым отображаются при использовании значения стиля ячейки WrapMode, равного True.

Для поддержания ширины столбцов или установки для них необходимой ширины до корректировки высоты строк, как правило, используется режим автоматического изменения размера столбцов.

Изменение размера с помощью мыши

По умолчанию пользователи могут изменять размер строк, столбцов и заголовков, для которых автоматический режим изменения размера на основе значений ячеек не используется. Чтобы пользователи не изменяли размер с помощью других режимов, таких как режим заполнения столбцов, задайте одно или несколько из следующих свойств DataGridView:

Чтобы пользователи также не могли изменить размер отдельных строк или столбцов, задайте их свойства Resizable. По умолчанию значение свойства Resizable основано на значении свойства AllowUserToResizeColumns для столбцов и значении свойства AllowUserToResizeRows для строк. Однако, если для Resizable явно задано значение True или False, это значение переопределяет значение элемента управления для данной строки или столбца. Для восстановления наследования задайте для Resizable значение NotSet.

Так как NotSet восстанавливает наследование значений, свойство Resizable никогда не будет возвращать значение NotSet, если в элемент управления DataGridView не добавлена строка или столбец. Если необходимо определить, наследуется ли значение свойства Resizable для строки или столбца, проверьте его свойство State. Если значение State содержит флаг ResizableSet, значение свойства Resizable не наследуется.

Автоматическое изменение размеров

В элементе управления DataGridView поддерживаются два способа автоматического изменения размера: режим заполнения столбцов и автоматическое изменение размера на основе содержимого.

В режиме заполнения столбцов видимые столбцы в элементе управления заполняют ширину области отображения элемента управления. Дополнительные сведения об этом режиме см. в разделе Режим заполнения столбцов в элементе управления DataGridView в Windows Forms.

Также можно настроить строки, столбцы и заголовки для автоматической настройки их размеров в соответствии с их содержимым ячеек. В этом случае изменение размера происходит при каждом изменении содержимого ячейки.

Примечание.

Если значения ячеек в настраиваемом кэше данных поддерживаются с помощью виртуального режима, автоматическое изменение размера происходит, когда пользователь изменяет значение ячейки, и не происходит в случае изменения кэшированного значения за пределами обработчика событий CellValuePushed. В этом случае необходимо вызвать метод UpdateCellValue, чтобы принудительно обновить в элементе управления отображение ячейки и применить текущие режимы автоматического изменения размера.

Если автоматическое изменение размера на основе содержимого включено только для одного измерения (то есть, для строк, но не столбцов или для столбцов, но не строк), и также включен WrapMode, изменение размера также происходит при каждом изменении другого измерения. Например, если строки, но не столбцы, настроены для автоматического изменения размера, и включен WrapMode, пользователи могут перетащить разделители столбцов, чтобы изменить ширину столбца, а высота строк будет корректироваться автоматически, чтобы содержимое ячейки по-прежнему отображалось полностью.

Если выполняется настройка как строк, так и столбцов для автоматического изменения размера на основе содержимого, и WrapMode включен, то элемент управления DataGridView будет корректировать размеры при каждом изменении содержимого ячейки и будет использовать идеальное соотношение высоты и ширины ячеек при вычислении новых размеров.

Чтобы настроить режим изменения размера для заголовков и строк, а также для столбцов, которые не переопределяют значение элемента управления, задайте одно или несколько следующих свойств DataGridView:

Чтобы переопределить режим изменения размера отдельного столбца для элемента управления, задайте для его свойства AutoSizeMode значение, отличное от NotSet. Режим изменения размера для столбца фактически определяется его свойством InheritedAutoSizeMode. Значение этого свойства основано на значении свойства AutoSizeMode столбца, если только данное значение не равно NotSet. В таком случае значение AutoSizeColumnsMode элемента управления наследуется.

При работе с большими объемами данных используйте автоматическое изменение размера на основе содержимого с осторожностью. Чтобы избежать снижения производительности, используйте режимы автоматического изменения размера, которые вычисляют размеры только на основе отображаемых строк, а не анализируют каждую строку в элементе управления. Для обеспечения максимальной производительности используйте программное изменение размера, чтобы размер можно было изменять в определенное время, например, сразу после загрузки новых данных.

Режимы автоматического изменения размера на основе содержимого не влияют на строки, столбцы или заголовки, которые были скрыты путем задания значения false для свойства Visible строки или столбца, или свойств RowHeadersVisible или ColumnHeadersVisible элемента управления. Например, если столбец скрыт после автоматического изменения его размера в соответствии с более высоким значением ячейки, скрытый столбец не изменит свой размер, если строка, содержащая большее значение ячейки, будет удалена. Автоматическое изменение размера не выполняется при изменении видимости, поэтому возврат свойства столбца Visible к значению true не приведет к повторному вычислению его размера на основе текущего содержимого.

Программное изменение размера на основе содержимого влияет на строки, столбцы и заголовки независимо от их видимости.

Программное изменение размера

Если автоматическое изменение размера отключено, точную ширину или высоту строк, столбцов или заголовков можно задать программно с помощью следующих свойств.

Также программно можно изменять размер строк, столбцов и заголовков, чтобы они соответствовали своему содержимому, с помощью следующих методов.

Эти методы позволят сразу изменить размер строк, столбцов или заголовков. Их не нужно будет настраивать для непрерывного изменения размера. Новые размеры автоматически вычисляются для отображения всего содержимого ячейки без обрезки. Однако при программном изменении размера столбцов, свойства InheritedAutoSizeMode которых имеют значение Fill, вычисляемая ширина на основе содержимого используется для пропорциональной корректировки значений свойств FillWeight столбца, а фактическая ширина столбцов затем вычисляется в соответствии с этими новыми пропорциями, чтобы все столбцы заполняли доступную область отображения элемента управления.

Программное изменение размера полезно для предотвращения снижения производительности при непрерывном изменении размера. Также полезно указать начальные размеры для строк, столбцов и заголовков, размер которых изменяется пользователем, а также для режима заполнения столбцов.

Обычно методы программного изменения размера вызываются в предварительно заданное время. Например, можно программно изменить размер всех столбцов сразу после загрузки данных или программно изменить размер определенной строки после изменения значения конкретной ячейки.

Настройка поведения изменения размера на основе содержимого

Поведение изменения размера можно настроить при работе с производными типами ячеек, строк и столбцов DataGridView путем переопределения методов DataGridViewCell.GetPreferredSize, DataGridViewRow.GetPreferredHeight или DataGridViewColumn.GetPreferredWidth, либо посредством вызова перегрузок защищенных методов изменения размера в производном элементе управления DataGridView. Перегрузки защищенных методов изменения размера предназначены для работы в парах для достижения идеального соотношения высоты и ширины ячейки, что позволяет избежать появления чрезмерно широких или высоких ячеек. Например, в случае вызова перегрузки AutoResizeRows(DataGridViewAutoSizeRowsMode,Boolean) метода AutoResizeRows и передачи значения false для параметра Boolean, перегрузка вычислит идеальную высоту и ширину для ячеек в строке, но изменит только высоту строк. Затем для настройки ширины столбца в соответствии с вычисляемым идеальным вариантом необходимо вызвать метод AutoResizeColumns.

Параметры определения размера на основе содержимого

Перечисления, используемые свойствами и методами изменения размера, имеют похожие значения для определения размера на основе содержимого. С помощью этих значений можно указать, какие ячейки могут использоваться для вычисления предпочтительных размеров. Для всех перечислений при определении размера значения с именами, ссылающимися на отображаемые ячейки, позволят выбрать для вычисления только ячейки в отображаемых строках. Исключение строк полезно для предотвращения снижения производительности при работе с большим количеством строк. Также вычисления можно выполнять только для значений ячеек в ячейках заголовка или ячейках, не относящихся к заголовку.

См. также