DevExpress

大名鼎鼎的DevExpress插件

cxGrid 显示行号及行号列列名

cxGrid默认不显示行号,但是可以通过cxGrid1DBTableView1CustomDrawIndicatorCell事件来重绘行号

选中cxGrid1DBTableView1,在OnCustomDrawIndicatorCell事件中,输入以下代码:

procedure TForm1.cxGrid1DBTableView1CustomDrawIndicatorCell(
  Sender: TcxGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean);
begin
  SetRowNumber(Sender, AviewInfo, ACanvas, ADone);//调用SetRowNumber函数,函数声明及实现见后
end;

SetRowNumber函数声明(注意函数声明的摆放位置,此处不在Form内):

procedure SetRowNumber(var Sender: TcxGridTableView; var AViewInfo: TcxCustomGridIndicatorItemViewInfo;
  ACanvas: TcxCanvas; var ADone: boolean);

SetRowNumber函数实现代码:

procedure SetRowNumber(var Sender: TcxGridTableView; var AViewInfo: TcxCustomGridIndicatorItemViewInfo;
  ACanvas: TcxCanvas; var ADone: boolean);
var
  AIndicatorViewInfo: TcxGridIndicatorRowItemViewInfo;
  ATextRect: TRect;
  AFont: TFont;
  AFontTextColor, AColor: TColor;
  procedure DrawIndicatorImage(ACanvas: TcxCanvas;
    const R: TRect; AKind: TcxIndicatorKind);
  var
    X, Y: Integer;
  begin
    if AKind = ikNone then Exit;
    X := (R.Left + R.Right - cxLookAndFeelPainters.cxIndicatorImages.Width);
    Y := (R.Top + R.Bottom - cxLookAndFeelPainters.cxIndicatorImages.Height) div 2;
    cxLookAndFeelPainters.cxIndicatorImages.Draw(ACanvas.Canvas, X, Y, Ord(AKind) - 1);
  end;
begin
  try
    AFont := ACanvas.Font;
    AColor := clBtnFace;
    AFontTextColor := clWindowText;
    if (AViewInfo is TcxGridIndicatorHeaderItemViewInfo) then begin
      ATextRect := AViewInfo.Bounds;
      InflateRect(ATextRect, -1, -1);
      Sender.LookAndFeelPainter.DrawHeader(ACanvas, AViewInfo.Bounds,
        ATextRect, [], cxBordersAll, cxbsNormal, taCenter, TcxAlignmentVert.vaCenter,
        False, False, '序号', AFont, AFontTextColor, AColor);
      ADone := True;
    end;
    if not (AViewInfo is TcxGridIndicatorRowItemViewInfo) then
      Exit;
    ATextRect := AViewInfo.ContentBounds;
    AIndicatorViewInfo := AViewInfo as TcxGridIndicatorRowItemViewInfo;
    InflateRect(ATextRect, -1, -1);
    if Sender.DataController.RecordCount > 0 then begin
      if AIndicatorViewInfo.GridRecord.Selected then
        AFontTextColor := clRed
      else
        AFontTextColor := clWindowText;
    end;
    Sender.LookAndFeelPainter.DrawHeader(ACanvas, AViewInfo.ContentBounds,
      ATextRect, [], [bBottom, bLeft, bRight], cxbsNormal, taCenter, TcxAlignmentVert.vaCenter,
      False, False, IntToStr(AIndicatorViewInfo.GridRecord.Index + 1),
      AFont, AFontTextColor, AColor);
    ADone := True;
  except
  end;
  DrawIndicatorImage(ACanvas, ATextRect, AIndicatorViewInfo.IndicatorKind);
end;

最后将cxGrid1DBTableView1中的OptionView中的Indicator设为True, IndicatorWidth设为适合值即可。

recommand

cxgrid_indicator_preview

cxGrid 循环选择条目

Delphi DevExpress CxGrid 循环选择条目
整理出来的,直接复制粘贴即可使用

以下是从网络上复制粘帖到的,实践证明,利用以下代码进行获取选择行是错误的。

当我们利用 CxGrid进行排序后,它选的索引序号还是未排序前的,会导致选择错误、混乱的条目。

var
  i,j:Integer;
begin
 with cxgridview.Controller do
  begin
   for i:=0 to SelectedRowCount-1 do
    begin
     j := cxgridview.DataController.GetSelectedRowIndex(I);
    //上文GetSelectedRowIndex不会随CxGrid排序而改变,导致造成严重后果
     //ShowMessage(VarToStr(cxgridview.DataController.GetValue(j, 0))); //循环显示第0列
    end;
   end;
  end;
end;

 

以下才是正确的:

recommand

CellClick事件中通过如下代码获取到真正的CxGrid序号

//获取单行选择的某列值,可写到CellClick事件中
with cxGrid1DBTableView1.DataController.DataSet do
begin
  //此处Current_Record获取到的字符串不会随CxGrid排序而改变
  Current_Record := FieldByName('CodeData').AsString;  
end; 

//获取多行选择的某列值,grdData为TableView的Name,RzMemo会显示出所有行的CodeData值
try
    with grdData.Controller do
      begin
      for i:=0 to SelectedRowCount-1   do
        begin
          grdData.Controller.FocusedRow  := grdData.Controller.SelectedRows[i];
          RzMemo.Lines.add(grdData.DataController.DataSet.FieldByName('CodeData').AsString);
        end;
      end; 
  except
  end;

 

cxGrid 根据列值变色(样式)

在使用cxGrid的过程中,某一个单元格经常需要根据其他单元格的值来做相应的变色,如:

1379405810_157913

cxGridDBTableView中,选定要变样式(如背景色、字体属性等)的列,

打开事件Events -> Styles样式 -> OnGetContentStyle, 增加事件

例如:

if ARecord.Values[12] = ‘YES’ then 
AStyle := cxStyle1;

我倡导通过 cxStyleRepository样式表来控制,就像html使用css来控制效果一样。

cxStyle1为样式,可以在cxStyleRepository中设置各种外观。

cxGrid 隔行换色

新建一个cxStyleRepository,分别建立几种Styles,如cxgrid_odd,cxgrid_even,cxgrid_selection等,并设置好它们的背景色、字体属性等。

cxGridDBTableView中,有一个Styles属性,

里面有Content,ContentEven,ContentOdd,Selection,这是cxGrid常用的四种样式。

cxStyleRespository

Content 代表默认的内容

Odd 代表奇数行

Even 代表偶数行

Selection 代表选中行

 

cxGridInspector

分别将以上值指向 cxStyleRepository 中设定的样式。

运行即可。

cxStyleRespository_preview