1.     CxGrid汇总功能

① OptionsView-Footer设置为True,显示页脚   ② CxGrid的Summary选项卡定义要汇总的列和字段名及汇总方式,Footer选项卡定义单个汇总,Default For Groups定义按组汇总。OptionsView-GroupFooters设置为gfAlwaysVisible则显示按组汇总。设置后界面如图。

2.       CxGrid的样式设置

当设置了Kind时,NativeStyle必须设置为False,如果指定了SkinName则Kind属性失效。

下图是设置skinname为MoneyTwins后效果

4.       取某个单元格的值

Cxgrid.DataController.Values[i,j]

5.       列操作,选择CxGrid控件后,点击“Customize”新建一列,在Columns集合中选中新建的列,选择propertites属性可以设置该列的显示形式。下面介绍常用的几个

①     Properties选择CheckBox,则该列显示一个复选框,如下:


判断是否选中 if  Cxgrid.DataController.Values[i,j]=’1’   选中

②     Properties选择ButtonEdit,并对该列的属性编辑器设置如下属性Buttons属性添加按钮项,对按钮项设置可以设置kind属性定义按钮样式;ViewStyle属性设置为vsButtonsOnly,Options-ShowEditButton设置为isebAlways。可以编写点击事件如下:

procedure TForm1.cxgrdbtblvwGrid1DBTableView1Column1PropertiesButtonClick(

Sender: TObject; AButtonIndex: Integer);

begin

ShowMessage('aaa');

end;

③ImageComboBox,可以关联一个imagelist,显示图片。如下关联imagelist后效果。

6.动态添加列和记录行

var

Column:   TcxGridColumn;

i:integer;

acount:integer;

begin

Column:= cxgrd1TableView1.CreateColumn;

Column.Caption   :=   'Test ';

cxgrd1TableView1.DataController.AppendRecord;

cxgrd1TableView1.DataController.Values[0,   0]   :=   'ABC ';

cxgrd1TableView1.DataController.Post;

//添加多条记录

for i:=1 to 4 do

begin

acount:=cxgrd1TableView1.DataController.RecordCount;

cxgrd1TableView1.DataController.AppendRecord;

cxgrd1TableView1.DataController.Values[acount,   0]   :=IntToStr(i*1);

cxgrd1TableView1.DataController.Post();

end;

end;

//删除记录

cxgrd1TableView1.DataController.DeleteRecord(0);

end;


50 保存/恢复带汇总行的布局

<TableView>.StoreToIniFile('c:\Grid.ini', True, [gsoUseSummary]);
<GridView>.RestoreFromIniFile(<inifilename>,True,False {or True, optional},[gsoUseSummary]);

****************************************************************************

49 指定Filter   Builder打开/保存过滤文件的默认路径

解决:
uses   
      ...,   cxFilterControlDialog;   
    
procedure   TForm.GridView1FilterControlDialogShow(   
      Sender:   TObject);   
begin   
      TfmFilterControlDialog(Sender).OpenDialog.InitialDir   :=   'D:/'   
end;
****************************************************************************
50在主从TableView中根据主TableView得到对应的从TableView
解决:

var   
      ADetailDC:   TcxGridDataController;   
      AView:   TcxCustomGridTableView;   
begin   
      with   cxGrid1DBTableView1.DataController   do   
          ADetailDC   :=   TcxGridDataController(GetDetailDataController(FocusedRecordIndex,   0));   
      AView   :=   ADetailDC.GridView;   
end;

****************************************************************************
51取消过滤时移到第一行
解决:
uses   
      cxCustomData;   
    
procedure   TYour_Form.AViewDataControllerFilterChanged(Sender:   TObject);   
var   
      Filter:   TcxDataFilterCriteria;   
begin   
      with   Sender   as   TcxDataFilterCriteria   do   
          if   IsEmpty   then   
              DataController.FocusedRowIndex   :=   0;   
