Установить стиль в 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.

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