powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / datagridview медленная обработка строк
4 сообщений из 4, страница 1 из 1
datagridview медленная обработка строк
    #38901495
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток,

Такой вопрос: есть dgv в который через DataTable передается таблица (3 колонки, 500000 строк)

Необходимо временно убрать из видимости большую часть строк не попадающих под определенный фильтр (к примеру только 50 строк должно остаться видимым в определенный момент времени)

Изначально используется конструкция вида
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim row as DataGridViewRow
for i = 0 to grid_MainGrid.Rows.Count - 1
     row = grid_MainGrid.Rows(i)
     if row.Cells("Name").Value.ToString() = filter_value Then 'условие фильтрации другое - для примера написал обычное сравнение
          row.Visible = True
     Else
          row.Visible = False
     End If
Next i

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


Вариант с фильтрацией самого датасета, работает быстро, но мне необходимо не менять сам датасет поскольку пользователь может вносить изменения в текущее отображение таблицы которые должны сохраняться вне зависимости от применения фильтра

Предполагаю что возможно я неверно выбрал путь реализации и может Вы посоветуете что то лучше:
Концепция задачи следующая: SQL Server хранит таблицу клиентов Clients (ID, Name) размером приблизительно в 500000 записей

Необходим некий интерфейс который отображает представление данной таблицы в виде:
Флаг отметки ИД клиента Имя клиента

В данной сетке пользователь галками колонки "Флаг отметки" определяет какие клиенты должны попасть в отбор
Также в данном интерфейсе есть поле "фильтр" в который пользователь может забить начальную часть имени клиента и по нажатию "Enter" сетка отобразит только те записи наименование которых начинается с текста фильтра

Текущая моя реализация следующая: DataTable dt_Clients при загрузке формы исполняетя запрос выбирающий все записи клиентов
Код: sql
1.
2.
3.
4.
SELECT CONVERT(BIT, 0) AS Mark,
           ClientID as ClientID,
           ClientName AS Name
FROM Clients WITH(NOLOCK)

через SqlDataAdapter заполняется dt_Clients и присваивается сетке в качестве DataSource

Далее пользователь работает с сеткой: отслеживаем события dgv.CellContentClick если изменяемое значение находиться в колонке 0 определяем статус флажка True/False, если True добавляем ID клиента в таблицу DataTable dt_Marks, если False ищем в таблице dt_Marks значение ID клиента и убираем из нее

собственно примитив но главное удобно
и вот тут наступаем момент реализации фильтра в котором встречается описанная выше проблема, если бегать циклом по всем записям сетки это выливается в неприличное время ожидания.

если переформировывать dt_Clients с необходимой фильтрацией придется дополнительно писать логику которая будет воссоздавать отображение отметок клиентов при получении/снятии фильтрации

Еще вариант непосредственно избавиться от таблицы dt_Marks и вносить изменения в dt_Clients при событии "отметки клиента" но этот метод еще не протестировал

Ваши предложения?
...
Рейтинг: 0 / 0
datagridview медленная обработка строк
    #38901512
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Изначально используется конструкция вида
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim row as DataGridViewRow
for i = 0 to grid_MainGrid.Rows.Count - 1
     row = grid_MainGrid.Rows(i)
     if row.Cells("Name").Value.ToString() = filter_value Then 'условие фильтрации другое - для примера написал обычное сравнение
          row.Visible = True
     Else
          row.Visible = False
     End If
Next i



Такие подходы к фильтрации не взлетают. Во-первых, нужно избавиться от 500000 строк в гриде. Во-вторых, нужно фильтр применять на данные и потом уже подготовленные данные вставлять в грид
Код: c#
1.
2.
3.
IEnumerable<Model> filteredList = FilterData(globalList, filter_value);
myBindingSource.DataSource = filteredList;
myGrid.DataSource = myBindingSource;



Фильтрация сканированием содержимого ячеек - это тихий ужас
...
Рейтинг: 0 / 0
datagridview медленная обработка строк
    #38901552
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В твоем случае фильтрацией должен заниматься сервер баз данных (то бишь оракл)
...
Рейтинг: 0 / 0
datagridview медленная обработка строк
    #38906108
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фильтрацию необходимо проводить в DataView. Его содержимое отображать в гриде, у него есть свойство (то ли Filter, то ли Select), позволяющее отобразить только те строки, которые удовлетворяют условию.
При этом все они в оригинале всегда доступны в DataView.Table.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / datagridview медленная обработка строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]