DataGridView AutoFit та Fill


85

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

Чи можна це робити в WinForms? Я завантажую свої дані з EF DataContext, якщо це корисно. Я включив зображення того, як це виглядає в даний час.

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

Відповіді:


168

Вам потрібно скористатися DataGridViewColumn.AutoSizeModeвласністю.

Ви можете використовувати одне з цих значень для стовпців 0 та 1:

AllCells: Ширина стовпця регулюється відповідно до вмісту всіх комірок стовпця, включаючи комірку заголовка.
AllCellsExceptHeader: Ширина стовпця регулюється відповідно до вмісту всіх комірок стовпця, за винятком комірки заголовка.
DisplayedCells: Ширина стовпця регулюється відповідно до вмісту всіх комірок стовпця, які знаходяться в рядках, що зараз відображаються на екрані, включаючи комірку заголовка.
DisplayedCellsExceptHeader: Ширина стовпця регулюється відповідно до вмісту всіх комірок у стовпці, які знаходяться в рядках, що зараз відображаються на екрані, за винятком комірки заголовка.

Потім ви використовуєте значення заповнення для стовпця 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 після заповнення сітки даних
Дан,

@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

Просто змініть властивість на властивість контролю: AutoSizeColumnsMode:Fill

АБО за кодом

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;


1
Дякую. Я шукав рішення, подібне до цього! :)
Алін Чокан

4

Не перевірено, але ви можете спробувати. Перевірено і працює. Сподіваюся, ви зможете пограти з AutoSizeModeним, 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, ви автоматично заповнюєте стовпці або заповнюєте вручну?
Sriram Sakthivel

@SriramSakthivel Я використовую властивість dataGridView1.DataSource для прив'язки Списку, що повертається з мого DataContext.
Джеймс Джеффрі,


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.03.16

0

Щоб спиратися на відповідь AlfredBr, якщо ви приховали деякі зі своїх стовпців, ви можете використовувати наступне для автоматичного розміру всіх стовпців, а потім просто останнє видиме стовпець заповнити порожній простір:

myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode = 
    DataGridViewAutoSizeColumnMode.Fill;

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 на основі кількості рядків у ній
Durga Prasad Guntoju

1
Перш за все, це не відповідає на запитання ОП. Також (для подальшого використання) включіть такий коментар до самої відповіді (ви можете її редагувати).
Джоел

-2

Спробуйте це :

  DGV.AutoResizeColumns();
  DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.