Казалось бы, простой и древний вопрос по поводу раскраски DbGrid'а, для меня оказался не так прост.
Он касается цветного, полосатого DbGrid, размеченного в соответствии с группами (т.е. "черезгрупно").
В БД есть таблица Nodes2(Node2_id, Node1_id, Name). В ней: Node2_id - первичный ключ, а Node1_id - вторичный ключ, указывающий на другую таблицу Nodes1(Node1_id, Name). Ориентировочно, строк в таблице около 100, строк в группе 0-10. Для примера, данные таблицы, для полей Node2_id, Node1_id, такие:
1 1
2 2
3 3
4 2
5 1
Запрос, выводит данные отсортированные по полю Node1_id. Группой считаются одинаковые, подряд идущие значения Node1_id:
select Node2_id, Node1_id
from Nodes2
order by Node1_id;
1 1
5 1
2 2
4 2
3 3
В DbGrid, потребовалось раскрасить строки в два цвета, в соответствии с чередованием групп (третья колонка). Предполагалась, что пользователю, просматривающего таблицу с группировками, будет удобно ориентироваться в таблице по чередованию цветов группировок:
1 1 цвет по умолчанию
5 1 цвет по умолчанию
2 2 цвет 1
4 2 цвет 1
3 3 цвет по умолчанию
Первоначально, такая раскраска была выполнена только через событие TDBGridEh.onGetCellParams, в котором проверялись предыдущие и запоминались новые значения Node1_id и "метод закраски". Т.е. исходя из различия данных предыдущей и текущей записи. Такой способ работал до тех пор, пока таблица Nodes2 была мала и не вызывался scroll.
После этого, задача выбора цвета закраси группировки, целиком была перенесана в sql запрос. Простая выборка из Nodes2, соединяется с группировкой по Nodes2 и Nodes1, в котором и определяется будет закрашиваться строка цветом или нет. В этом варианте, sql запрос получился достаточно тяжёлым. Да и для правильной раскраски после каждого редактирования, требует перезагрузки данных всех записей запроса.
В первом варианте - подкупает его простота. А второй - ну очень уж громоздок для такой простой задачи.
Вопрос.
Как бы вы решили такую задачу:
- раскраси DbGrid, в два цвета, с чередованием по группам записей?
- удобной и простой в исполненнии навигации по таблице с группировками? Вполне возможно, что сама идея раскраски с чередованием цвета по группам, для этого избыточна.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
04-10-2022 02:26 | Вопрос к автору: запрос дополнительной информации
а если скомбинировать оба варианта? одно состояние один цвет, ярче-темнее, другое состояние другой цвет... и чересполосица, и цвет разный.
>>> в одной проге у меня есть справочник состояний поверки приборов, в котором пользователь задаёт цвет строки и шрифта. в результате в таблице, пользователь видит по цвету состояние прибора ...
На мой взгляд, в вашем примере решается задача "изображения состояния". Количество "возможных состояний" заранее известо и их небольшое число. Поэтому для каждого из них можно настроить специфическое изображение цветом и типом шрифта.
У меня же задача "вспомогательной навигации по таблице". Например, для вашего примера такое можно представить следующим образом. Допустим у вас, среди прочих, есть числовой параметр-свойство и таблица отсортирована по нему. Задача "изображения состояния" приборов никуда не делась и отображается цветом и типом шрифта. Но кроме этого, желательно как-то выделить группы значений, у которых параметр отличается, скажем, на 10. Другими словами, не изменяя задачу "изображения состояния", поверх неё, наложить задачу "вспомогательной навигации по таблице".
Так как вид группировки по числовому параметру заранее неизвестен (сколько будет в группе записей, сколько будет групп и в какой очерёдности они следуют), то, для простоты и было предложено использовать "черезполосицу по группам".
Приведу ещё один поясняющий мой вопрос пример. Это задача "отображения списка параметров", в которой нам потребовалась "вспомогательная навигация по таблице". Предполагается отобразить список параметров-переменных. У каждой такого параметра-переменной есть свойство "тип данных". Для примера, пусть значения свойства "тип данных" будут соответствовать перечню TFieldType из модуля Db (значений там около 40).
При отображении такого списка параметров-переменных в DbGrid, для каждого "типа данных" установить свою цветовую схему - избыточно сложно. Но если сгруппировать список по параметру "тип данных", то в каждую группу попадёт всего насколько записей, которые можно раскрасить "черезполосицей по этим группам". А такая раскраска намного удобнее для навигации, чем просто однотонный список. Образно, сравнивая с печатным текстом, можно сказать, что в первом случае у нас есть текст, разграниченный абзацами, а во втором - весь текст одним куском.
На словах всё выглядит просто. Но программная реализация, на мой взгляд, оказалась слишком сложна для такой задачи. Мой вопрос и касается этого несоответствия по сложности...
20-09-2022 03:39 | Комментарий к предыдущим ответам
в одной проге у меня есть справочник состояний поверки приборов, в котором пользователь задаёт цвет строки и шрифта. в результате в таблице пользователь видит по цвету состояние прибора, а при сортировке таблицы по состоянию поверки - приборы группируются по цвету и пользователь видит: как много приборов принято к работе, проверяется, поверено, выдано заказчику.
может этот вариант вам больше подойдёт?
для eugeni
Изначально, при решении задачи этого вопроса, было использовано два способа:
Первый - сравнение значений соседних записей в таблице.
Второй - создание отдельной, дополнительной таблицы с вычислением значения требуемого поля цвета раскраски.
Причём, такие способы можно использовать на разных уровнях компонент программы: DbGrid, DataSet, на сервере БД (в sql запросе).
Вы предложили третий способ решения, основанный на анализе значения "вторичного ключа".
Такое программное решение, подкупает своей простотой и эффективностью (хоть и несколько нарушает правила работы с БД ;-) ).
Но у меня сложилось впечатление, что предложенный вами способ не решит задач, заданного мною вопроса. При его использовании:
- раскраска Grid, с чередованием по группам записей, будет происходить лишь иногда. Вернее сказать, раскраска Grid будет происходить всегда, но соседние группы могут быть окрашены в один и тот же цвет. Но нам то нужно постоянное чередование цвета раскраски.
- непредсказуемость раскраски групп в Grid, скорее смутит пользователя, чем поможет ему в навигации по таблице с группировками.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.