DataGridView AutoFit and Fill

85

У меня 3 столбца в моем DataGridView . Я пытаюсь сделать так, чтобы первые 2 столбца автоматически соответствовали ширине содержимого, а третий столбец заполнил оставшееся пространство.

Можно ли в WinForms сделать? Я загружаю свои данные из EF DataContext, если это нужно. Я добавил изображение того, как это выглядит сейчас.

введите описание изображения здесь

Джеймс Джеффри
источник

Ответы:

168

Вам нужно использовать DataGridViewColumn.AutoSizeModeсобственность.

Вы можете использовать одно из этих значений для столбцов 0 и 1:

AllCells: ширина столбца регулируется, чтобы соответствовать содержимому всех ячеек в столбце, включая ячейку заголовка.
AllCellsExceptHeader: ширина столбца регулируется, чтобы соответствовать содержимому всех ячеек в столбце, за исключением ячейки заголовка.
DisplayedCells: ширина столбца регулируется в соответствии с содержимым всех ячеек в столбце, которые находятся в строках, отображаемых в данный момент на экране, включая ячейку заголовка.
DisplayedCellsExceptHeader: ширина столбца регулируется, чтобы соответствовать содержимому всех ячеек в столбце, которые находятся в строках, отображаемых в данный момент на экране, за исключением ячейки заголовка.

Затем вы используете значение Fill для столбца 2

Ширина столбца настраивается таким образом, чтобы ширина всех столбцов точно заполняла область отображения элемента управления ...

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

Как указали другие пользователи, значение по умолчанию может быть установлено на datagridviewуровне сDataGridView.AutoSizeColumnsMode свойства.

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;

может быть:

this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

Важная заметка:

Если ваша сетка привязана к источнику данных и столбцы генерируются автоматически (для AutoGenerateColumnsсвойства установлено значение True), вам необходимо использовать DataBindingCompleteсобытие для применения стиля ПОСЛЕ создания столбцов.


В некоторых сценариях (например, изменение значения ячеек по коду) мне приходилось вызывать, DataGridView1.AutoResizeColumns();чтобы обновить сетку.

Крис
источник
1
Отлично работает при использовании события DataBindingComplete.
Джеймс Джеффри
Я не могу понять, как вызвать метод DataBindingComplete после заполнения datagrid
Дэн
@Dan DataBindingComplete - это не метод , это событие datagridview, на которое вам нужно подписаться. Этот ответ stackoverflow.com/a/31685874/2387010 дает пример. Помогает?
Крис
Было бы полезно, если бы пример был объяснен, но этого будет достаточно. Статья MSDN , что вы связаны с вашей почтой это показано как метод, который я использовал в качестве своего шаблона, но не могу понять, как он вызывается.
Дэн
1
@Chris, эта недостающая информация определенно полезна, спасибо. Я читаю эту книгу и просто дошел до главы, посвященной делегатам и лямбда-функциям, так что, надеюсь, вскоре это станет более понятным. Спасибо!
Дэн
22

Это мой любимый подход ...

_dataGrid.DataBindingComplete += (o, _) =>
    {
        var dataGridView = o as DataGridView;
        if (dataGridView != null)
        {
           dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
           dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
    };
АльфредБр
источник
Если размер столбца = 0, index out of bound exceptionпросто исправьте это, спасибо !!
TiyebM
14

Просто измените Property из свойства элемента управления: AutoSizeColumnsMode:Fill

ИЛИ по коду

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;

Ахосан Карим Асик
источник
1
Спасибо. Я искал подобное решение! :)
Алин Чокан
4

Не проверено, но вы можете попробовать. Проверено и работает. Я надеюсь, что вы сможете поиграть с AutoSizeModeof, DataGridViewColumчтобы достичь того, что вам нужно.

Попробуйте установить

dataGridView1.DataSource = yourdatasource;<--set datasource before you set AutoSizeMode

//Set the following properties after setting datasource
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

Это должно работать

Шрирам Шакхивел
источник
Это не работает. Я устанавливаю его, когда форма инициализируется до добавления источника данных из DataContext. Может быть, поэтому? Я не уверен, где его установить, поскольку данные загружаются во время выполнения, а столбцы берутся из модели EF.
Джеймс Джеффри
Похоже, но нет, третья строка не работает, я тестировал это 10 минут назад.
King King
@JamesJeffery: вы заполняете столбцы автоматически или вручную?
Шрирам Сакхивел
@SriramSakthivel Я использую свойство dataGridView1.DataSource для привязки списка, возвращаемого из моего DataContext.
Джеймс Джеффри
0

Попробуйте сделать,

 AutoSizeColumnMode = Fill;
Аки
источник
0
public static void Fill(DataGridView dgv2)
   {
        try
        {
            dgv = dgv2;
            foreach (DataGridViewColumn GridCol in dgv.Columns)
            {
                for (int j = 0; j < GridCol.DataGridView.ColumnCount; j++)
                {
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                    GridCol.DataGridView.Columns[j].FillWeight = 1;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
Джей
источник
1
Этот код не очень хорош. Во-первых, вам не нужен вложенный цикл, который устанавливает одинаковый режим ширины всех столбцов много (<количество столбцов>) раз; вы можете получить доступ к свойствам AutoSizeMode и FillWeight каждого столбца непосредственно из GridCol. Во-вторых, он устанавливает AutoSizeMode для каждого столбца на два разных значения; второе присвоение перезапишет первое.
JonP 02
0

Чтобы основываться на ответе Альфредбра, если вы скрыли некоторые из своих столбцов, вы можете использовать следующее для автоматического изменения размера всех столбцов, а затем просто заполнить пустое пространство последним видимым столбцом:

myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode = 
    DataGridViewAutoSizeColumnMode.Fill;
RooiWillie
источник
0

Это то, что я сделал, чтобы столбец "first_name" заполнил пространство, когда все столбцы не могут этого сделать.

Когда сетка становится маленькой, столбец «first_name» становится почти невидимым (очень тонким), поэтому я могу установить для DataGridViewAutoSizeColumnMode значение AllCells в качестве других видимых столбцов. Для проблем с производительностью важно установить для них значение None перед привязкой данных и вернуть значение AllCell в обработчике событий DataBindingComplete сетки. Надеюсь, поможет!

private void dataGridView1_Resize(object sender, EventArgs e)
    {
        int ColumnsWidth = 0;
        foreach(DataGridViewColumn col in dataGridView1.Columns)
        {
            if (col.Visible) ColumnsWidth += col.Width;
        }

        if (ColumnsWidth <dataGridView1.Width)
        {
            dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
        else if (dataGridView1.Columns["first_name"].Width < 10) dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    }
Игнасио
источник
-1
public void setHeight(DataGridView src)
{
    src.Height= src.ColumnHeadersVisible ? src.ColumnHeadersHeight : 0 +   src.Rows.OfType<DataGridViewRow>().Where(row => row.Visible).Sum(row => row.Height);
}
Дурга Прасад Гунтотжу
источник
просто вызовите эту функцию, она позаботится о выборе высоты datagridview в зависимости от количества строк в нем
Дурга Прасад Гунтотжу
1
Прежде всего, это не ответ на вопрос ОП. Также (для использования в будущем) включите такой комментарий в сам ответ (вы можете его отредактировать).
Джоэл
-2

Попробуй это :

  DGV.AutoResizeColumns();
  DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
Судхир
источник