Я заполняю элемент управления DataGridView в форме Windows (C # 2.0, а не WPF).
Моя цель - отобразить сетку, которая аккуратно заполняет всю доступную ширину ячейками, то есть без неиспользуемых (темно-серых) областей справа и размер каждого столбца в соответствии с данными, которые он содержит, но также позволяет пользователю изменять размер любого из столбцов по своему вкусу.
Я пытаюсь добиться этого, задав для AutoSizeMode каждого столбца значение DataGridViewAutoSizeColumnMode.AllCells, за исключением одного из столбцов, для которого я установил значение DataGridViewAutoSizeColumnMode.Fill , чтобы вся область сетки была аккуратно заполнена данными. (Я не возражаю, когда пользователь пытается изменить размер этого столбца, он возвращается к размеру, который гарантирует, что горизонтальное пространство всегда используется.)
Однако, как я уже упоминал, после загрузки я хотел бы разрешить пользователю изменять размер столбцов в соответствии со своими требованиями - при установке этих значений AutoSizeMode для каждого столбца кажется, что пользователь не может затем изменить размер этих столбцов.
Я пытался не устанавливать AutoSizeMode для всех столбцов, который позволяет изменять размер, НО не устанавливает начальный размер в соответствии с данными, содержащимися в ячейках. Тот же результат происходит при изменении AutoSizeMode сетки обратно на «Not Set» после загрузки данных.
Есть ли параметр, который мне здесь не хватает, который позволяет автоматически устанавливать ширину столбцов по умолчанию и изменять размер пользователя, или есть другой метод, который я должен использовать при заполнении элемента управления DataGridView?
источник
Ответы:
У меня работает этот трюк:
Здесь происходит то, что вы устанавливаете автоматическое изменение размера в любой режим, который вам нужен, а затем столбец за столбцом вы сохраняете ширину, полученную при вычислении автоматического размера, удаляете автоматическое изменение размера и устанавливаете ширину на значение, которое вы сохранили ранее.
источник
grd.Columns(i).Width = grd.Columns(i).Width
уже свое дело. Смотрите здесь .dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
Может ты мог бы позвонить
После установки datasource. Он установит ширину и позволит изменять размер.
Подробнее о методе MSDN DataGridView.AutoResizeColumns (DataGridViewAutoSizeColumnsMode) .
источник
DataGridViewAutoSizeColumnsMode.DisplayedCells
. Кроме того, в конструкторе форм для AutoSizeColumnsMode установлено значение None. Мне нужно было выполнить этот вызов метода в обработчике событий DataBindingComplete DataGridView, чтобы убедиться, что он всегда (повторно) правильно определяет размер.AC # версия кода Мирослава Задравца
Размещено как вики сообщества, чтобы не злиться на чужую репутацию
источник
В моем приложении я установил
Кроме того, я установил
Теперь ширину столбцов можно изменить, и пользователь может изменить порядок столбцов. Для меня это работает очень хорошо.
Может быть, это сработает для вас.
источник
После добавления данных в сетку добавьте следующий код, который настроит столбец в соответствии с длиной данных в каждой ячейке.
Вот результат
источник
Ну я сделал вот так:
именно в этом порядке. Размер столбцов изменяется (расширяется), и пользователь может впоследствии изменить размер столбцов.
источник
Если я правильно понял вопрос, должен быть более простой способ выполнить то, что вам нужно. Вызов
dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
Это должно делать свое дело. Однако есть одна ловушка, поскольку вы не можете просто вызвать этот метод сразу после заполнения элемента управления DataGridView. Вместо этого вам нужно будет добавить EventHandler для события VisibleChanged и вызвать там метод.
источник
У меня работают простые две строчки кода.
источник
Резюме вопроса:
адаптировать ширину столбца к содержимому (с помощью другого метода для столбца),
но затем разрешите пользователю устанавливать ширину столбца ...
Разработка от ответа Мирослава Zadravec в , для меня то , что работало сразу же с помощью автоматического вычисленного
column.Width
для набора ...column.Width
!Это проверено на работу , когда
DataGridView
уже создана, используя трюк , как это .источник
Это сделало для меня чудеса:
источник
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
Это автоматически заполняет все столбцы в соответствии с их содержимым, заполняет оставшееся пустое пространство, растягивая указанный столбец, и предотвращает поведение «прыжков», задавая последний столбец для заполнения для любого будущего изменения размера.
источник
Немного более аккуратный код C # из кода Мирослава Задравца, предполагающий, что все столбцы должны быть автоматически изменены
источник
Еще одна версия кода Мирослава Задравца, но чуть более автоматизированная и универсальная:
Я помещаю вторую часть в отдельное событие, потому что я заполняю
datagridvew
инициализацию формы, и если обе части присутствуют, ничего не меняется, потому что, вероятно, автоматическое изменение размера вычисляет ширину послеdatagridview
отображения, поэтому ширина по-прежнему остается вForm1()
методе по умолчанию . После завершения этого метода autosize делает свое дело, и сразу после этого (когда форма отображается) мы можем установить ширину второй частью кода (здесь, вForm1Shown
случае). Это работает для меня как шарм.источник
Вот упрощенный код для ответа Мирослава Задравца на С #:
источник
Вы пытались настроить
FillWeight
свойство вашегоDataGridViewColumns
объекта?Например:
Думаю, в вашем случае это должно сработать.
источник
Небольшое улучшение по сравнению с версией Schnapple
источник
dataGridView1.AutoResizeColumns ();
источник
Ширина столбца настроена так, чтобы соответствовать его содержимому. Я использовал приведенное ниже утверждение. Это решило мою проблему.
Первый шаг :
Второй шаг :
Третий шаг:
источник
Это должно работать независимо от того
dataGridView
, был ли он отображен (т.е. даже если он был вызван из конструктора класса).Тот же метод, но с
DataGridViewAutoSizeColumnMode.DisplayedCells
, в приведенном выше случае не работает по очевидной причине - ячейка еще не отображалась! По какой-то неочевидной причинеAutoResizeColumns
в этом случае тоже не работает.источник
Например, если вы привязываете свой источник данных к таблице данных, вам необходимо установить свойства после того, как привязка будет выполнена:
источник
DataGridView.Columns
, изменитеAutoSizeMode
значение на действительное, соберите значение ширины и верните его после измененияAutoSizeMode
наDataGridViewAutoSizeColumnMode.None
).Form.Show()
илиForm.ShowDialog()
. Поэтому я поместил этот фрагмент кода вForm.Shown
событие, и у меня это сработало.Мой преобразованный код, независимо от того, что было
DataGridView.AutoSizeColumnsMode
установлено ранее, я используюDataGridViewColumn.GetPreferredWidth()
вместо того, чтобы сразу менятьDataGridViewColumn.AutoSizeMode
и устанавливать значение ширины, а затем изменитьDataGridView.AutoSizeColumnsMode
один раз:Обязательно установите
Я не знаю, почему это работает только после отображения формы.
источник
Мне пришлось сделать это в VB, и я предпочитаю разделить это на метод, который я поместил в модуль. При желании вы можете добавить столбец «Заливка» в качестве еще одного параметра ByRef.
источник
Вы можете сделать что-то вроде этого:
Все столбцы адаптируются к содержимому, за исключением последнего, заполняющего сетку.
источник
Если $ array является содержимым PSCustomObject, это работает:
источник