2013-06-19 1 views
-1

Предположим, что я показываю цены на акции, спортивные результаты или посещаемость фильмов или что-то в этом роде.Как выделить измененные ячейки при обновлении DBgrid?

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

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

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

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

Для последнего я в тупике, если, конечно, каждая строка не имеет уникального ключа.

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

+2

Если этот DBGrid предназначен только для отображения данных, вы можете либо кэшировать предыдущие данные, либо сравнивать их с новыми извлеченными записями, либо вы можете сделать запрос, содержащий как текущие, так и предыдущие значения данных, которые вы хотите отслеживать. Таким образом, легко сравнивать значения и соответственно менять цвет. – LightBulb

ответ

2

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

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

+0

+1 @kenwhite Да, я думал, что будет слишком много надеяться на 'OnCellChanging (oldValue, newValue)'. Он выглядит как моментальный снимок, обновление, сравнение, colo (ur). – Mawg