cxGrid使用汇总4
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的更多相关文章
- cxGrid使用汇总(一)
		
1. 去掉cxGrid中台头的Box 解决:在tableview1的ptionsview的groupbybox=false; 2.统计功能 解决:(1) tableview 1. tableview1 ...
 - cxGrid使用汇总2
		
17. 怎样设计多表头的cxGrid? 解决:cxGrid可以解决如下的表头: --------------------------------- | 说明1 | 说明2 | ------------ ...
 - cxGrid使用汇总1
		
这些都不是原创,只是平时收集到资料然后整理的,有些可能百度一下到处都是而且还大同小异也有些不是很好找,现在贴出来希望给那些用到cxGrid的人会有所帮助 1. 去掉cxGrid中台头的Box 解决:在 ...
 - Delphi cxGrid使用汇总(一)
		
1. 去掉cxGrid中台头的Box解决:在tableview1的ptionsview的groupbybox=false; 2.统计功能解决:(1) tableview1. tableview1的op ...
 - cxGrid使用汇总3
		
32根据单元的值设置样式 解决:procedure <aForm>.<aColumn>StylesGetContentStyle( Sender: ...
 - cxGrid使用汇总
		
1.自动行高:CellAutoHeight(单元自动高度)设置为True. procedure <AForm>.<AGridColumn>PropertiesValidate( ...
 - 关于 cxGrid 的过滤问题
		
http://bbs.csdn.net/topics/390536919 关于 cxGrid 的过滤问题 [问题点数:20分,结帖人zhengyc653] 不显示删除回复 ...
 - Delphi CxGrid 汇总(4)
		
1. CxGrid汇总功能 ① OptionsView-Footer设置为True,显示页脚 ② CxGrid的Summary选项卡定义要汇总的列和字段名及汇总方式,Footer选项卡定义 ...
 - Delphi CxGrid 汇总(2)
		
17. 怎样设计多表头的cxGrid? 解决:cxGrid可以解决如下的表头: --------------------------------- | 说明1 | 说明2 | ------------ ...
 
随机推荐
- AWT中文译为抽象窗口工具包
			
AWT(Abstract Window Toolkit),中文译为抽象窗口工具包,是Java提供的用来建立和设置Java的图形用户界面的基本工具. AWT由Java中的java.awt包提供,里面包含 ...
 - Python——greenlet
			
目录 1. 介绍 2. 父greenlet 3. 实例化 4. 在greenlets间切换 5. 垂死的greenlets 6. greenlet的方法和属性 7. greenlets和Python线 ...
 - ARM mbed平台WIZwiki-W7500使用说明
			
ARM mbed IDE 是ARM内核微控制器的在线开发工具,其站点是:http://developer.mbed.org. 站点提供了在线编译器,不须要本地安装编译器就可以进行开发,因此没有地点.时 ...
 - 制作CentOS fence-agents 镜像
			
1, Download centos7 iso file: Centos7 ISO download: http://buildlogs.centos.org/rolling/7/isos/x86_6 ...
 - oracle转mysql总结
			
oracle转mysql总结 ares-sdk初始开发测试使用的是oracle数据库,由于宁波通商的特殊需要,必须把数据库环境从oracle转向mysql. 现对转换过程中出现的问题及经验总结如下: ...
 - 小程序笔记四:表单提交form
			
index.wxml代码 <form bindsubmit="formSubmit" bindreset="formReset"> <view ...
 - angular.extend深拷贝(deep copy)
			
在用到angular.extend的时候,正好碰到一个对象,是层层嵌套的Array, 结果发现只能extend第一层,查阅官文档,确实不支持deep copy: Note: Keep in mind ...
 - Java编程思想学习笔记——注解
			
前言 在Android开发的过程中,我们为了减少重复代码的编写,会使用类似ButterKnife,AndroidAnnotations 这类依赖注解库.代码示例如下: //不使用 Button btn ...
 - es 5  数组reduce方法记忆
			
reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始合并,最终为一个值. 概念:对数组中的所有元素调用指定的回调函数.该回调函数的返回值为累积结果,并 ...
 - idea中mybatis generator自动生成代码配置 数据库是sqlserver
			
好长时间没有写博客了,最近公司要用java语言,开始学习java,属于初学者,今天主要记录一下mybatis generator自动生成代码,首先在如下图的目录中新建两个文件,如下图 generato ...