Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Производительность DataGridViewComboBoxColumn, Заметно проигрывает MS Access ComboBox 
:(
    Опции темы
kuzyaka
Дата 13.1.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 17.12.2006

Репутация: нет
Всего: нет



С появлением DataGridViewComboBoxColumn в DataGridView наконец-то появилась возможность использовать ComboBox при заполнении таблиц данными.
Но ведь эта же возможность существует в MS Access уже давно.
Там вместо DataGridView используется форма в режиме таблицы, где в качестве поля ввода можно использовать ComboBox.

В MS Access я подключаюсь к базе данных MySQL через ODBC.
В качестве источника данных ComboBoxColumn я использую таблицу длиной более 5000 строк.
Здесь все работает очень быстро: и вывод таблицы на экран с большим количеством строк, и ComboBoxColumn раскрывается мгновенно, и автоподстановка прекрасно работает.

Когда я попробовал сделать тоже самое в DataGridView, то был очень озадачен низкой производительностью DataGridViewComboBoxColumn.
Здесь каждый раз при обращении к ComboBoxColumn процессор загружается до 100% и виснет порядка четырех-пяти секунд перед тем как список раскроется (процессор Celeron 1700, ОЗУ 512).
Причем в качестве провайдера подключения к данным я использую не ODBC, а более производительный MySQL Connector Net 5.0.3 (с ODBC все работает еще медленнее).
Подключение к данным стандартное:
Код

  Dim cnnNET As MySqlConnection
  Dim data As DataTable
  Dim da As MySqlDataAdapter
  Dim cb As MySqlCommandBuilder
  Dim connStr As String

  connStr = String.Format("server=localhost; user id=root; password=mypasswd; database=test_mysql; pooling=false")

  cnnNET = New MySqlConnection(connStr)
  сnnNET.Open()

  data = New DataTable
  da = New MySqlDataAdapter("SELECT InvN, TovarName FROM tblNomenclature ORDER BY TovarName", cnnNET)
  cb = New MySqlCommandBuilder(da)
  da.Fill(data)

  Me.ПолеСоСпискомTovarName.DataSource = data
  Me.ПолеСоСпискомTovarName.DisplayMember = "TovarName"
  Me.ПолеСоСпискомTovarName.ValueMember = "InvN"
  Me.ПолеСоСпискомTovarName.DataPropertyName = "InvN"

Я попробовал на примере из MSDN слепить пользовательский DataGridViewComboBoxColumn с использованием ComboBox из System.Windows.Forms.
Здесь на первый взгляд производительность заметно повысилась, но все равно отстает от MS Access, зависание примерно на одну секунду остается.

Отсюда вытекают следующие вопросы:
1. Действительно ли производительность DataGridViewComboBoxColumn такая низкая, или это у меня что то не так?
2. Если это так, то можно здесь что то сделать или все таки придется писать самому пользовательский DataGridViewComboBoxColumn с использованием ComboBox из System.Windows.Forms (подозреваю, работа предстоит не хилая)?
3. И последнее, стоит ли вообще заморачиваться с формами доступа к данным MySQL на Visual Studio, когда в MS Access в принципе есть все самое необходимое в готовом виде (единственно, что останавливает, так это то, что за саму MS Access надо не слабые деньги платить, тогда как есть бесплатные инструменты для создания NET приложений).

PS
У меня из-за этого головняка вся работа встала, никак не могу определиться в какую сторону двигаться.
Очень прошу откликнуться, полагаю ни я один такой на распутье оказался.
PM MAIL   Вверх
mr.DUDA
Дата 13.1.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Можно попробовать добавить индекс в DataTable (после Fill), по полю InvN. Для этого устанавливается свойство PrimaryKey:
Код
data.PrimaryKey = new DataColumn[] { data.Columns["InvN"] };



--------------------
user posted image
PM MAIL WWW   Вверх
kuzyaka
Дата 14.1.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 17.12.2006

Репутация: нет
Всего: нет



Цитата

Можно попробовать добавить индекс в DataTable (после Fill), по полю InvN.

Попробовал, тормоза те же.

Так что, это не только у меня тормозит?
Выход то есть какой нибудь?
PM MAIL   Вверх
mr.DUDA
Дата 14.1.2007, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Выход - либо использовать нормальные компоненты от сторонних производителей (например, попробовать DevExpress), либо для комбобокса использовать отдельный источник данных, заполняемый 1 раз вручную. Насчёт последнего не уверен, можно ли навесить на колонку грида такой источник, не пробовал.


--------------------
user posted image
PM MAIL WWW   Вверх
kuzyaka
Дата 15.1.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 17.12.2006

Репутация: нет
Всего: нет



Цитата

Выход - использовать нормальные компоненты от сторонних производителей

Означает ли это, что бесплатные компоненты NET Framework 2.0 - "ненормальные" в силу их бесплатности, т.е. своего рода демо версии в которые намеренно заложены "ненормальности" для того, чтобы вынудить разработчиков платить деньги за уже "нормальные" коммерческие компоненты?
Цитата

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

Приведенный мною код - это часть процедуры Sub New() класса формы.
Разве это не "отдельный источник данных, заполняемый 1 раз вручную"?


Это сообщение отредактировал(а) kuzyaka - 15.1.2007, 13:31
PM MAIL   Вверх
mr.DUDA
Дата 15.1.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(kuzyaka @  15.1.2007,  12:30 Найти цитируемый пост)
Означает ли это, что бесплатные компоненты NET Framework 2.0 - "ненормальные" в силу их бесплатности, т.е. своего рода демо версии в которые намеренно заложены "ненормальности" для того, чтобы вынудить разработчиков платить деньги за уже "нормальные" коммерческие компоненты?

Ну, можно и так сказать. Правда о преднамеренной ущербности говорить вряд ли можно, скорее у M$ просто не хватило времени и/или желания доводить некоторые свои компоненты до 100% коммерческого уровня. Бесплатное не бывает хорошим, по крайней мере не у мелкософт.

Цитата(kuzyaka @  15.1.2007,  12:30 Найти цитируемый пост)
Приведенный мною код - это часть процедуры Sub New() класса формы.Разве это не "отдельный источник данных, заполняемый 1 раз вручную"?

При раскрытии комбобокса, каждый раз происходит выборка данных из таблицы датасета.


--------------------
user posted image
PM MAIL WWW   Вверх
kuzyaka
Дата 15.1.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 17.12.2006

Репутация: нет
Всего: нет



Цитата

При раскрытии комбобокса, каждый раз происходит выборка данных из таблицы датасета.

Насколько я понимаю - это приговор, и ситуацию не изменить?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.