如何基于另一列值修改Delphi FireMonkey TGrid的背景色
Delphi FireMonkey中基于另一列值修改TGrid背景色
要实现基于RowMod列的值修改TGrid的背景色,核心是在DrawColumnBackground事件中获取对应行的RowMod值,下面提供两种常用实现方案:
方案1:直接操作绑定的数据集
如果你的TGrid绑定了数据集(如TClientDataSet、TADODataSet),可以直接定位到对应行读取RowMod字段值:
procedure GridDrawColumnBackground(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates); var OldKind: TBrushKind; OldColor: TAlphaColor; DataSet: TDataSet; RowModValue: Integer; begin // 跳过标题行(Row=-1) if Row < 0 then Exit; // 获取网格绑定的数据集 DataSet := (Sender as TGrid).DataSource.DataSet; if not Assigned(DataSet) then Exit; DataSet.DisableControls; try // 定位到目标行:TGrid的Row从0开始,数据集RecNo从1开始 DataSet.RecNo := Row + 1; RowModValue := DataSet.FieldByName('RowMod').AsInteger; finally DataSet.EnableControls; end; if RowModValue = 1 then begin // 保存原画布填充属性 OldKind := Canvas.Fill.Kind; OldColor := Canvas.Fill.Color; // 绘制黄色背景 Canvas.Fill.Color := TAlphaColorRec.Yellow; Canvas.Fill.Kind := TBrushKind.Solid; Canvas.FillRect(Bounds, 0, 0, AllCorners, 1); // 恢复原属性 Canvas.Fill.Color := OldColor; Canvas.Fill.Kind := OldKind; end; end;
方案2:使用DataController(LiveBindings场景)
如果网格通过LiveBindings绑定数据源(如TBindSourceDB),使用DataController获取值更高效,无需直接操作数据集的记录指针:
procedure GridDrawColumnBackground(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates); var OldKind: TBrushKind; OldColor: TAlphaColor; Grid: TGrid; DataController: TDataController; RowModColIndex: Integer; RowModValue: Integer; begin // 跳过标题行 if Row < 0 then Exit; Grid := Sender as TGrid; DataController := Grid.DataController; if not Assigned(DataController) then Exit; // 通过字段名获取RowMod列的索引 RowModColIndex := DataController.GetItemIndex('RowMod'); if RowModColIndex < 0 then Exit; // 获取对应行的RowMod值 RowModValue := DataController.GetValue(RowModColIndex, Row).AsInteger; if RowModValue = 1 then begin OldKind := Canvas.Fill.Kind; OldColor := Canvas.Fill.Color; Canvas.Fill.Color := TAlphaColorRec.Yellow; Canvas.Fill.Kind := TBrushKind.Solid; Canvas.FillRect(Bounds, 0, 0, AllCorners, 1); Canvas.Fill.Color := OldColor; Canvas.Fill.Kind := OldKind; end; end;
注意事项
- 如果是未绑定数据集的自定义网格(如TStringGrid),可以直接通过
Grid.Items[Row].Values['RowMod']获取值 - 必须保存并恢复画布的填充属性,否则会影响网格其他元素的绘制
- 处理时要跳过标题行(
Row=-1),避免出现索引越界或数据集操作错误
内容的提问来源于stack exchange,提问作者Rick Wheeler
相关产品推荐
相关产品推荐

