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

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

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

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

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

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

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

Ответы [ 23 ]

0 голосов
/ 20 мая 2017
foreach (DataGridViewColumn c in dataGridView.Columns)
    c.Width = c.GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells, true);

Это должно работать независимо от того, отображался dataGridView или нет (т.е. даже если он вызывается из конструктора класса).

Тот же метод, но с DataGridViewAutoSizeColumnMode.DisplayedCells, не работает в вышеуказанном случае по очевидной причине - ни одна ячейка еще не отображалась! По некоторой неочевидной причине AutoResizeColumns также не срабатывает в этом случае.

0 голосов
/ 13 апреля 2017
  • Спасибо за решение, приведенное выше (Чтобы перебрать DataGridView.Columns, измените AutoSizeMode на действительное, соберите значение ширины и установите его после изменения AutoSizeMode на DataGridViewAutoSizeColumnMode.None).
  • Я боролся с этим и заметил, что он не будет работать всякий раз, когда он вызывается из конструктора класса или из любой строки до Form.Show() или Form.ShowDialog(). Поэтому я поместил этот фрагмент кода в событие Form.Shown, и это работает для меня.
  • Мой преобразованный код, независимо от того, какой DataGridView.AutoSizeColumnsMode установлен ранее, я использую DataGridViewColumn.GetPreferredWidth() вместо изменения DataGridViewColumn.AutoSizeMode и сразу устанавливаю значение ширины, затем меняю DataGridView.AutoSizeColumnsMode один раз:

    private void form_Shown(object sender, EventArgs e)
    {
            foreach (DataGridViewColumn c in dataGridView.Columns)
                c.Width = c.GetPreferredWidth(DataGridViewAutoSizeColumnMode.DisplayedCells, true);
            dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
    }
    
  • Обязательно установите

            dataGridView.AllowUserToResizeColumns = true;
    
  • Я не знаю, почему это работает только после показа формы.

0 голосов
/ 04 февраля 2016

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

        private void dgv_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
            dgv.AutoResizeColumns();
            dgv.AllowUserToResizeColumns = true;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...