end;
****************************************************************************
52排序后移到第一行
解决:
可以设置DataController.Options.FocusTopRowAfterSorting   :=   True,也可以使用如下的代码:   
    
uses   
      cxCustomData;   
    
procedure   TYour_Form.Your_ViewDataControllerSortingChanged(Sender:   TObject);   
begin   
      TcxCustomDataController(Sender).FocusedRowIndex   :=   0;   
end;
****************************************************************************
53判断当前行是否第一行或最后一行
解决:
可以使用DataController的IsBOF,   IsEOF方法,或者:   
<AView>.Controller.Controller.FocusedRow.IsFirst   
<AView>.Controller.Controller.FocusedRow.IsLast
****************************************************************************
54根据指定值查找记录
解决:
DataController提供了好几个方法来得到指定值对应的RecordIndex   
对于Bound   View可以使用FindRecordIndexByKeyValue方法
****************************************************************************
55 编辑和显示Blob字段
解决:
该字段的Properties设置为BlobEdit,并将BlobPaintStyle   属性设为   bpsText 
****************************************************************************
56得到可见行数 
解决:
<View>.ViewInfo.VisibleRecordCount 
****************************************************************************
57保存后的行设置为当前行
解决:
const   
      CM_SETFOCUSEDRECORD   =   WM_USER   +   1002;   
    
type   
      TForm1   =   class(TForm)   
          cxGrid1DBTableView1:   TcxGridDBTableView;   
          cxGrid1Level1:   TcxGridLevel;   
          cxGrid1:   TcxGrid;   
          dxMemData1:   TdxMemData;   
          dxMemData1Field1:   TStringField;   
          dxMemData1Field2:   TIntegerField;   
          DataSource1:   TDataSource;   
          cxGrid1DBTableView1RecId:   TcxGridDBColumn;   
          cxGrid1DBTableView1Field1:   TcxGridDBColumn;   
          cxGrid1DBTableView1Field2:   TcxGridDBColumn;   
          Timer1:   TTimer;   
          CheckBox1:   TCheckBox;   
          procedure   Timer1Timer(Sender:   TObject);   
          procedure   dxMemData1AfterPost(DataSet:   TDataSet);   
          procedure   CheckBox1Click(Sender:   TObject);   
      private   
          procedure   CMSetFocusedRecord(var   Msg:   TMessage);   message   CM_SETFOCUSEDRECORD;   
      public   
          {   Public   declarations   }   
      end;   
    
var   
      Form1:   TForm1;   
      FocusedIdx:   Integer;   
    
    
implementation   
    
{$R   *.dfm}   
    
procedure   TForm1.Timer1Timer(Sender:   TObject);   
begin   
      dxMemData1.AppendRecord(['',   IntToStr(Random(1000)),   Random(1000)]);   
end;   
    
procedure   TForm1.dxMemData1AfterPost(DataSet:   TDataSet);   
begin   
      PostMessage(Handle, CM_SETFOCUSEDRECORD,   Integer(cxGrid1DBTableView1),   MakeLParam(cxGrid1DBTableView1.Controller.FocusedRowIndex,   cxGrid1DBTableView1.Controller.TopRowIndex));   
end;   
    
procedure   TForm1.CMSetFocusedRecord(var   Msg:   TMessage);   
begin   
      TcxGridDBTableView(msg.WParam).Controller.FocusedRowIndex   :=   Msg.LParamLo;   
      TcxGridDBTableView(msg.WParam).Controller.TopRowIndex   :=   Msg.LParamHi;   
end;   
    
procedure   TForm1.CheckBox1Click(Sender:   TObject);   
begin   
      Timer1.Enabled   :=   TCheckBox(Sender).Checked;   
end;   
    
end.
****************************************************************************
58删除记录并获得焦点
解决:
procedure   TForm1.BtnDeleteClick(Sender:   TObject);   
var   
      FocusedRow,   TopRow:   Integer;   
      View:   TcxGridTableView;   
      DataController:   TcxGridDataController;   
