Как вы автоматически изменяете размеры столбцов в элементе управления DataGridView И позволяете пользователю изменять размер столбцов в той же сетке? - PullRequest
102 голосов
/ 22 июня 2009

Я заполняю элемент управления DataGridView в форме Windows (C # 2.0, а не WPF).

Моя цель состоит в том, чтобы отобразить сетку, которая аккуратно заполняет всю доступную ширину ячейками, то есть не использует неиспользуемые (темно-серые) области вниз по правому краю и подбирает каждый столбец соответствующим образом в соответствии с данными, которые он содержит, , но также позволяет пользователю изменять размер любого столбца по своему вкусу.

Я пытаюсь добиться этого, устанавливая AutoSizeMode каждого столбца равным DataGridViewAutoSizeColumnMode.AllCells за исключением одного из столбцов, для которого я установил DataGridViewAutoSizeColumnMode.Fill . вся область сетки аккуратно заполнена данными. (Я не возражаю, что когда пользователь пытается изменить размер этого столбца, он возвращается к размеру, который гарантирует, что горизонтальное пространство всегда используется.)

Однако, как я уже упоминал, после загрузки я хотел бы разрешить пользователю изменять размер столбцов в соответствии со своими требованиями - при установке этих значений AutoSizeMode для каждого столбца оказывается, что пользователь не сможет затем изменить размер этих столбцов.

Я пытался не устанавливать AutoSizeMode для всех столбцов, что позволяет изменять размер, НО не устанавливает начальный размер в соответствии с данными, содержащимися в ячейках. Тот же результат возникает при изменении значения AutoSizeMode сетки обратно на «Не установлено» после загрузки данных.

Есть ли здесь пропущенная настройка, позволяющая автоматически устанавливать ширину столбцов по умолчанию и изменение размера пользователя, или есть другой метод, который я должен использовать при заполнении элемента управления DataGridView?

Ответы [ 23 ]

2 голосов
/ 28 декабря 2012

Немного более точный код C # из кода Мирослава Задравца, предполагающий, что все столбцы должны быть автоматически изменены

for (int i = 0; i < dgvProblems.Columns.Count; i++)
{
    dgvProblems.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    int colw = dgvProblems.Columns[i].Width;
    dgvProblems.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    dgvProblems.Columns[i].Width = colw;
}
2 голосов
/ 27 февраля 2014

Еще одна версия кода Мирослава Задравца, но немного более автоматизированная и универсальная:

    public Form1()
    {
        InitializeComponent();
        dataGridView1.DataSource = source;
        for (int i = 0; i < dataGridView1.Columns.Count - 1; i++) {
            dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
        }
        dataGridView1.Columns[dataGridView1.Columns.Count].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

    }

    void Form1Shown(object sender, EventArgs e)
    {
        for ( int i = 0; i < dataGridView1.Columns.Count; i++ )
        {
            int colw = dataGridView1.Columns[i].Width;
            dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
            dataGridView1.Columns[i].Width = colw;
        }
    }

Я помещаю вторую часть в отдельное событие, потому что я заполняю datagridvew при инициализации формы, и если обе части есть, ничего не меняется, потому что, вероятно, autosize вычисляет ширину после отображения datagridview, поэтому ширина по-прежнему по умолчанию в Form1() метод. После завершения этого метода autosize делает свое дело, и сразу после этого (когда отображается форма) мы можем установить ширину по второй части кода (здесь, в событии Form1Shown). Это работает для меня как шарм.

2 голосов
/ 06 августа 2018

У меня работают две простые строки кода.

dataGridView.DataSource = dataTable;
dataGridView.AutoResizeColumns();
2 голосов
/ 06 февраля 2017

Вот упрощенный код ответа Мирослава Задравца на c #:

CurrentDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader;
for (int i = 0; i < dataGridView1.Columns.Count; i++) dataGridView1.Columns[i].Width = dataGridView1.Columns[i].Width;
CurrentDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
1 голос
/ 26 декабря 2013

Ширина столбца установлена ​​в соответствии с его содержимым. Я использовал приведенный ниже оператор, Это решило мою проблему.

Первый шаг:

RadGridViewName.AutoSize = true;

Второй шаг:

// This mode  fit in the header text and column data for all visible rows. 
this.grdSpec.MasterTemplate.BestFitColumns();

Третий шаг:

for (int i = 0; i < grdSpec.Columns.Count; i++) 
{
    // The column width adjusts to fit the contents all cells in the control.
    grdSpec.Columns[i].AutoSizeMode = BestFitColumnMode.AllCells; 
}
1 голос
/ 27 февраля 2012

Вы пытались настроить свойство FillWeight вашего DataGridViewColumns объекта?

Например:

this.grid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
this.grid1.Columns[0].FillWeight = 1.5;

Я думаю, что это должно работать в вашем случае.

1 голос
/ 14 апреля 2013

Небольшое улучшение от версии Schnapple

int nLastColumn = dgv.Columns.Count - 1;
for (int i = 0; i < dgv.Columns.Count; i++)
{
    if (nLastColumn == i)
    {
        dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    }
    else
    {
        dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    }
}

for (int i = 0; i < dgv.Columns.Count; i++)
{
    int colw = dgv.Columns[i].Width;
    dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    dgv.Columns[i].Width = colw;
}
1 голос
/ 23 сентября 2013

dataGridView1.AutoResizeColumns ();

0 голосов
/ 13 июля 2018

Вы можете сделать что-то вроде этого:

   grd.DataSource = getDataSource();

    if (grd.ColumnCount > 1)
    {
        for (int i = 0; i < grd.ColumnCount-1; i++)
            grd.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;

        grd.Columns[grd.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    }

    if (grd.ColumnCount==1)
        grd.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

Все столбцы будут адаптированы к содержимому, кроме последнего заполнит сетку.

0 голосов
/ 07 июля 2017

Я должен был сделать это в VB и предпочесть разделить его на метод, который я поместил в модуль. При желании вы можете добавить столбец Fill в качестве другого параметра ByRef.

''' <summary>
''' Makes all columns in a DataGridView autosize based on displayed cells,
''' while leaving the column widths user-adjustable.
''' </summary>
''' <param name="dgv">A DataGridView to adjust</param>
Friend Sub MakeAdjustableAutoSizedGridCols(ByRef dgv As DataGridView)
    Dim width As Integer

    For Each col As DataGridViewColumn In dgv.Columns
        col.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
        width = col.Width
        col.AutoSizeMode = DataGridViewAutoSizeColumnMode.None
        col.Width = width
    Next
    dgv.AllowUserToResizeColumns = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...