如何为dbgrid的某行上背景色?
如何为dbgrid某行的字体上色?
如何可以实现点击dbgrid的标题实现排序?
up者有分.

解决方案 »

  1.   

    点击排序var FSort,FSortField : string;
    procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    begin
      if not DBGrid1.Active then exit;
      for iFieldCount := 0 to DBGrid1.Columns.Count - 1 do
      begin
         if (Copy(DBGrid1.Columns[iFieldCount].Title.Caption,Length(DBGrid1.Columns[iFieldCount].Title.Caption)-1,2) = '▼') or (Copy(DBGrid1.Columns[iFieldCount].Title.Caption,Length(DBGrid1.Columns[iFieldCount].Title.Caption)-1,2) = '▲') then
         begin
            DBGrid1.Columns[iFieldCount].Title.Caption := Copy(DBGrid1.Columns[iFieldCount].Title.Caption,1,Length(DBGrid1.Columns[iFieldCount].Title.Caption)-3);
            break;
         end;
      end;
      if Column.FieldName = FSortField then
      begin
         if FSort = 'DESC' then
            FSort := 'ASC'
         else
            FSort := 'DESC';
      end
      else begin
        FSortField := Column.FieldName;
        FSort := 'ASC';
      end;
      if FSort = 'ASC' then
         Column.Title.Caption := Column.Title.Caption + ' ▲'
      else
         Column.Title.Caption := Column.Title.Caption + ' ▼';
     Dataset1.Sort := Column.FieldName + ' ' + FSort;
      

  2.   

    实战Delphi数据网格色彩特效
      Delphi中的数据网格控件(TDbGrid)对于显示和编辑数据库中大量的数据起着十分重要的作用;然而,在使用数据网格控件的同时,也往往因为表格中大量的数据不易区分,而令操作者眼花缭乱。如何提高网格控件的易用性,克服它的此项不足呢?本文从改变数据网格的色彩配置角度,提出了一种解决办法。
      以下为数据网格控件的6种特殊效果的实现方法,至于数据网格控件与数据集如何连接的方法从略。
    1. 纵向斑马线效果:实现网格的奇数列和偶数列分别以不同的颜色显示,以区别相邻的数据列。
      file://在DbGrid的DrawColumnCell事件中编写如下代码:
      Case DataCol Mod 2 = 0 of
       True: DbGrid1.Canvas.Brush.Color:= clBlue; file://偶数列用蓝色
       False: DbGrid1.Canvas.Brush.Color:= clAqua; file://奇数列用浅绿色
      End;
      DbGrid1.Canvas.Pen.Mode:=pmMask;
      DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);
    2. 纵向斑马线,同时以红色突出显示当前单元格效果:以突出显示当前选中的字段。
      file://将上述代码修改为:
      Case DataCol Mod 2 = 0 of
       True: DbGrid1.Canvas.Brush.Color:= clBlue; file://偶数列用蓝色
       False: DbGrid1.Canvas.Brush.Color:= clAqua; file://奇数列用浅绿色
      End;
      If ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then
        If Not DbGrid1.SelectedRows.CurrentRowSelected then
          DbGrid1.Canvas.Brush.Color:=clRed; file://当前选中单元格显示红色
          DbGrid1.Canvas.Pen.Mode:=pmMask;
          DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);
    上述两种方法突出了列的显示效果。
    3.在数据网格中以红色突出显示当前选中的行:
      设置DbGrid控件的Options属性中的dgRowSelect属性为真,Color属性为clAqua(背景色), 在DbGrid的DrawColumnCell事件中编写如下代码:
      if ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then
       DbGrid1.Canvas.Brush.color:=clRed; file://当前行以红色显示,其它行使用背景的浅绿色
       DbGrid1.Canvas.pen.mode:=pmmask;
       DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);
    4.行突显的斑马线效果:既突出当前行,又区分不同的列(字段)。
      file://其它属性设置同3,将上述代码修改为:
      if ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then
       begin
        Case DataCol Mod 2 = 0 of
         True : DbGrid1.Canvas.Brush.color:=clRed; file://当前选中行的偶数列显示红色
         False: DbGrid1.Canvas.Brush.color:=clblue; file://当前选中行的奇数列显示蓝色
        end;
       DbGrid1.Canvas.pen.mode:=pmmask;
       DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);
      end;
    5.横向斑马线,同时以红色突显当前行效果:
      file://其它属性设置同3,将上述代码修改为:
      Case Table1.RecNo mod 2 = 0 of file://根据数据集的记录号进行判断
       True : DbGrid1.Canvas.Brush.color:=clAqua; file://偶数行用浅绿色显示
       False: DbGrid1.Canvas.Brush.color:=clblue; file://奇数行用蓝色表示
      end;
      if ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then file://选中行用红色显示
       DbGrid1.Canvas.Brush.color:=clRed;
       DbGrid1.Canvas.pen.mode:=pmMask;
       DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);
    6.双向斑马线效果:即行间用不同色区分,同时,选中行以纵向斑马线效果区分不同的列。
      file://其它属性设置同3,将上述代码修改为:
      Case Table1.RecNo mod 2 = 0 of file://根据数据集的记录号进行判断
       True : DbGrid1.Canvas.Brush.color:=clAqua; file://偶数行用浅绿色显示
       False: DbGrid1.Canvas.Brush.color:= clblue; file://奇数行用蓝色表示
      end;
      If ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then
      Case DataCol mod 2 = 0 of
       True : DbGrid1.Canvas.Brush.color:=clRed; file://当前选中行的偶数列用红色
       False: DbGrid1.Canvas.Brush.color:= clGreen; file://当前选中行的奇数列用绿色表示
      end;
    DbGrid1.Canvas.pen.mode:=pmMask;
      DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);
    7. 随意控制DBGrid 每一行的颜色:
    Var
    p : Integer;
    begin
    p := Table1.FindField('wage').AsInteger;
    //取得当前记录的Wage字段的值。
    if(p < 500) then begin 
    //程序将根据wage值设置各行的颜色。
    Color := clGreen;
    Font.Style := [fsItalic]; 
    //不仅可以改变颜色,还可以改变字体
    end;
    if  (p >= 500) And (p < 800) then
    Color := clRed;
    if(p >=800) then begin
    Color := clMaroon;
    Font.Style := [fsBold];
    end;
    end;
      

  3.   

    强烈推荐你使用EhLib组件中的DBGridEh控件,绝对让你满意。
      

  4.   

    ExpressQuantumGrid 4very cool
      

  5.   

    在OnColumnItemDraw事件中加入自己的画单元的方法就可以了
      

  6.   

    排序:
    procedure Tform1.SortQuery(column:TColumn);
    var
      SqlStr,myFieldName,TempStr: string;
      OrderPos: integer;
      SavedParams: TParams;
    begin
      if not(Column.Field.FieldKind in [fklookup,fkdata]) then
        exit;
      if column.Field.FieldKind = fkdata then
        myFieldName := UpperCase(column.Field.FieldName)
      else
        myFieldName := UpperCase(column.Field.KeyFields);
      while Pos(myFieldName,'')<>0 do
        myFieldName := Copy(myFieldName,1,pos(myFieldName,'')-1) +
                       ','+Copy(myFieldName,Pos(myFieldName,'')+1,100);
      with TQuery(TDBGrid(Column.Grid).DataSource.DataSet) do
      begin
        SqlStr := UpperCase(SQL.Text);
        if ParamCount > 0 then
        begin
          SavedParams := TParams.Create;
          SavedParams.Assign(Params);
        end;
        OrderPos := pos('ORDER',SqlStr);
        if (OrderPos = 0) or (pos(myFieldName,copy(SqlStr,OrderPos,100)) = 0) then
          TempStr := ' order by ' + myFieldName + ' Asc'
        else
          if pos('Asc',SqlStr) = 0 then
            TempStr := ' order by ' + myFieldName + ' Asc'
          else
            TempStr := ' order by ' + myFieldName + ' Desc';
        if OrderPos <> 0 then
          SqlStr := copy(SqlStr,1,OrderPos - 1);
        SqlStr := SqlStr + TempStr;
        Active := False;
        SQL.Clear;
        SQL.Text := SqlStr;
        if ParamCount > 0 then
        begin
          Params.AssignValues(SavedParams);
          SavedParams.Free;
        end;
        Prepare;
        Open;
      end;
    end;procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    begin
      SortQuery(Column);
    end;
      

  7.   

    颜色:
    procedure TDbgridForm.DBGrid1DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    begin
      with DBGrid1 do
      begin
       if ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then
        begin
         Canvas.Font.Color :=ClYellow;
         Canvas.Brush.Color :=ClNavy;
        end
        else
        begin
          if  DataSource1.DataSet.RecNo mod 2<>0 then {判断当前数据是奇数还是偶数行}
            Canvas.brush.Color :=ClWhite        {如果是奇数行,DBGrid背景以白色显示}
          else
            Canvas.brush.Color :=clgreen;         //$00EAEAEA;      {如果是偶数行,DBGrid背景以浅灰色显示}
        end;
        DefaultDrawColumnCell(Rect, DataCol, Column, State); {这行很关键的,一定不要遗漏了}
      end;
    end;
      

  8.   

    楼上的都说清楚了,我来upup,接接分......
      

  9.   

    设置某行,颜色
    试试
    procedure TdfrmSt_Decl.DBGrid2DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    begin
      inherited;
      IF column.FieldName='IfPur' then
      begin
        IF column.Field.AsBoolean=true then
           begin
      DBGrid2.Canvas.Font.Height:=12;
      DBGrid2.Canvas.TextRect(Rect,Rect.left+1,Rect.top+1,'');
           end
         Else
           begin 
      DBGrid2.Canvas.Font.Height:=12;
      DBGrid2.Canvas.TextRect(Rect,Rect.left+1,Rect.top+1,'·&ntilde;');
           end;
      end;
    end;    IF Column.Field.AsBoolean then
        begin
          DBGrid2.Canvas.Font.Color:=clGreen;
          DBGrid2.Canvas.Font.Height:=12;
          DBGrid2.Canvas.Font.Style:=[fsBold];
          DBGrid2.Canvas.TextRect(Rect,Rect.Left+1,Rect.Top+1,'   &iexcl;&Igrave;')
      

  10.   

    楼上的n次方已经说得很透彻了,我只能说up了!
      

  11.   

    这个是颜色的:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, Grids, DBGrids,StdCtrls;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        ADOQuery1: TADOQuery;
        Button1: TButton;
        procedure DBGrid1Enter(Sender: TObject);
        procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function get_dbg_edit_text(dbgrid :tdbgrid):TEdit;
    var i:integer;
    begin
    result := nil;
    if not assigned(dbgrid) then exit;
    if not dbgrid.EditorMode then
       begin
       dbgrid.EditorMode:=true;
       dbgrid.EditorMode:=false;
       end;
       with dbgrid do for i:=0 to pred(componentcount) do
        if components[i] is Tcustomedit then
        begin
         result := tedit(components[i]);
         break;
        end;end;function get_dbg_edit(dbgrid : tdbgrid): string;
    var
       dbg_edit :TEdit;
    begin
       dbg_edit:=get_dbg_edit_text(dbgrid);
       if assigned(dbg_edit) then
       result := dbg_edit.text
       else result:='';
    end;procedure TForm1.DBGrid1Enter(Sender: TObject);
    {显示当前编辑框背景颜色}
    var
        dbg_edit : tedit;
    begin
        dbg_edit:=get_dbg_edit_text(tdbgrid(sender));
        if assigned(dbg_edit) then dbg_edit.color:=clyellow;
    end;procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
    //DBGrid1DrawColumnCell事件。
    //sex字段为女的,字体颜色为红色,其它的为蓝色:
     if Adoquery1.FieldByName('age').Asstring = '18' then
      DBGrid1.Canvas.Font.Color := clRed
     else
      DBGrid1.Canvas.Font.Color := clBlue;
     DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
    end;end.
    这个是title排序的:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, ADODB, Grids, DBGrids;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
        Button1: TButton;
        procedure DBGrid1TitleClick(Column: TColumn);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    var
       i:integer;
       field_name:string;
    begin
      i:=column.Index;
      field_name:=adoquery1.Fields[i].FieldName;
      with adoquery1 do begin
      active := false;
      sql.Clear;
      sql.Add('select * from dbgrid_auto_wide order by '+field_name+'');
      active:=true;
      end;
    end;end.