Подтвердить что ты не робот

DataGridView AutoSize

Есть ли способ заставить DataGridView соответствовать ширине и высоте столбцов/строк? Я нашел решение, которое требует ручного кадрирования: http://www.codeguru.com/csharp/.net/net_data/datagrid/article.php/c9603 Does DataGridView действительно не поддерживает эту функцию?

4b9b3361

Ответ 1

если вы хотите, чтобы все столбцы автоматически изменялись в соответствии с данными:

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

Ответ 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;