begin   
      View   :=   cxGrid1.FocusedView   as   TcxGridTableView;   
      DataController   :=   View.DataController;   
    
      //   Remember   the   top   row   (the   vertical   scrollbar   position)   
      TopRow   :=   View.Controller.TopRowIndex;   
      //   Remember   the   focused   row(!)   index   
      FocusedRow   :=   DataController.FocusedRowIndex;   
    
      DataController.DeleteFocused;   
    
      //   After   deletion   the   same   row   must   be   focused,   
      //   although   it   will   correspond   to   a   different   data   record   
      DataController.FocusedRowIndex   :=   FocusedRow;   
      //   Restore   the   top   row   
      View.Controller.TopRowIndex   :=   TopRow;   
end;
****************************************************************************
59cxGrid的 TableView 数据排序与对应的数据集同步
解决:
         //描述: cxGrid的 TableView 数据排序与对应的数据集同步, 该方法主要用于打印时

//         的排序与所见到的排序保持一致; 
       //参数: @tv: 排序的cxGridTableView 
       //说明: @tv: 对应的数据集只支持 ADOQuery与 ClientDataSet; 
       procedure cxGridSortSyncToDataSet(tv: TcxGridDBTableView); overload;

//描述: 功能同上, 实现代码一样, 如果有更改就同步更改 
       procedure cxGridSortSyncToDataSet(tv: TcxGridDBBandedTableView); overload;

procedure cxGridSortSyncToDataSet(tv: TcxGridDBTableView); 
const 
     SortArray: array[soAscending..soDescending] of string = (’ASC’, ’DESC’); 
var 
     AscFields, DescFields, S, SortOrder: string; 
     IndexPrint: string; 
     I: integer; 
     Index: integer; 
     cds: TClientDataSet; 
begin 
     S := ’’; 
     AscFields := ’’; 
     DescFields := ’’; 
     if tv.SortedItemCount = 0 then 
       Exit; 
     if tv.DataController.DataSource.DataSet is TADOQuery then begin 
       for I := 0 to tv.SortedItemCount - 1 do begin 
         SortOrder := SortArray[tv.SortedItems[I].SortOrder]; 
         if S <> ’’ then 
           S := S + ’, ’; 
         Index := tv.SortedItems[I].Index; 
         S := S + tv.Columns[Index].DataBinding.Field.FieldName + ’ ’ + SortOrder; 
       end; 
       (tv.DataController.DataSource.DataSet as TADOQuery).Sort := S; 
     end else if (tv.DataController.DataSource.DataSet is TClientDataSet)     then begin 
       Cds := tv.DataController.DataSource.DataSet as TClientDataSet; 
       for I := 0 to tv.SortedItemCount - 1 do begin 
         Index := tv.SortedItems[I].Index; 
         S := tv.Columns[Index].DataBinding.Field.FieldName +’;’; 
         AscFields := AscFields + S; 
         if tv.SortedItems[I].SortOrder = soDescending then 
           DescFields := DescFields + S; 
       end; 
       if AscFields <> ’’ then 
         Delete(AscFields, Length(AscFields), 1); //删除 ;

if DescFields <> ’’ then 
         Delete(DescFields, Length(DescFields), 1); 
       IndexPrint := TimeToStr(Now()); 
       Cds.IndexDefs.Clear; 
       IndexPrint := TimeToStr(Now()); 
       cds.AddIndex(IndexPrint, AscFields, [], DescFields); 
       cds.IndexName := IndexPrint; 
     end; 
