Как выделить измененные ячейки при обновлении DBgrid?

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

Периодически я буду обновлять сетку с помощью Close(), а затем Open() запроса, связанного со связанным с ним источником данных.

Я знаю, как владелец рисовать ячейку с помощью OnDrawCell(), но я не могу понять, как узнать, совпадает ли новое значение с предыдущим значением для данной ячейки или отличается от него.

Я предполагаю, что здесь есть два варианта использования: один, где количество строк фиксировано, и они остаются в том же порядке строк, и один, где строки могут изменяться (вставка / удаление или переупорядочение).

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

Что касается последнего, я озадачен, если, конечно, у каждой строки нет уникального ключа.

Как я могу сделать это (эффективно)? Решение для TDbGrid помогло бы всем, решение с TAdvDbGrid от TMS Software было бы хорошо для меня (как и (желательно бесплатный) сторонний компонент).

1 ответ

Решение

TDBGrid читает данные, которые в настоящее время содержатся в назначенном наборе данных. Он не способен запоминать предыдущие значения, выполнять вычисления или что-либо еще. Если вы хотите отслеживать изменения, вы должны сделать это самостоятельно. Вы можете сделать это несколькими способами (столбец предыдущего значения, таблица истории или что-то еще), но это не может быть сделано самой сеткой. TDBGrid предназначен для представления данных, а не для их анализа или хранения.

Одним из предложений будет отслеживать его в наборе данных, используя BeforePost событие, где вы можете хранить _oldvalue из вашего в LastValue столбец, а затем используйте его, чтобы увидеть, изменилось ли значение в вашем TDBGrid.OnDrawColumnCell событие и изменить рисунок / окраску по мере необходимости. Что-то вроде if LastValue <> CurrValue then... должно сработать.

Другие вопросы по тегам