如题:

解决方案 »

  1.   

    首先将RowSelect设为True
    然后在DrawColumnCell事件中写
        if ((State = [gdSelected]) or (State = [gdSelected, gdFocused])) then
        begin
          Canvas.Brush.Color := clBlue;
          Canvas.Font.Color := clWhite;
        end
      

  2.   

    在DBGrid的OnDrawColumnCell事件中.
    procedure TfrmCaiXianBLDWH.dbgrid1DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumnEh;
      State: TGridDrawState);
    var
      oldColor:TColor;
      oldPenMd:TPenMode;
    begin
      oldColor := dbgrid1.Canvas.Brush.Color;
      oldpenmd := dbgrid1.Canvas.Pen.Mode;
      //在下面按你自己的要求显示
      //根据State判断状态。
     if state=gdSelect then
      begin
        dbgrid1.Canvas.Brush.Color := $00D2D5FF;
        dbgrid1.Canvas.Pen.Mode := pmMask;
      end;
      if state=gdFocused then
      begin
        dbgrid1.Canvas.Brush.Color := $00D2D5FF;
        dbgrid1.Canvas.Pen.Mode := pmMask;
      end;
      if state=gdFixed then
      begin
        dbgrid1.Canvas.Brush.Color := $00D2D5FF;
        dbgrid1.Canvas.Pen.Mode := pmMask;
      end;
      dbgrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
      
      dbgrid1.Canvas.Brush.Color := oldcolor;
      dbgrid1.Canvas.Pen.Mode := oldpenmd;
    end;
      

  3.   

    在DBGrid的OnDrawColumnCell事件中.我加入
    if Print_Select.Count<>0 then
        begin
          for I:=0 to Print_Select.Count-1 do//Print_Select是个TSTRINGS,在点击的时候付值,记录点击过的记录。
          begin
            if Print_Select.Strings[I]=F_Data.Query_Query.FieldByName('Flow_ID').AsString then
            begin
              DBGrid1.Canvas.Brush.Color := clGray;
              DBGrid1.DefaultDrawColumnCell(Rect, datacol,column, State);
              Exit;
            end;
          end;
        end;基本实现了整行变色,但是总是我选择后离开本行时才变色。所以还不符合要求。
      

  4.   

    DefaultDrawing设置为False,这点很重要!
    在DBGridr的OnDrawDataCell事件中
    //当前是选择状态时
    if (gdSelected in State) then
      with TDBGrid(Sender) do
      begin
        Canvas.Brush.Color := 选择状态时的颜色;
        Canvas.FillRect(Rect); //画出选择条
        Canvas.Font.Color := 选择状态时的字体颜色;
        Canvas.TextOut(Rect.Left + 1,Rect.Top + 1,Field.AsString);//输出当前字段文字,注意这个时候DataSet必须为开的,否则会出错
      end
    else
      with TDBGrid(Sender) do
      begin
        Canvas.Brush.Color := 不是选择状态时的颜色;
        Canvas.FillRect(Rect); 画出背景
        Canvas.Font.Color := 不是选择状态时的字体颜色;
        Canvas.TextOut(Rect.Left + 1,Rect.Top + 1,Field.AsString);//输出当前字段文字,注意这个时候DataSet必须为开的,否则会出错
      end;
      

  5.   

    {2.DBGridrowColor(给DBGrid隔列着色,在DBGrid的OnDrawColumnCell事件中调用)   }
    procedure DBGridColumnColor(Sender: TObject;const Rect: TRect;
              DataCol: Integer; Column: TColumn;State: TGridDrawState;
              singlecolor:TColor;doublecolor:TColor;selectedcolor:TColor);
    var
      dataset:tdataset;
      dbgrid:tdbgrid;
    begin
      dataset:=TDBGrid(Sender).DataSource.DataSet;
      dbgrid:=TDBGrid(Sender);
      if (dataset.Recno mod 2) <> 0 then  //隔行
         begin
           dbgrid.Canvas.Font.Color := clWhite;
           dbgrid.Canvas.Brush.Color := singlecolor;  //这里设置单元格填充色
           dbgrid.Canvas.FillRect(Rect);  //这里对相应的单元格进行背景色填充
        end
      else
        begin
          dbgrid.Canvas.Font.Color := clWhite;
          dbgrid.Canvas.Brush.Color :=doublecolor;
          dbgrid.Canvas.FillRect(Rect);
        end;  //输出内容
      dbgrid.Canvas.TextRect( Rect, Rect.Left, Rect.Top, Column.Field.DisplayText);
      if gdSelected in State then  //被选中行的颜色
      begin
        dbgrid.Canvas.Brush.Color :=selectedcolor;
        dbgrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
      end;
    end;
      

  6.   

    刚刚作的,试一试,应该符合你的要求,代码没有优化,只是把功能实现了,自己优化一下吧。
    DefaultDrawing设置为Falseprocedure TForm1.DBGrid1CellClick(Column: TColumn);
    begin
      strPriRow:=IntToStr(DBGrid1.DataSource.DataSet.Recno) + ',' + strPriRow ;  //记录选过的行
    end;procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
      if ((State = [gdSelected]) or (State = [gdSelected, gdFocused])) then
      begin
        DBGrid1.Canvas.Brush.Color := clred;
        DBGrid1.Canvas.Font.Color := clWhite;
        DBGrid1.DefaultDrawColumnCell(Rect, datacol,column, State);
      end
      else
      begin
        if pos(IntToStr(DBGrid1.DataSource.DataSet.Recno),strPriRow) = 0 then
        begin
          DBGrid1.Canvas.Brush.Color := clBlue;
          DBGrid1.Canvas.Font.Color := clWhite;
          DBGrid1.DefaultDrawColumnCell(Rect, datacol,column, State);
        end
        else  //此处可以优化一下,自己看看吧。
        begin
          DBGrid1.Canvas.Brush.Color := clred;
          DBGrid1.Canvas.Font.Color := clWhite;
          DBGrid1.DefaultDrawColumnCell(Rect, datacol,column, State);
        end;
      endend;
      

  7.   

    解决了,送分。
    我还是在我自己的方法上面改动了一下。在点击事件中加了个repaint方法.感谢大家。