end;
****************************************************************************
60cxGRID怎么遍历已经选择的单元格
解决:
n := cxGrid1DBTableView1.DataController.GetSelectedCount;   
       
      for   i:=0   to   n   -   1   do   
      begin   
          Index   :=   cxGrid1DBTableView1.DataController.GetSelectedRowIndex(i);   
          if   Index   <   0   then   continue;   
          AccID   :=   
                          cxGrid1DBTableView1.DataController.GetRowvalue(   
                          cxGrid1DBTableView1.DataController.GetRowInfo(Index)   
                          ,0);   
          AccID   :=   dsData.DataSet.FieldByName(’AccountID’).AsString;   
     
      end; 
n := cxGrid1DBTableView1.DataController.GetSelectedCount;   
      for   i:=0   to   n   -   1   do   
      begin   
          Index   :=   cxGrid1DBTableView1.DataController.GetSelectedRowIndex(i);   
          if   Index   <   0   then   continue;   
          AccID   := cxGrid1DBTableView1.DataController.GetRowvalue(   
                  cxGrid1DBTableView1.DataController.GetRowInfo(Index)   
                  ,0);//这里的0是列的索引,能指定,也可用通过GridView获取   
     
      end;
****************************************************************************
61动态设置显示格式
解决:
procedure SetDisplayFormat(ACtrlData: TClientDataSet;
TbView: TcxGridDBTableView);
var
i: integer;
begin
if ACtrlData.RecordCount <= 0 then Exit;
try
    TbView.ClearItems;
    ACtrlData.First;
    for i := 0 to ACtrlData.RecordCount - 1 do
    begin
      if ACtrlData.FieldByName('SQBF_DisplayInGrid').AsString = '1' then //在表格中显示
      with TbView.CreateColumn do
      begin
        DataBinding.FieldName := ACtrlData.FieldByName('SQBF_FieldName').AsString;
        Caption := ACtrlData.FieldByName('SQBF_Caption').AsString; //字段中文标题
        Hint := ACtrlData.FieldByName('SQBF_Hint').AsString;
        Width := ACtrlData.FieldByName('SQBF_Width').AsInteger;
        HeaderAlignmentHorz := taCenter;
      end;
      ACtrlData.Next;
    end;
except
    on E: Exception do
      SaveLog('设置显示格式时出错:' + E.Message);
end;
end;
****************************************************************************
62给cxGRID加序号列
解决:
procedure SetRowNumber(var ASender: TcxGridTableView; 
AViewInfo: TcxCustomGridIndicatorItemViewInfo; 
   var ACanvas: TcxCanvas; var ADone: boolean);

uses cxLookAndFeelPainters;

procedure SetRowNumber(var ASender: TcxGridTableView; AViewInfo: TcxCustomGridIndicatorItemViewInfo; 
   var ACanvas: TcxCanvas; var ADone: boolean); 
var 
   AIndicatorViewInfo: TcxGridIndicatorRowItemViewInfo; 
   ATextRect: TRect; 
   AFont: TFont; 
   AFontTextColor, AColor: TColor; 
begin 
   AFont := ACanvas.Font; 
   AColor := clBtnFace; 
   AFontTextColor := clWindowText ; 
if (AViewInfo is TcxGridIndicatorHeaderItemViewInfo) then begin 
   ATextRect := AViewInfo.Bounds; 
   InflateRect(ATextRect, -1, -1); 
     
   ASender.LookAndFeelPainter.DrawHeader(ACanvas, AViewInfo.Bounds, 
     ATextRect, [], cxBordersAll, cxbsNormal, taCenter, 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); 
   ASender.LookAndFeelPainter.DrawHeader(ACanvas, AViewInfo.ContentBounds, 
     ATextRect, [], [bBottom, bLeft, bRight], cxbsNormal, taCenter, vaCenter, 
     False, False, IntToStr(AIndicatorViewInfo.GridRecord.Index + 1), 
     AFont, AFontTextColor, AColor); 
   ADone := True; 
ASender.LookAndFeelPainter.DrawIndicatorImage(ACanvas,ATextRect, AIndicatorViewInfo.IndicatorKind); 
end;

