none
изменение ширины столбцов DataGridView RRS feed

  • Вопрос

  • Подскажите, пожалуйста, как после редактирования ячейки сохранить ширину столбцов, которая была ДО редактирования. Если, к примеру, в DGV уменьшить ширину столбца и изменить значение какой-нибудь ячейки в этом столбце, то после редактирования ширина столбца "скачет" в первоначальное положение. Как это можно исправить? Какие события лучше всего обрабатывать? Чот мучаюсь мучаюсь и нихрена. Буду признателен работающему коду.

    DGV привязан к таблице из БД.


    Андрей

    24 июня 2019 г. 11:38

Ответы

  • "Буду признателен работающему коду"

    А какой именно код вы ожидаете? У меня в DGV с параметрами по умолчанию ничего не скачет. Возможно, у вас изменен параметр AutoSizeColumnsMode (или аналогичный на уровне отдельных столбцов) и вам просто нужно установить его в None. 

    "В чем может быть проблема ? каким образом могла измениться коллекция ?"

    Коллекция в вашем случае - словарь ColumnsFillWeights. Строка "ColumnsFillWeights[colName] =..."  изменяет словарь, делая итератор ColumnsFillWeights.Keys, по которому идет foreach, недействительным.  Простейший способ исправить это - проходить не по Keys, а по временной коллекции, созданной из Keys, например, вызовом ToList().

    25 июня 2019 г. 9:06
  • Да, очищать и заполнять заново тоже подходит. Но вообще, очищать необязательно. Так как у вас ключи - это названия столбцов, достаточно было бы сделать что-то вроде этого: 

    for(int i = 0;i<dataGridView.Columns.Count;i++){

    colName = dataGridView.Columns[i].Name;

    ColumnsFillWeights[colName] = ...

    }

    25 июня 2019 г. 18:55

Все ответы

  • Здравствуйте,

    Лучше показывать, как вы пытаетесь сделать и что не получается. А для сохранения ширины нужно скорее всег использовать Вам: DataGridView.ColumnWidthChanged Event

    См. тему: Практическое руководство. Настройка внешнего вида строк элемента управления DataGridView в Windows Forms


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    24 июня 2019 г. 12:58
    Модератор
  • Ок. Покажу как я это пытаюсь сделать.

    Событие DataGridView.ColumnWidthChanged не совсем рациональное, так как оно срабатывает при слишком многих изменениях в DGV.

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

    Dictionary<string, float> ColumnsFillWeights = new Dictionary<string, float>();

    Наполнить его значениями (Название столбца - Коэффициент ширины):

    ColumnsFillWeights.Add("Column1Name", 100);
    ColumnsFillWeights.Add("Column2Name", 100);
    ColumnsFillWeights.Add("Column3Name", 100);

    Далее перед тем как изменять значение в ячейке запоминаем ширину столбцов:

     private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
           {
               foreach (string colName in ColumnsFillWeights.Keys)
                {
                   ColumnsFillWeights[colName] =  dataGridView1.Columns[colName].FillWeight;
                }
            }

    а после редактирования пытаемся восстановить

    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellCancelEventArgs e)
           {
              foreach (string colName in ColumnsFillWeights.Keys)
              {
                 dataGridView1.Columns[colName].FillWeight = ColumnsFillWeights[colName];             
              }
           }

    Но при редактировании ячейки выскакивает исключение в событии CellBeginEdit()

    

    В чем может быть проблема ? каким образом могла измениться коллекция ?


    Андрей

    24 июня 2019 г. 14:07
  • "Буду признателен работающему коду"

    А какой именно код вы ожидаете? У меня в DGV с параметрами по умолчанию ничего не скачет. Возможно, у вас изменен параметр AutoSizeColumnsMode (или аналогичный на уровне отдельных столбцов) и вам просто нужно установить его в None. 

    "В чем может быть проблема ? каким образом могла измениться коллекция ?"

    Коллекция в вашем случае - словарь ColumnsFillWeights. Строка "ColumnsFillWeights[colName] =..."  изменяет словарь, делая итератор ColumnsFillWeights.Keys, по которому идет foreach, недействительным.  Простейший способ исправить это - проходить не по Keys, а по временной коллекции, созданной из Keys, например, вызовом ToList().

    25 июня 2019 г. 9:06
  • Насчет первого пункта да,я там намудрил чутка. 

    Насчет второго пункта не совсем понял. Может лучше очищать коллекцию и заново добавлять элементы ?!


    Андрей

    25 июня 2019 г. 17:45
  • Да, очищать и заполнять заново тоже подходит. Но вообще, очищать необязательно. Так как у вас ключи - это названия столбцов, достаточно было бы сделать что-то вроде этого: 

    for(int i = 0;i<dataGridView.Columns.Count;i++){

    colName = dataGridView.Columns[i].Name;

    ColumnsFillWeights[colName] = ...

    }

    25 июня 2019 г. 18:55