Установить стиль в cxGrid на основе данных из всех строк
У меня есть несколько таблиц, в которые пользователи вводят промежуточные даты, и я хотел бы установить цвет фона для строк с интервалом дат, которые перекрывают интервал дат других строк.
Сейчас я использую событие oncalc в наборе данных, чтобы установить флаг перекрытия, но это медленное решение, и мне хотелось бы знать, решается ли оно вместо этого в cxGrid.
Ове Б-)
3 ответа
Я не знаю, в какой момент вы хотели бы выполнить эту проверку, но вы можете выполнить итерацию по набору данных сетки, чтобы проверить, есть ли какие-либо записи, которые перекрываются, и, возможно, использовать невидимый несвязанный столбец в качестве флага.
var
I, ARecordIndex: Integer;
begin
for I := 0 to cxGrid1DBTableView1.DataController.FilteredRecordCount - 1 do
begin
ARecordIndex := cxGrid1DBTableView1.DataController.FilteredRecordIndex[I];
if (Pos('ame2', cxGrid1DBTableView1.DataController.Values[ARecordIndex, cxGrid1DBTableView1Name.Index]) <> 0) then
cxGrid1DBTableView1.DataController.FocusedRecordIndex := ARecordIndex;
end;
end;
Я думаю, что вы должны быть в состоянии сделать это довольно простым способом. Тот факт, что cxGrid может выполнять группирование строк данных и может переключаться в режим группировки и выходить из него, показывает, что после того, как сетка загрузит набор данных, у нее будут все данные, необходимые для группировки, разгруппирования и сортировки строк в сетке без необходимость пересмотреть связанный набор данных. Данные доступны через свойство Values объекта DataController DBTableView.
Вы можете получить доступ к строкам данных в DBTableView в сетке через свойство Values его связанного DataController (см. Другой ответ или интерактивную справку cxGrid), как если бы это был двумерный массив или матрица - первое измерение - это строки сетка и вторая, индекс одного из значений столбца сетки.
Как бы я попытался, твоя задача была бы
Добавьте поле флага fkInternalCalc к набору данных, чтобы указать, как должна быть окрашена строка. Необходимо установить его значение в событии OnCalcFields и ничего не делать в OnCalcFields. Причина включения этого вычисляемого поля состоит в том, что это простой способ получить для него значение Values [] без участия в "несвязанных" столбцах сетки.
После того, как данные загружены в сетку, обработайте их как двумерный массив, чтобы определить, какие строки должны быть специально окрашены, и установите значения [запись] для вычисляемого поля.
Используйте событие OnCustomDrawCell DBTableView, чтобы закрасить ячейки, как вам нужно.
Это может потребовать тонкой настройки деталей его реализации, но я думаю, что в принципе это должно работать.
NB. Это будет работать только в том случае, если для свойства IsCridMode объекта DataController установлено значение False. Если для этого параметра установлено значение True, то в каждый момент времени загружается только подмножество строк набора данных, поэтому сетка не будет группироваться, и вы не сможете обработать весь набор данных, используя его двумерное представление в контроллере данных. Ценности собственности.
Я подошел ближе всего к решению с помощью кода @Rigotti. Но я не нашел способа управлять OnCalc, OnDataChange и OnGetContentStyle. Это положило начало многим.
Мы недавно перешли на FireDAC, и я не знал, что он позволит вам обновить базовую таблицу, даже если сам запрос не обновляется. Поэтому я рассчитал поля в sql и не нуждался в OnCalc.