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

时间:2016-04-26 12:38:22

标签: delphi devexpress tcxgrid

我有几个网格,用户从哪里进入日期,并希望在日期间隔与日期间隔重叠的行上设置背景颜色。

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

Ove B - )

3 个答案:

答案 0 :(得分:2)

我认为你应该能够以相当直接的方式做到这一点。事实 cxGrid可以对数据行进行分组,可以切换进出 分组模式显示,一旦网格加载了数据集,它就拥有了所有数据集 必要的数据,可以对网格中的行进行分组,取消组合和排序 重新遍历相关数据集。可以通过DBTableView的DataController的Values属性访问数据。

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

我将如何尝试你的任务

  • 向数据集添加fkInternalCalc标志字段以指示行应该如何 被上色。需要在OnCalcFields事件中设置其值,也不需要 OnCalcFields中的任何其他内容。包含此计算字段的原因 只是它是一种简单的方法,可以获得它的Values []值 参与“未绑定”的网格列。

  • 将数据加载到网格后,将其作为2D数组处理以确定哪个数据 行需要特殊着色并设置计算字段的值[条目]

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

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

注意:这只有在DataController的IsGridMode属性设置为False时才有效。 如果设置为True,则任何时候只加载数据集行的子集, 因此网格不会分组,您将无法处理整个数据集 在DataController的Values属性中使用它的2D表示。

答案 1 :(得分:1)

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

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;

答案 2 :(得分:0)

我最接近@ Rigotti代码的解决方案。但我发现无法管理OnCalc,OnDataChange和OnGetContentStyle。它触发了很多方法。

我们不久前切换到FireDAC,并且我不知道它允许您更新基础表,即使它自己的查询不可更新。所以我在sql中计算了字段,并且不需要OnCalc。