如果你不要行标志的话,你可以不改控件 
直接注释掉这一行: ASender.LookAndFeelPainter.DrawIndicatorImage(ACanvas, ATextRect, AIndicatorViewInfo.IndicatorKind); 
要标志的话,在DrawIndicatorImage 从这里跟进去(Ctrl+左键单击) 
在 cxLookAndFeelPainters 单元中作如下修改:

class procedure TcxCustomLookAndFeelPainter.DrawIndicatorImage(ACanvas: TcxCanvas; 
   const R: TRect; AKind: TcxIndicatorKind); 
var 
   X, Y: Integer; 
begin 
   if AKind = ikNone then Exit; 
   with cxIndicatorImages, R do 
   begin 
     X := (Left + Right - Width);               //靠右 
     Y := (Top + Bottom - Height) div 2;       //居中 
   end; 
   cxIndicatorImages.Draw(ACanvas.Canvas, X, Y, Ord(AKind) - 1); 
end;

注意,我已注明靠右的那一行, 就是去掉 DIV 2 了, 
还要改一个地方: 
SKIN控件目录下的dxSkinLookAndFeelPainter单元,找到 
TdxSkinLookAndFeelPainter.DrawIndicatorImage 函数 
的 
OffsetRect(ARect, (Left + Right - cx div 2) , (Top + Bottom - cy) div 2); 
这一行,将 (Left + Right - cx div 2) 改为(Left + Right - cx) 也是去掉 div 2 就是靠右; 
修改后: OffsetRect(ARect, (Left + Right - cx) , (Top + Bottom - cy) div 2);

使用 
procedure TForm1.cxGrid1DBTableView1CustomDrawIndicatorCell( 
   Sender: TcxGridTableView; ACanvas: TcxCanvas; 
   AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean); 
begin 
     SetRowNumber(Sender,AviewInfo,ACanvas,ADone); 
end;

另外序号列的列宽最好改为25以上!
效果图:

****************************************************************************
63 cxGrid自带过滤后数据也数据集同步
解决:
在cxGrid的View Filter事件的OnBeforeChange中写代码就可以了. 
procedure TForm1.tvcxgd1DBTableView1DataControllerFilterBeforeChange( Sender: TcxDBDataFilterCriteria; ADataSet: TDataSet; const AFilterText: String); begin //这里可以增加数据集控件的filter:=false; //如:adoquery.filter:=false; //如果使用的是cxgrid的汉化版本,可以将AFilterText中的 中文等于,小于 替换成 = <等 //adoquery.filter:=替换了中文的AFilterText; ShowMessage(AFilterText); end; 写了上述步骤后可以在tvcxgd1DBTableView1DataControllerFilterChanged写adoquery.filter:=true; 这样就起到了cxgrid过滤后的数据同步到adoquery的数据集,打印的时候就可以打印出符合要求的记录了。

