Невозможно назначить свойство datagridview.columns [i] .Width - PullRequest
3 голосов
/ 29 марта 2012

Я пишу метод, который изменяет размеры столбцов в сетке данных так, чтобы все данные были видны, и столбцы полностью заполняли сетку данных.Что я делаю:

1) Установите DataGridViewAutoSizeColumnsMode в AllCells.Это покажет все данные в ячейках.

2) Рассчитайте расстояние в пикселях между правым краем последнего столбца и правым краем вида сетки данных.

3) Разделите это расстояние на количество столбцов.Это дает мне ширину, которая должна быть добавлена ​​к каждому столбцу для полного заполнения таблицы данных.

4) Добавьте ширину от (3) к каждому столбцу.

Теоретически, это отобразит вседанные в столбцах и полностью заполняют сетку данных.

Если для DataGridViewAutoSizeColumnsMode установлено значение fill, все ширины столбцов равны.Однако не все мои данные имеют одинаковую ширину.Так что с ColumnsMode, установленным для заполнения, у меня есть данные, бегущие по краям в некоторых ячейках, и куча пробелов в других ячейках.Но установите AllCells, и я получаю большой разрыв между самым правым столбцом и правым краем сетки данных.

В связи с проблемой: я не могу установить свойство ширины столбца.Я понимаю, что не рассматривал случай, когда общая ширина столбца превышает ширину таблицы данных.

private void autoSizeDGV(DataGridView dgv)
    {
        try
        {
            //Step 1
            dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            //Step 2
            int totalcellwidth = 0;
            for (int i = 0; i < dgv.ColumnCount; i++)
            {
                totalcellwidth += dgv.Columns[i].Width;
            }
            //Step 3
            int widthtoadd = (dgv.Width - totalcellwidth)/dgv.ColumnCount;
            //Step 4
            for (int i = 0; i < dgv.ColumnCount; i++)
            {
                Debug.WriteLine("previous dgv.Columns[" +i+ "]: " + dgv.Columns[i].Width);
                dgv.Columns[i].Width += widthtoadd;
                Debug.WriteLine("after dgv.Columns[" + i + "]: " + dgv.Columns[i].Width);
            }
        }

1 Ответ

2 голосов
/ 03 апреля 2012

Ну, я ответил на свой вопрос.Оператор dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; будет переопределять любые не-пользовательские изменения ширины столбца.Таким образом, попытка программно изменить ширину не нужна.Но используя dgv.AutoResizeColumns(); на своем месте, все работает.

Итак, правильный метод:

private void autoSizeDGV(DataGridView dgv)
    {
        try
        {
            //Step 1
            dgv.AutoResizeColumns();

            //Step 2
            int totalcellwidth = 0;
            for (int i = 0; i < dgv.ColumnCount; i++)
            {
                totalcellwidth += dgv.Columns[i].Width;
            }
            //Step 3
            int widthtoadd = (dgv.Width - totalcellwidth) / dgv.ColumnCount;
            //Step 4
            for (int i = 0; i < dgv.ColumnCount; i++)
            {
                Debug.WriteLine("previous dgv.Columns[" + i + "]: " + dgv.Columns[i].Width);
                dgv.Columns[i].Width += widthtoadd;
                Debug.WriteLine("after dgv.Columns[" + i + "]: " + dgv.Columns[i].Width);
            }
        }
...