Лучший отвечающий
изменение ширины столбцов DataGridView

Вопрос
-
Подскажите, пожалуйста, как после редактирования ячейки сохранить ширину столбцов, которая была ДО редактирования. Если, к примеру, в DGV уменьшить ширину столбца и изменить значение какой-нибудь ячейки в этом столбце, то после редактирования ширина столбца "скачет" в первоначальное положение. Как это можно исправить? Какие события лучше всего обрабатывать? Чот мучаюсь мучаюсь и нихрена. Буду признателен работающему коду.
DGV привязан к таблице из БД.
Андрей
24 июня 2019 г. 11:38
Ответы
-
"Буду признателен работающему коду"
А какой именно код вы ожидаете? У меня в DGV с параметрами по умолчанию ничего не скачет. Возможно, у вас изменен параметр AutoSizeColumnsMode (или аналогичный на уровне отдельных столбцов) и вам просто нужно установить его в None.
"В чем может быть проблема ? каким образом могла измениться коллекция ?"
Коллекция в вашем случае - словарь ColumnsFillWeights. Строка "ColumnsFillWeights[colName] =..." изменяет словарь, делая итератор ColumnsFillWeights.Keys, по которому идет foreach, недействительным. Простейший способ исправить это - проходить не по Keys, а по временной коллекции, созданной из Keys, например, вызовом ToList().
- Предложено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 25 июня 2019 г. 10:59
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 26 июня 2019 г. 10:22
25 июня 2019 г. 9:06 -
Да, очищать и заполнять заново тоже подходит. Но вообще, очищать необязательно. Так как у вас ключи - это названия столбцов, достаточно было бы сделать что-то вроде этого:
for(int i = 0;i<dataGridView.Columns.Count;i++){
colName = dataGridView.Columns[i].Name;
ColumnsFillWeights[colName] = ...
}
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 26 июня 2019 г. 10:22
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().
- Предложено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 25 июня 2019 г. 10:59
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 26 июня 2019 г. 10:22
25 июня 2019 г. 9:06 -
Насчет первого пункта да,я там намудрил чутка.
Насчет второго пункта не совсем понял. Может лучше очищать коллекцию и заново добавлять элементы ?!
Андрей
25 июня 2019 г. 17:45 -
Да, очищать и заполнять заново тоже подходит. Но вообще, очищать необязательно. Так как у вас ключи - это названия столбцов, достаточно было бы сделать что-то вроде этого:
for(int i = 0;i<dataGridView.Columns.Count;i++){
colName = dataGridView.Columns[i].Name;
ColumnsFillWeights[colName] = ...
}
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 26 июня 2019 г. 10:22
25 июня 2019 г. 18:55