cxGrid使用汇总4的更多相关文章

  1. cxGrid使用汇总(一)

    1. 去掉cxGrid中台头的Box 解决:在tableview1的ptionsview的groupbybox=false; 2.统计功能 解决:(1) tableview 1. tableview1 ...

  2. cxGrid使用汇总2

    17. 怎样设计多表头的cxGrid? 解决:cxGrid可以解决如下的表头: --------------------------------- | 说明1 | 说明2 | ------------ ...

  3. cxGrid使用汇总1

    这些都不是原创,只是平时收集到资料然后整理的,有些可能百度一下到处都是而且还大同小异也有些不是很好找,现在贴出来希望给那些用到cxGrid的人会有所帮助 1. 去掉cxGrid中台头的Box 解决:在 ...

  4. Delphi cxGrid使用汇总(一)

    1. 去掉cxGrid中台头的Box解决:在tableview1的ptionsview的groupbybox=false; 2.统计功能解决:(1) tableview1. tableview1的op ...

  5. cxGrid使用汇总3

    32根据单元的值设置样式   解决:procedure   <aForm>.<aColumn>StylesGetContentStyle(         Sender:   ...

  6. cxGrid使用汇总

    1.自动行高:CellAutoHeight(单元自动高度)设置为True. procedure <AForm>.<AGridColumn>PropertiesValidate( ...

  7. 关于 cxGrid 的过滤问题

    http://bbs.csdn.net/topics/390536919 关于 cxGrid 的过滤问题 [问题点数:20分,结帖人zhengyc653]             不显示删除回复   ...

  8. Delphi CxGrid 汇总(4)

    1.     CxGrid汇总功能 ① OptionsView-Footer设置为True,显示页脚   ② CxGrid的Summary选项卡定义要汇总的列和字段名及汇总方式,Footer选项卡定义 ...

  9. Delphi CxGrid 汇总(2)

    17. 怎样设计多表头的cxGrid? 解决:cxGrid可以解决如下的表头: --------------------------------- | 说明1 | 说明2 | ------------ ...

随机推荐

  1. keep-alive pipeline区别

    在http1.1中,引入了一种新的特性,即pipeline.那么什么是pipeline呢?pipeline其实就是流水线作业,它可以看作为keepalive的一种升华,因为pipeline也是基于长连 ...

  2. Android Studio 项目中,哪些文件应该忽略而不提交到svn的服务器中?

    Android Studio 中建议过滤的文件: - .idea 文件夹 - .gradle 文件夹 - 所有的 build 文件夹 - 所有的 .iml 文件 - local.properties  ...

  3. Android使用http协议与服务器通信

    网上介绍Android上http通信的文章很多,不过大部分只给出了实现代码的片段,一些注意事项和如何设计一个合理的类用来处理所有的http请求以及返回结果,一般都不会提及.因此,自己对此做了些总结,给 ...

  4. VVDocumenter规范注释生成器

    下载地址:https://github.com/onevcat/VVDocumenter-Xcode PS:Xcode 8.0 默认支持了,但是是关闭状态,需要在终端输入如下命令开启,然后重启 Xco ...

  5. 内存管理 初始化(二)bootmem位图分配器建立 及 使用

    本地的笔记有点长,先把bootmem位图分配器的建立 及  使用过程做下梳理. 都是代码,上面做了标注.开始的汇编部分省略了(涉及的内容不多,除了swapper_pg_dir的分配). 该记录不会再添 ...

  6. 装饰模式(Decorator Pattern)--------结构型模式

    装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为.装饰模式降低类系统的耦合度,可以动态地增加或删除对象的职责,并使得需要装饰的具体构件类和具体装饰类可以独立变化,以便增加新的具体构件 ...

  7. 为Hadoop集群选择合适的硬件配置

    随着Apache Hadoop的起步,云客户的增多面临的首要问题就是如何为他们新的的Hadoop集群选择合适的硬件. 尽管Hadoop被设计为运行在行业标准的硬件上,提出一个理想的集群配置不想提供硬件 ...

  8. 绝对定位多个字居中显示的css

    在工作中遇到一种情况,例如把一个div元素绝对定位到一个位置,但是该元素中的文字个数不确定,还要保证始终该文字是居中显示,则可以定义两个div,外层div绝对定位并加一个宽度,内层div居中 .box ...

  9. 新浪股票接口AndroidSDK

    昨天想到一个点子,需要访问股票行情.于是在网上搜了一下免费的股市行情的接口.发现新浪股票的数据接口比较稳定,于是就用它了. 网上对于新浪股票的数据接口介绍比较详细,并且实现也很简单,所以花了一下午就基 ...

  10. 让Zend Studio联系关系CakePHP模板文件.ctp

    让Zend Studio关联CakePHP模板文件.ctp Zend Studio是套强大的PHP编辑器,各种给力让PHP开发者爱不释手.对于CakePHP程序员来说,有件事情相当头疼,在初始安装好Z ...