如何根据表格值对cxGrid进行着色?

4

我希望所有特定字段名为“hello”的行都能标记为绿色。我在customdrawcell中尝试了这个方法:

if abstable1.fieldbyname('somename').asstring = 'Hello' then
  cxgrid.canvas.brush.color:=clGreen

但是它不起作用...我在这里漏掉了什么吗?

请发布完整事件处理程序的实际代码,而不是为了提问而编造的代码。同时,请通过缩进四个空格或选择所有内容并单击{}按钮或按Ctrl+K来格式化代码。实际代码可以让我们看到问题出在哪里,或者至少可以复制和粘贴以帮助解决问题。 - Ken White
5个回答

9

使用OnGetContentStyle事件来处理单个列或网格对象的样式。与操纵画布相比,样式更易于操作。


2
是的,百分之百。样式更易于操作,也更安全。通过将选择样式的逻辑与如何呈现每个样式分离,您可以自由更改其中一个而不影响另一个(例如HTML和CSS)。此外,您还可以促进可重用性和标准化,因为样式可以在不同的网格之间共享。 - Rafael Piccolo

6
您需要查看每个视图行的内部数据,而不是表中当前位置的数据。还要利用在OnCustomDrawCell()事件中提供的画布。
procedure TForm1.YourViewCustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  if(AViewInfo.GridRecord.Values[YourColumn.Index] = 'Hello') then
    ACanvas.Brush.Color := clGreen;
end;

只要您在表中为每个字段设置了视图列并且它们的顺序相同,@user763539就可以正常工作。 - avenmore

5

不要试图在网格中更改画布颜色。相反,我发现这总是正确的--在视图的OnDrawCell处理程序中更改颜色,例如:

procedure T_fmTabSnapList.View1CustomDrawCell(Sender: TcxCustomGridTableView;
  ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  if abstable1.fieldbyname('somename').asstring = 'Hello' then 
    ACanvas.Brush.Color := clGreen
end;

cxGrid只是一种视图的容器。视图是所有绘制发生的地方。


成功了....if(AViewInfo.GridRecord.Values[DataModule2.ABSTable7.Index]...谢谢大家... - user763539

1
procedure Tfm1.Grid1StylesGetContentStyle(Sender: TcxCustomGridTableView;
  ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
  out AStyle: TcxStyle);
Var
 Style1: TcxStyle;
begin
 if AItem = nil then exit;

 if ARecord.Values[Grid1Med.Index] = true then
   AStyle := cxStyleMed;

 if ARecord.Values[Grid1CP.Index] = true then
   AStyle := cxStyleHost;

 if (ARecord.Values[Grid1Med.Index] = true) and
    (ARecord.Values[Grid1CP.Index] = true) then
   AStyle := cxStyleHostAndCP;

  if not VarIsNull(ARecord.Values[colColor.Index]) then
  begin
    if not Assigned(AStyle) then
      AStyle := TcxStyle.Create(Sender);
    AStyle.Color := ARecord.Values[colColor.Index];
  end;
end;

0

这里是我一个程序中的一些可用代码,它做了类似的事情。

procedure TDoDockets.grDocketsDrawColumnCell(Sender: TObject;
            const Rect: TRect; DataCol: Integer; Column: TColumn;
            State: TGridDrawState);
begin
 with grDockets do
  begin
   if (qDocketsOpenCost.asinteger > 1) and (datacol = 5)
    then canvas.font.color:= clRed;

   if datacol = 9 then // status
    if qDocketsColour.Value <> 0
     then Canvas.font.color:= tcolor (qDocketsColour.Value);

   if datacol = 10 then // attention
    if qDocketsAttention.asinteger = 1
     then canvas.brush.color:= clRed;

   if qDocketsUrgent.asinteger = 1 then canvas.brush.color:= 10092543;
   // light yellow
   DefaultDrawColumnCell (Rect, DataCol, Column, State);
  end
end;

grDockets是网格,qDockets是在网格中显示的查询。根据所显示的值,某些列可能会以不同的颜色绘制,并且在一种情况下(qDocketsUrgent = 1),整行的背景颜色会更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接