搜索数据后,使DBGrid单元格改变颜色

时间:2015-10-30 07:59:08

标签: delphi

我正在构建一个函数:在DBGrid中搜索一个值后,它可以计算多少个值并标记这些单元格(更改单元格的颜色)。但我只做了列更改颜色。我该怎么做在一个程序?

procedure TfmMain.N_SearchClick(Sender: TObject);

var
searchname : String;
i: integer;
frmSearch : Tfrmsearch;
data_count : integer;

begin

  searchData := '';
  searchRow:=self.DBGrid.DataSource.DataSet.RecNo;
  searchname:= DBGrid.DataSource.DataSet.fieldbyname('FIELD').AsString;
  frmSearch:=Tfrmsearch.Create(self);

  try

     frmSearch.ShowModal;
     frmSearch.Visible:=true;

     for i := 0 to DBGrid.FieldCount do
     begin


       if ((Pos(searchData,DBGrid.DataSource.DataSet.Fields[i].AsString)>0) AND (CompareStr(searchData,'') <> 0)
       AND  (Pos('VALUE_',DBGrid.DataSource.DataSet.Fields[i].FieldName)>0)
       AND (searchRow=DBGrid.DataSource.DataSet.RecNo)) then
       begin

        data_count:=data_count+1;
        //DBGrid[DBGrid.Row,i-2].Color:=clLime;

       end;
     end;

      showmessage('countTotal: '+IntToStr(data_count));

  finally
  frmSearch.Free;
  end; 
end;

2 个答案:

答案 0 :(得分:2)

在网格的OnDrawColumnCell事件中,您只需要这样的东西:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
    DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  //  Change font- and grid-color if showing search results
  if ShowingSearchResult then begin
    TDBGrid(Sender).Canvas.Brush.Color := clSilver;
    TDBGrid(Sender).Canvas.Font.Color := clBlue;
  end;
  TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

您在OnDrawColumnCell事件中可以做的事情有点受限,但对于这种情况应该足够了。 Iirc,在某些时候添加了OnDrawDataCell以允许更大的灵活性。

当然,您可以将ShowingSearchResult(布尔)变量声明为TfrmSearch的字段,并在True过程中将其设置为N_SearchClick。但是,由于该过程以模态方式显示表单然后释放它,您可以完全省略该变量,因此DBGrid1DrawColumnCell可能只是

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
    DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  TDBGrid(Sender).Canvas.Brush.Color := clSilver;
  TDBGrid(Sender).Canvas.Font.Color := clBlue;
  TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

答案 1 :(得分:0)

非常感谢,这是我写的最终代码。

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
    DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin    
    if (DBGrid.DataSource.DataSet.FieldByName(Column.FieldName).AsString = searchData) 
and (searchRow=DBGrid.DataSource.DataSet.RecNo) then
    begin
      TDBGrid(Sender).Canvas.Brush.Color := $000080FF;
      DBGrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
    end;
end;