Есть ли способ заставить DataGridView соответствовать ширине и высоте столбцов/строк? Я нашел решение, которое требует ручного кадрирования: http://www.codeguru.com/csharp/.net/net_data/datagrid/article.php/c9603 Does DataGridView действительно не поддерживает эту функцию?
DataGridView AutoSize
Ответ 1
если вы хотите, чтобы все столбцы автоматически изменялись в соответствии с данными:
for (int i = 0; i < dataGridView.Columns.Count; i++)
{
dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
Ответ 2
Используйте AutoSizeMode и Режим заполнения
Ответ 3
Это довольно старый вопрос, который неправильно понял ИМХО. То, что Idsa хочет достичь, состоит в том, чтобы сделать фактическую функцию AutoSize
winforms работать с DataGridView. Свойство существует, но оно не действует.
Это означает, что DataGridView должен поместиться вокруг его содержимого, а не содержать его содержимое внутри DataGridView.
Есть много вещей, чтобы думать о достижении реализации AutoSize. Размер DataGridView зависит от множества критериев:
- Размер границы
- Перетяжка
- Размер разделителя ячеек
- Высота заголовка строки
- Ширина заголовка столбца
- Как заполняется DataGridView (DataBound или вручную)
- ... намного больше
Лучше всего выбрать набор некоторых критериев, которые соответствуют вашему конкретному сценарию, и написать что-то, что вычислит размер DataGridView для вас.
Вот мой конкретный сценарий в качестве примера:
-
моя сетка привязана к данным. Поэтому его размер должен меняться каждый раз, когда операция DataBinding завершена. Это условие, которое вызывает перерасчет размера DataGridView. Поэтому я подключаю его к событию
DataBindingComplete
. -
Моя сетка не должна отображать полосы прокрутки. Поэтому я устанавливаю для свойства
Scrollbars
значение None. -
Режим автосохранения строк и столбцов установлен на AllCells.
-
Заголовки строк и столбцов не отображаются. Если бы они были, их размеры должны быть включены в расчет.
Расширение ниже метода соответствует моим потребностям. Это очень просто, потому что мои решетки очень просты. Вам, вероятно, придется немного подкорректировать его, чтобы он работал по вашему желанию, и многое, чтобы заставить его работать для каждого сценария DataGridView.
public static void HandleAutoSize(this DataGridView dgv)
{
dgv.DataBindingComplete += (s, e) =>
{
var dg = (DataGridView)s;
var width = dg.Columns.GetColumnsWidth(DataGridViewElementStates.None);
var height = dg.Rows.GetRowsHeight(DataGridViewElementStates.None);
dg.ClientSize = new Size(width, height);
};
}
Ответ 4
Этот перевод VB.NET
работал у меня:
For i As Integer = 0 To dataGridView.ColumnCount - 1
dataGridView.Columns(i).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
Next
Ответ 5
Реальный ответ
Я написал этот код для вычисления точного размера сетки с использованием цвета пикселя и сравнения его фона. Это отлично работает для меня. Это вызывает некоторое мерцание, если вы используете autosize в содержащейся форме, вы должны отключить авторазборку или изменить код, чтобы вручную установить размер в содержащей форме. Но, без автоматической обработки родительского элемента управления, он отлично работает.
private void gridViewAutoSize(DataGridView dgv)
{
Bitmap dgvBmp = new Bitmap(dgv.Width,dgv.Height);
dynRecDataGridView.DrawToBitmap(dgvBmp, new Rectangle(0, 0, dgv.Width, dgv.Height));
int x = dgv.Width-1;
int y = dgv.Height-1;
int halfHeaderW = dgv.RowHeadersWidth / 2;
int halfHeaderH = dgv.ColumnHeadersHeight / 2;
int borderX = 0;
int borderY = 0;
const int widthLimit = 800;
const int heightLimit = 350;
while (x == dgv.Width - 1)
{
borderX = 0;
while (x >= 0 && dgvBmp.GetPixel(x, halfHeaderH).ToArgb() != dgv.BackgroundColor.ToArgb())
{
borderX++;
x--;
}
if (x < 0)
{
if(dgv.Width-1 <= widthLimit)
{
dgv.Width += 100;
dgvBmp = new Bitmap(dgv.Width, dgv.Height);
dynRecDataGridView.DrawToBitmap(dgvBmp, new Rectangle(0, 0, dgv.Width, dgv.Height));
x = dgv.Width - 1;
}
else
{
x = widthLimit;
borderX = 0;
}
}
}
if (x > widthLimit)
{
x = widthLimit;
borderX = 0;
}
else if(x < widthLimit)
{
while (dgvBmp.GetPixel(x, halfHeaderH).ToArgb() == dgv.BackgroundColor.ToArgb())
{
x--;
}
}
while (y == dgv.Height - 1)
{
borderY = 0;
while (y >= 0 && dgvBmp.GetPixel(halfHeaderW, y).ToArgb() != dgv.BackgroundColor.ToArgb())
{
borderY++;
y--;
}
if (y < 0)
{
if (dgv.Height-1 <= heightLimit)
{
dgv.Height += 100;
dgvBmp = new Bitmap(dgv.Width, dgv.Height);
dynRecDataGridView.DrawToBitmap(dgvBmp, new Rectangle(0, 0, dgv.Width, dgv.Height));
y = dgv.Height - 1;
}
else
{
y = heightLimit;
borderY = 0;
}
}
}
if (y > heightLimit)
{
y = heightLimit;
borderY = 0;
}
else if (y < heightLimit)
{
while (dgvBmp.GetPixel(halfHeaderW, y).ToArgb() == dgv.BackgroundColor.ToArgb())
{
y--;
}
}
dgv.Size = new Size(x+borderX+1, y+borderY+1);
}
Ответ 6
Поток довольно старый, но если кому-то это все еще нужно, он может использовать grid.AutoResizeColumns() прекрасно работает со мной
Ответ 7
вы можете просто изменить свойства dataGridView. Чтобы
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;