DataGridView AutoSize - PullRequest
       2

DataGridView AutoSize

13 голосов
/ 21 июня 2011

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

Ответы [ 7 ]

5 голосов
/ 21 июня 2011

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

for (int i = 0; i < dataGridView.Columns.Count; i++)
{
    dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
2 голосов
/ 08 октября 2015

Это довольно старый вопрос, который был неверно понят ИМХО.То, чего хочет добиться Idsa, - сделать так, чтобы фактическая функция AutoSize winforms работала с DataGridView.Свойство существует, но оно не действует.

Это означает, что DataGridView должен соответствовать вокруг своего содержимого, а не его содержимое должно соответствовать внутри DataGridView.

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

  • Размер границы
  • Заполнение
  • Размер разделителя ячеек
  • Высота заголовка строки
  • ширина заголовка столбца
  • способ заполнения DataGridView (DataBound или вручную)
  • ... намного больше

Лучше всего выбрать наборнекоторые критерии, которые соответствуют вашему конкретному сценарию, и напишите что-нибудь, что будет вычислять размер DataGridView для вас.

Вот мой конкретный сценарий в качестве примера:

  • моя сетка - данныесвязаны.Таким образом, его размер должен меняться каждый раз, когда завершается операция DataBinding.Это условие, которое запускает пересчет размера DataGridView.Поэтому я подключаю его к событию DataBindingComplete.

  • моя сетка не должна отображать полосы прокрутки.Поэтому я установил для свойства Scrollbars значение Нет.

  • Мой режим авторазмера строки и столбцов установлен на AllCells.

  • Заголовок Rows and Columnsне видныЕсли это так, их размеры должны быть включены в расчет.

Расширение метода ниже соответствует моим потребностям.Это очень просто, потому что мои сетки очень просты.Вам, вероятно, придется немного настроить его, чтобы он работал так, как вы хотите, и lot , чтобы он работал для всех сценариев 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);
    };
}
2 голосов
/ 21 июня 2011
1 голос
/ 03 июня 2019

Тема довольно старая, но если кому-то это все еще нужно, он может использовать grid.AutoResizeColumns () у меня отлично работает

0 голосов
/ 03 января 2016

Реальный ответ

Я написал этот код для вычисления точного размера сетки, используя цвет пикселя и сравнивая его с фоном. Это прекрасно работает для меня. Это вызывает некоторое мерцание, если вы используете autosize в содержащей форме, вы должны отключить 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);

        }
0 голосов
/ 09 декабря 2014

Вы можете просто изменить свойства dataGridView на

dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
0 голосов
/ 25 декабря 2012

Этот VB.NET перевод сработал для меня:

For i As Integer = 0 To dataGridView.ColumnCount - 1
    dataGridView.Columns(i).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...