Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 25

Тормозит dataGridView при повторной инициализации

06.12.2013, 03:33. Показов 2373. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть dataGridView размера примерно 40x16.
Изначально в конструкторе таблица имеет всего один столбец, а при инициализации
я этот столбец клонирую на все остальные 40 посредством add().
Перед клонированием я изменяю ширину таблицы до 1 столбца (чтобы аннулировать все столбцы, которые были в таблице до этого, т.к. таблица у меня в зависимости от ситуации инициализируется на разное число столбцов, не только 40).
Далее заполняю таблицу данными.
В первый раз таблица строится мгновенно.

Если же я хочу переинициализировать таблицу, и заново прохожу описанные этапы:
1. Изменяю размер таблицы до 1 столбца
2. Клонирую столбец номер 1 на нужное число столбцов
3. Заполняю данными

То второй раз она строится ОЧЕНЬ долго, вплоть до 5-10 секунд.
С чем это может быть связано, и как этого избежать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.12.2013, 03:33
Ответы с готовыми решениями:

DataGridView тормозит при перемещении
Приветствую.Добавил дочернюю форму, в неё поместил datagridview теперь при перекрещении дочерней формы она тормозит это при том что данные...

DatagridView тормозит при загрузке данных
var dataAdapter = new SqlDataAdapter(command, _connection); var dataSet = new DataSet(); ...

Тормозит прокрутка таблицы DataGridView при загруженной базе в 78 строк
Как можно исправить, или настроить DataGridView на более плавную работу и прокрутку, а то уже второе приложение пишу с использованием этого...

6
 Аватар для Remmor
71 / 71 / 23
Регистрация: 02.02.2012
Сообщений: 309
06.12.2013, 05:51
А просто удалить столбцы разве нельзя? А данные в каком формате Вы въюхе даете?

Цитата Сообщение от AndreyDev Посмотреть сообщение
В первый раз таблица строится мгновенно.
В первый раз таблица с 1 столбцом?
0
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 25
06.12.2013, 08:43  [ТС]
Цитата Сообщение от Remmor Посмотреть сообщение
А просто удалить столбцы разве нельзя? А данные в каком формате Вы въюхе даете?


В первый раз таблица с 1 столбцом?
А разве при dataGridView->ColumnCount = 1;, все столбцы, кроме 1-го не удаляются?

Данные даю сам через Value = "blablabla";
0
 Аватар для Remmor
71 / 71 / 23
Регистрация: 02.02.2012
Сообщений: 309
06.12.2013, 09:07
В описании свойства: Возвращает или задает количество столбцов, отображаемых в DataGridView. Очень смущает слово "отображаемых ". Так что видимо нет, не удаляет. Посмотрите чему равно: dataGridView.Columns.count; на каждом этапе.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
06.12.2013, 09:18
Remmor, вы бы дальше заголовка по своей же ссылке прочитали бы:
Заметки

Установка свойства ColumnCount до 0 удаляет все столбцы из DataGridView.

Если ColumnCount сброшено значение меньше текущего значения, то столбцы будут удалены из конца коллекции Columns. Если ColumnCount присвоено значение больше текущего значения, то столбцы добавляются в конец коллекции Columns.

Это свойство может использоваться вместе с свойством RowCount чтобы создать простое DataGridView для отображения и редактирования текста.

Дополнительные сведения об обработке событий см. в разделе Прием событий.
0
 Аватар для Remmor
71 / 71 / 23
Регистрация: 02.02.2012
Сообщений: 309
06.12.2013, 11:06
kodv, согласен ошибся.
0
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 25
07.12.2013, 03:40  [ТС]
Думаю, что все тормоза у меня из-за того, что я каждой ячейке задаю напрямую некоторые свойства, а не по шаблону.

Потестировал, получилось примерно так:
1. Если задавать тип ячейки напрямую, например DataGridViewTextBoxCell,
то тормозит 2 секунды
2. Если задавать padding для ячейки, например Windows::Forms::Padding(10, 0, 10, 0),
то тормозит аж 13 секунд, тогда как при установке какого-нибудь другого свойства из категории Style, например, цвета, на скорость практически не влияет.

И снова повторюсь, все тормоза только при вторичной инициализации столбцов, при первичной тормозов нет.

Добавлено через 2 часа 34 минуты
Провел еще ряд тестов.
Если установить AutoSizeRowsMode = AllCells, то времени на повторную инициализацию тратится еще в 3 раза больше (это ахтунг - 30 секунд).

