Как вы автоматически изменяете размеры столбцов в элементе управления DataGridView И позволяете пользователю изменять размер столбцов в той же сетке? - PullRequest
102 голосов
/ 22 июня 2009

Я заполняю элемент управления DataGridView в форме Windows (C # 2.0, а не WPF).

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

Я пытаюсь добиться этого, устанавливая AutoSizeMode каждого столбца равным DataGridViewAutoSizeColumnMode.AllCells за исключением одного из столбцов, для которого я установил DataGridViewAutoSizeColumnMode.Fill . вся область сетки аккуратно заполнена данными. (Я не возражаю, что когда пользователь пытается изменить размер этого столбца, он возвращается к размеру, который гарантирует, что горизонтальное пространство всегда используется.)

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

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

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

Ответы [ 23 ]

120 голосов
/ 23 июня 2009

Этот трюк у меня работает:

grd.DataSource = DT;

//set autosize mode
grd.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
grd.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
grd.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

//datagrid has calculated it's widths so we can store them
for (int i = 0; i <= grd.Columns.Count - 1; i++) {
    //store autosized widths
    int colw = grd.Columns[i].Width;
    //remove autosizing
    grd.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    //set width to calculated by autosize
    grd.Columns[i].Width = colw;
}

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

42 голосов
/ 02 января 2010

Может быть, вы могли бы позвонить

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.Fill);

После настройки источника данных. Он установит ширину и позволит изменить размер.

Подробнее о MSDN Метод DataGridView.AutoResizeColumns (DataGridViewAutoSizeColumnsMode) .

29 голосов
/ 07 апреля 2012

C # версия кода Мирослава Задравца

for (int i = 0; i < dataGridView1.Columns.Count-1; i++)
{
    dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
dataGridView1.Columns[dataGridView1.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    int colw = dataGridView1.Columns[i].Width;
    dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    dataGridView1.Columns[i].Width = colw;
}

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

12 голосов
/ 22 июня 2009

В моем приложении я установил

grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
grid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

Также я установил

grid.AllowUserToOrderColumns = true;
grid.AllowUserToResizeColumns = true;

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

Может быть, это будет работать для вас.

8 голосов
/ 10 декабря 2014

После добавления данных в сетку добавьте следующий код, который будет корректировать столбец в соответствии с длиной данных в каждой ячейке

dataGrid1.AutoResizeColumns();            
dataGrid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

Вот результат

enter image description here

8 голосов
/ 23 октября 2012

Ну, я сделал это так:

dgvReport.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dgvReport.AutoResizeColumns();
dgvReport.AllowUserToResizeColumns = true;
dgvReport.AllowUserToOrderColumns = true;

в указанном порядке. Размер столбцов изменяется (расширяется) И пользователь может изменить размер столбцов впоследствии.

6 голосов
/ 28 сентября 2011

Если я правильно понял вопрос, должен быть более простой способ выполнить то, что вам нужно. Вызов dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

Это должно сработать. Однако есть одна ловушка, поскольку вы не можете просто вызвать этот метод непосредственно после заполнения элемента управления DataGridView. Вместо этого вам нужно будет добавить EventHandler для события VisibleChanged и вызвать там метод.

4 голосов
/ 24 сентября 2015

Резюме вопроса:
Приспособьте ширину столбца к содержанию (с другим методом через столбец),
но затем разрешите пользователю установить ширину столбца ...

Исходя из Ответ Мирослава Задравца , для меня сработало немедленное использование автоматического вычисления column.Width для установки ... column.Width!

foreach (DataGridViewColumn column in dataGridView.Columns)
{
    if (/*It's not your special column*/)
    {
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
        column.Width = column.Width; //This is important, otherwise the following line will nullify your previous command
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet;
    }
}

//Now do the same using Fill instead of AllCells for your special column

Это проверено, чтобы работать, когда DataGridView уже создан, используя трюк, подобный this .

3 голосов
/ 19 июля 2017

Это творило чудеса для меня:

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
2 голосов
/ 24 июня 2013

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

// autosize all columns according to their content
dgv.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
// make column 1 (or whatever) fill the empty space
dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
// remove column 1 autosizing to prevent 'jumping' behaviour
dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
// let the last column fill the empty space when the grid or any column is resized (more natural/expected behaviour) 
dgv.Columns.GetLastColumn(DataGridViewElementStates.None, DataGridViewElementStates.None).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...