|
datagridview медленная обработка строк
|
|||
---|---|---|---|
#18+
Доброго времени суток, Такой вопрос: есть dgv в который через DataTable передается таблица (3 колонки, 500000 строк) Необходимо временно убрать из видимости большую часть строк не попадающих под определенный фильтр (к примеру только 50 строк должно остаться видимым в определенный момент времени) Изначально используется конструкция вида Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
чтобы скрыть все строки но вот тут, даже при 100000 записей процесс растягивается на неприемлемо долгое время Вариант с фильтрацией самого датасета, работает быстро, но мне необходимо не менять сам датасет поскольку пользователь может вносить изменения в текущее отображение таблицы которые должны сохраняться вне зависимости от применения фильтра Предполагаю что возможно я неверно выбрал путь реализации и может Вы посоветуете что то лучше: Концепция задачи следующая: SQL Server хранит таблицу клиентов Clients (ID, Name) размером приблизительно в 500000 записей Необходим некий интерфейс который отображает представление данной таблицы в виде: Флаг отметки ИД клиента Имя клиента В данной сетке пользователь галками колонки "Флаг отметки" определяет какие клиенты должны попасть в отбор Также в данном интерфейсе есть поле "фильтр" в который пользователь может забить начальную часть имени клиента и по нажатию "Enter" сетка отобразит только те записи наименование которых начинается с текста фильтра Текущая моя реализация следующая: DataTable dt_Clients при загрузке формы исполняетя запрос выбирающий все записи клиентов Код: sql 1. 2. 3. 4.
через SqlDataAdapter заполняется dt_Clients и присваивается сетке в качестве DataSource Далее пользователь работает с сеткой: отслеживаем события dgv.CellContentClick если изменяемое значение находиться в колонке 0 определяем статус флажка True/False, если True добавляем ID клиента в таблицу DataTable dt_Marks, если False ищем в таблице dt_Marks значение ID клиента и убираем из нее собственно примитив но главное удобно и вот тут наступаем момент реализации фильтра в котором встречается описанная выше проблема, если бегать циклом по всем записям сетки это выливается в неприличное время ожидания. если переформировывать dt_Clients с необходимой фильтрацией придется дополнительно писать логику которая будет воссоздавать отображение отметок клиентов при получении/снятии фильтрации Еще вариант непосредственно избавиться от таблицы dt_Marks и вносить изменения в dt_Clients при событии "отметки клиента" но этот метод еще не протестировал Ваши предложения? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2015, 15:37 |
|
datagridview медленная обработка строк
|
|||
---|---|---|---|
#18+
felix_ff Изначально используется конструкция вида Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Такие подходы к фильтрации не взлетают. Во-первых, нужно избавиться от 500000 строк в гриде. Во-вторых, нужно фильтр применять на данные и потом уже подготовленные данные вставлять в грид Код: c# 1. 2. 3.
Фильтрация сканированием содержимого ячеек - это тихий ужас ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2015, 15:51 |
|
datagridview медленная обработка строк
|
|||
---|---|---|---|
#18+
В твоем случае фильтрацией должен заниматься сервер баз данных (то бишь оракл) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2015, 16:22 |
|
datagridview медленная обработка строк
|
|||
---|---|---|---|
#18+
Фильтрацию необходимо проводить в DataView. Его содержимое отображать в гриде, у него есть свойство (то ли Filter, то ли Select), позволяющее отобразить только те строки, которые удовлетворяют условию. При этом все они в оригинале всегда доступны в DataView.Table. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2015, 16:36 |
|
|
start [/forum/topic.php?fid=20&fpage=91&tid=1401799]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
24ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 49ms |
total: | 158ms |
0 / 0 |