Если стиль отступа для ячейки установить не так
C++
1
    dataGridView[i, j]->Style->Padding = Windows::Forms::Padding(10, 0, 10, 0);
а заранее:
C++
1
2
    DataGridViewCellStyle^  dataGridViewCellStyleTest = gcnew DataGridViewCellStyle();
    dataGridViewCellStyleTest->Padding = System::Windows::Forms::Padding(10, 0, 10, 0);
и потом использовать так:
C++
1
    dataGridView[i, j]->Style = dataGridViewCellStyleTest;
то тормоза, связанные с установкой стиля пропадают полностью.

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

Добавлено через 1 час 35 минут
Еще одна интересная заметка.
Если в колонке, у которой по умолчанию стоит тип DataGridViewCheckBoxCell, переопределить какую-либо ячейку на тип DataGridViewTextBoxCell, то все работает хорошо.
Однако, если после такой процедуры убрать данную смешанную колонку, потом опять добавить пустую и попытаться в ней сделать тоже самое, то вылетает ошибка "недопустимый тип значения, определяющего форматирование ячейки"

Добавлено через 6 часов 18 минут
И с этой проблемой разобрался.

Оказалось, что если в столбце с ячейками типа DataGridViewCheckBoxColumn изменить какую-либо ячейку на DataGridViewTextBoxColumn, и при этом у столбца стоит режим AutoSizeMode, учитывающий ширину всех ячеек в столбце, например AllCells, то произойдет ошибка форматирования столбца 'Error happened Formatting, PreferredSize'.

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

C++
1
2
3
4
5
6
7
            dataGridView1->Columns[0]->AutoSizeMode = DataGridViewAutoSizeColumnMode::None;
 
            dataGridView1[0, 4] = gcnew DataGridViewTextBoxCell;
 
            dataGridView1[0, 4]->Value = "Безобразие";
 
            dataGridView1->Columns[0]->AutoSizeMode = DataGridViewAutoSizeColumnMode::AllCells;
Добавлено через 16 минут
И нашлась еще одна фига с маслом (

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

Сумма значений FillWeight столбцов не должна превышать 65535.

Т.е., допустим, я 10 раз подряд делаю такое действо:
1. Убрать 50 столбцов
2. Добавить 50 столбцов.

В конце концов это приводит к вышеописанной ошибке, как будто таблица разрослась до 500 (или около того) столбцов, хотя на деле ее ширина именно 50.

Добавлено через 1 час 56 минут
В итоге решил все проблемы разом:

1. Проблема тормозов при переинициализации таблицы, а так же конечное число сеансов добавления новых столбцов, решил простым методом - делаю таблицу из фиксированного числа столбцов (по максимуму, которые мне могут понадобиться), а затем просто ненужные столбцы делаю невидимыми (Visible = false). Вот и все.

2. Проблема ошибки форматирования при добавлении разнородных ячеек в один столбец, при включенном режиме AutoSizeMode = AllCells решаю так - добавляю все ячейки еще до первого отображения таблицы на экране, тогда ошибка форматирования не сработает, т.к. столбцы еще не форматировались. Если же надо изменить тип ячейки в уже хоть раз отрисованной таблице, то просто надо выключить форматирование для столбца, изменить ячейки, и включить форматирование снова.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.12.2013, 03:40
Помогаю со студенческими работами здесь

Избавиться от повторной вставке при перезагрузке
У меня такая проблема, написал не большой код, а при перезагрузке те же самые данные вставляются снова, как этого избежать?! Вот...

Ошибка при повторной установке CorelDraw X8
Доброго времени суток. Столкнулся со следующей проблемой при повторной установке КореХ8 на ПК, ранее была установлена офф версия с месячным...

Ошибка при повторной компиляции Marlin_MC3_11062014
Здравствуйте, друзья! Примите несмышлёного новичка в свой круг. Я в тупике. Помогите выбраться. Я взялся за редактирование текста...

Бывают ли косяки при повторной активации Windows 8.1?
Бывают ли проблемы при повторной активации Windows 8.1? К примеру вы купили лицензионный Windows 8.1. Месяц попользовались и по...

POLINK: fatal error при повторной компиляции
Всеееем здрасьте, я вас не замучал ещё? Ладно, перейдём к проблеме: Значит, я скомпилировал ехе на раб стол, всё в порядке, запустил,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru