做也不会太难的。如下:
先建立一个全局TAdoDataset,并且将adoquery1的内容克隆过去。
ADODataSet1.Clone(adoquery1,ltReadOnly);
然后写dbgrid的OnDrawColumnCell事件函数:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
privateValue:String;
begin
with TDBgrid(Sender) do
begin
if (DataCol=0) then //and (not DataSource.DataSet.Eof) and ( not DataSource.DataSet.Bof) then
begin
Canvas.Brush.Style := bsClear;
ADODataSet1.Locate('fieldname1;fieldname2',vararrayof([DataSource.DataSet.fieldbyname('fieldname1').AsString,DataSource.DataSet.fieldbyname('fieldname2').AsString]),[]);
ADODataSet1.Prior;
if adodataset1.Bof then
privateValue:=''
else
privateValue:=ADODataSet1.fieldbyname('fieldname1').AsString;
if (gdSelected in state) or (gdFocused in state) then
begin
Canvas.Brush.Color:=clNavy;
Canvas.Font.Color:=clWhite;
end
else
begin
Canvas.Brush.Color:=clWhite;
Canvas.Font.Color:=clBlack;
end;
if (column.Field.AsString=privateValue) then
begin
mRect:=rect;
canvas.FillRect(mRect);
end
else
begin
canvas.FillRect(Rect);
canvas.TextOut(rect.Left+2,rect.Top+2,column.field.AsString);
end;
end
else
begin
DefaultDrawColumnCell(rect,datacol,column,state);
end;
end;
end;
只需要在更改Adoquery的时候保持adodataset同步即可。