Как выделить измененные ячейки при обновлении DBgrid?
Допустим, я показываю цены на акции, спортивные результаты, посещаемость фильмов или что-то в этом роде.
Периодически я буду обновлять сетку с помощью Close(), а затем Open() запроса, связанного со связанным с ним источником данных.
Я знаю, как владелец рисовать ячейку с помощью OnDrawCell(), но я не могу понять, как узнать, совпадает ли новое значение с предыдущим значением для данной ячейки или отличается от него.
Я предполагаю, что здесь есть два варианта использования: один, где количество строк фиксировано, и они остаются в том же порядке строк, и один, где строки могут изменяться (вставка / удаление или переупорядочение).
Для первого я могу сделать снимок перед обновлением и сравнить после обновления, но это может быть много данных. Я не уверен, хочу ли я ограничить операцию видимыми в данный момент строками. Я думаю, что пользователь может захотеть прокрутить вниз и по-прежнему получать уведомления обо всех изменениях, произошедших во время последнего обновления.
Что касается последнего, я озадачен, если, конечно, у каждой строки нет уникального ключа.
Как я могу сделать это (эффективно)? Решение для TDbGrid помогло бы всем, решение с TAdvDbGrid от TMS Software было бы хорошо для меня (как и (желательно бесплатный) сторонний компонент).
1 ответ
TDBGrid
читает данные, которые в настоящее время содержатся в назначенном наборе данных. Он не способен запоминать предыдущие значения, выполнять вычисления или что-либо еще. Если вы хотите отслеживать изменения, вы должны сделать это самостоятельно. Вы можете сделать это несколькими способами (столбец предыдущего значения, таблица истории или что-то еще), но это не может быть сделано самой сеткой. TDBGrid
предназначен для представления данных, а не для их анализа или хранения.
Одним из предложений будет отслеживать его в наборе данных, используя BeforePost
событие, где вы можете хранить _oldvalue
из вашего в LastValue
столбец, а затем используйте его, чтобы увидеть, изменилось ли значение в вашем TDBGrid.OnDrawColumnCell
событие и изменить рисунок / окраску по мере необходимости. Что-то вроде if LastValue <> CurrValue then...
должно сработать.