根据所有行的数据在 cxGrid 中设置样式

Set style in cxGrid based on data from all rows

我有几个网格,用户可以在其中输入从-到日期,并希望在日期间隔与其他行日期间隔重叠的行上设置背景色。

现在我在数据集上使用 oncalc 事件来设置重叠标志,但这是一个缓慢的解决方案,我想知道它是否可以在 cxGrid 中解决。

爱 B-)

我不知道您想在哪个时刻进行此验证,但您可以遍历网格数据集以检查是否有任何重叠的记录,并且可以使用不可见的未绑定列作为标志。

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 可以对数据行进行分组,并且可以切换进出 分组模式显示,一旦网格加载了数据集,它就拥有了所有的 对网格中的行进行分组、取消分组和排序所需的数据,而无需 重新遍历相关数据集。可以通过 DBTableView 的数据控制器的值 属性 访问数据。

您可以通过值访问网格中 DBTableView 中的数据行 属性 其关联的 DataController(参见其他答案或 cxGrid 的在线帮助) 就好像它是一个二维数组或矩阵 - 第一维是行 网格的索引,第二个是网格的列值之一的索引。

我将如何尝试你的任务是

  • 向数据集添加一个 fkInternalCalc 标志字段以指示行应该如何 被着色。需要在 OnCalcFields 事件中设置它的值,也不需要 OnCalcFields 中的任何其他内容。包含此计算字段的原因 只是这是一种无需获取 Values[] 值即可获得的简单方法 涉及 "unbound" 个网格列。

  • 将数据加载到网格后,将其作为二维数组处理以计算出哪个 rows需要特别着色,并为计算字段设置Values[entry]

  • 使用 DBTableView 的 OnCustomDrawCell 事件根据需要为单元格着色。

这可能需要对其实现细节进行一些微调,但我认为原则上它应该可行。

注意:这仅在 DataController 的 IsGridMode 属性 设置为 False 时有效。 如果设置为 True,则在任何时候只加载数据集行的子集, 所以网格不会分组,你将无法处理整个数据集 在 DataController 的值 属性.

中使用其 2D 表示

我最接近@Rigotti 代码的解决方案。但我找不到管理 OnCalc、OnDataChange 和 OnGetContentStyle 的方法。它触发了很多方式。

我们不久前切换到 FireDAC,我不知道它可以让你更新底层 table 即使查询本身不可更新。所以我计算了 sql 中的字段,不需要 OnCalc。