Delphi CxGrid 匯總(4)


1.     CxGrid匯總功能

 OptionsView-Footer設置為True,顯示頁腳   ② CxGrid的Summary選項卡定義要匯總的列和字段名及匯總方式,Footer選項卡定義單個匯總,Default For Groups定義按組匯總。OptionsView-GroupFooters設置為gfAlwaysVisible則顯示按組匯總。設置后界面如圖。

   

2.       CxGrid的樣式設置

 當設置了Kind時,NativeStyle必須設置為False,如果指定了SkinNameKind屬性失效。

  

下圖是設置skinnameMoneyTwins后效果

  

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屬性設置為vsButtonsOnlyOptions-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]);

****************************************************************************
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 保存后的行設置為當前行
解決:

[delphi]  view plain copy
  1. const    
  2.       CM_SETFOCUSEDRECORD   =   WM_USER   +   1002;    
  3.      
  4. type    
  5.       TForm1   =   class(TForm)    
  6.           cxGrid1DBTableView1:   TcxGridDBTableView;    
  7.           cxGrid1Level1:   TcxGridLevel;    
  8.           cxGrid1:   TcxGrid;    
  9.           dxMemData1:   TdxMemData;    
  10.           dxMemData1Field1:   TStringField;    
  11.           dxMemData1Field2:   TIntegerField;    
  12.           DataSource1:   TDataSource;    
  13.           cxGrid1DBTableView1RecId:   TcxGridDBColumn;    
  14.           cxGrid1DBTableView1Field1:   TcxGridDBColumn;    
  15.           cxGrid1DBTableView1Field2:   TcxGridDBColumn;    
  16.           Timer1:   TTimer;    
  17.           CheckBox1:   TCheckBox;    
  18.           procedure   Timer1Timer(Sender:   TObject);    
  19.           procedure   dxMemData1AfterPost(DataSet:   TDataSet);    
  20.           procedure   CheckBox1Click(Sender:   TObject);    
  21.       private    
  22.           procedure   CMSetFocusedRecord(var   Msg:   TMessage);   message   CM_SETFOCUSEDRECORD;    
  23.       public    
  24.           {   Public   declarations   }    
  25.       end;    
  26.      
  27. var    
  28.       Form1:   TForm1;    
  29.       FocusedIdx:   Integer;    
  30.      
  31.      
  32. implementation    
  33.      
  34. {$R   *.dfm}    
  35.      
  36. procedure   TForm1.Timer1Timer(Sender:   TObject);    
  37. begin    
  38.       dxMemData1.AppendRecord(['',   IntToStr(Random(1000)),   Random(1000)]);    
  39. end;    
  40.      
  41. procedure   TForm1.dxMemData1AfterPost(DataSet:   TDataSet);    
  42. begin    
  43.       PostMessage(Handle, CM_SETFOCUSEDRECORD,   Integer(cxGrid1DBTableView1),   MakeLParam(cxGrid1DBTableView1.Controller.FocusedRowIndex,   cxGrid1DBTableView1.Controller.TopRowIndex));    
  44. end;    
  45.      
  46. procedure   TForm1.CMSetFocusedRecord(var   Msg:   TMessage);    
  47. begin    
  48.       TcxGridDBTableView(msg.WParam).Controller.FocusedRowIndex   :=   Msg.LParamLo;    
  49.       TcxGridDBTableView(msg.WParam).Controller.TopRowIndex   :=   Msg.LParamHi;    
  50. end;    
  51.      
  52. procedure   TForm1.CheckBox1Click(Sender:   TObject);    
  53. begin    
  54.       Timer1.Enabled   :=   TCheckBox(Sender).Checked;    
  55. end;    
  56.      
  57. end.  
  58. ****************************************************************************  
  59. 58 刪除記錄並獲得焦點  
  60. 解決:  
  61. procedure   TForm1.BtnDeleteClick(Sender:   TObject);    
  62. var    
  63.       FocusedRow,   TopRow:   Integer;    
  64.       View:   TcxGridTableView;    
  65.       DataController:   TcxGridDataController;    
  66. begin    
  67.       View   :=   cxGrid1.FocusedView   as   TcxGridTableView;    
  68.       DataController   :=   View.DataController;    
  69.      
  70.       //   Remember   the   top   row   (the   vertical   scrollbar   position)    
  71.       TopRow   :=   View.Controller.TopRowIndex;    
  72.       //   Remember   the   focused   row(!)   index    
  73.       FocusedRow   :=   DataController.FocusedRowIndex;    
  74.      
  75.       DataController.DeleteFocused;    
  76.      
  77.       //   After   deletion   the   same   row   must   be   focused,    
  78.       //   although   it   will   correspond   to   a   different   data   record    
  79.       DataController.FocusedRowIndex   :=   FocusedRow;    
  80.       //   Restore   the   top   row    
  81.       View.Controller.TopRowIndex   :=   TopRow;    
  82. end;  
  83. ****************************************************************************  
  84. 59 cxGrid的 TableView 數據排序與對應的數據集同步  
  85. 解決:  
  86. COPYRIGHT BY cnCharles, ALL RIGHTS RESERVED.  
  87. delphi群: 16497064, blog: http://hi.baidu.com/cnCharles     
  88.   
  89.      //描述: cxGrid的 TableView 數據排序與對應的數據集同步, 該方法主要用於打印時  
  90.        //         的排序與所見到的排序保持一致;  
  91.        //參數: @tv: 排序的cxGridTableView  
  92.        //說明: @tv: 對應的數據集只支持 ADOQuery與 ClientDataSet;  
  93.        procedure cxGridSortSyncToDataSet(tv: TcxGridDBTableView); overload;  
  94.   
  95.        //描述: 功能同上, 實現代碼一樣, 如果有更改就同步更改  
  96.        procedure cxGridSortSyncToDataSet(tv: TcxGridDBBandedTableView); overload;  
  97.   
  98. procedure cxGridSortSyncToDataSet(tv: TcxGridDBTableView);  
  99. const  
  100.      SortArray: array[soAscending..soDescending] of string = (’ASC’, ’DESC’);  
  101. var  
  102.      AscFields, DescFields, S, SortOrder: string;  
  103.      IndexPrint: string;  
  104.      I: integer;  
  105.      Index: integer;  
  106.      cds: TClientDataSet;  
  107. begin  
  108.      S := ’’;  
  109.      AscFields := ’’;  
  110.      DescFields := ’’;  
  111.      if tv.SortedItemCount = 0 then  
  112.        Exit;  
  113.      if tv.DataController.DataSource.DataSet is TADOQuery then begin  
  114.        for I := 0 to tv.SortedItemCount - 1 do begin  
  115.          SortOrder := SortArray[tv.SortedItems[I].SortOrder];  
  116.          if S <> ’’ then  
  117.            S := S + ’, ’;  
  118.          Index := tv.SortedItems[I].Index;  
  119.          S := S + tv.Columns[Index].DataBinding.Field.FieldName + ’ ’ + SortOrder;  
  120.        end;  
  121.        (tv.DataController.DataSource.DataSet as TADOQuery).Sort := S;  
  122.      end else if (tv.DataController.DataSource.DataSet is TClientDataSet)     then begin  
  123.        Cds := tv.DataController.DataSource.DataSet as TClientDataSet;  
  124.        for I := 0 to tv.SortedItemCount - 1 do begin  
  125.          Index := tv.SortedItems[I].Index;  
  126.          S := tv.Columns[Index].DataBinding.Field.FieldName +’;’;  
  127.          AscFields := AscFields + S;  
  128.          if tv.SortedItems[I].SortOrder = soDescending then  
  129.            DescFields := DescFields + S;  
  130.        end;  
  131.        if AscFields <> ’’ then  
  132.          Delete(AscFields, Length(AscFields), 1); //刪除 ;  
  133.   
  134.        if DescFields <> ’’ then  
  135.          Delete(DescFields, Length(DescFields), 1);  
  136.        IndexPrint := TimeToStr(Now());  
  137.        Cds.IndexDefs.Clear;  
  138.        IndexPrint := TimeToStr(Now());  
  139.        cds.AddIndex(IndexPrint, AscFields, [], DescFields);  
  140.        cds.IndexName := IndexPrint;  
  141.      end;  
  142. end;  
  143. ****************************************************************************  
  144. 60 cxGRID怎么遍歷已經選擇的單元格  
  145. 解決:  
  146. n := cxGrid1DBTableView1.DataController.GetSelectedCount;    
  147.         
  148.       for   i:=0   to   n   -   1   do    
  149.       begin    
  150.           Index   :=   cxGrid1DBTableView1.DataController.GetSelectedRowIndex(i);    
  151.           if   Index   <   0   then   continue;    
  152.           AccID   :=    
  153.                           cxGrid1DBTableView1.DataController.GetRowvalue(    
  154.                           cxGrid1DBTableView1.DataController.GetRowInfo(Index)    
  155.                           ,0);    
  156.           AccID   :=   dsData.DataSet.FieldByName(’AccountID’).AsString;    
  157.       
  158.       end;  
  159. n := cxGrid1DBTableView1.DataController.GetSelectedCount;    
  160.       for   i:=0   to   n   -   1   do    
  161.       begin    
  162.           Index   :=   cxGrid1DBTableView1.DataController.GetSelectedRowIndex(i);    
  163.           if   Index   <   0   then   continue;    
  164.           AccID   := cxGrid1DBTableView1.DataController.GetRowvalue(    
  165.                   cxGrid1DBTableView1.DataController.GetRowInfo(Index)    
  166.                   ,0);//這里的0是列的索引,能指定,也可用通過GridView獲取    
  167.       
  168.       end;  
  169. ****************************************************************************  
  170. 61 動態設置顯示格式  
  171. 解決:  
  172. procedure SetDisplayFormat(ACtrlData: TClientDataSet;  
  173. TbView: TcxGridDBTableView);  
  174. var  
  175. i: integer;  
  176. begin  
  177. if ACtrlData.RecordCount <= 0 then Exit;  
  178. try  
  179.     TbView.ClearItems;  
  180.     ACtrlData.First;  
  181.     for i := 0 to ACtrlData.RecordCount - 1 do  
  182.     begin  
  183.       if ACtrlData.FieldByName('SQBF_DisplayInGrid').AsString = '1' then //在表格中顯示  
  184.       with TbView.CreateColumn do  
  185.       begin  
  186.         DataBinding.FieldName := ACtrlData.FieldByName('SQBF_FieldName').AsString;  
  187.         Caption := ACtrlData.FieldByName('SQBF_Caption').AsString; //字段中文標題  
  188.         Hint := ACtrlData.FieldByName('SQBF_Hint').AsString;  
  189.         Width := ACtrlData.FieldByName('SQBF_Width').AsInteger;  
  190.         HeaderAlignmentHorz := taCenter;  
  191.       end;  
  192.       ACtrlData.Next;  
  193.     end;  
  194. except  
  195.     on E: Exception do  
  196.       SaveLog('設置顯示格式時出錯:' + E.Message);  
  197. end;  
  198. end;  

****************************************************************************
62 給cxGRID加序號列
解決:

[delphi]  view plain copy
  1. procedure SetRowNumber(var ASender: TcxGridTableView;  
  2. AViewInfo: TcxCustomGridIndicatorItemViewInfo;  
  3.    var ACanvas: TcxCanvas; var ADone: boolean);  
  4.   
  5. uses cxLookAndFeelPainters;  
  6.   
  7. procedure SetRowNumber(var ASender: TcxGridTableView; AViewInfo: TcxCustomGridIndicatorItemViewInfo;  
  8.    var ACanvas: TcxCanvas; var ADone: boolean);  
  9. var  
  10.    AIndicatorViewInfo: TcxGridIndicatorRowItemViewInfo;  
  11.    ATextRect: TRect;  
  12.    AFont: TFont;  
  13.    AFontTextColor, AColor: TColor;  
  14. begin  
  15.    AFont := ACanvas.Font;  
  16.    AColor := clBtnFace;  
  17.    AFontTextColor := clWindowText ;  
  18. if (AViewInfo is TcxGridIndicatorHeaderItemViewInfo) then begin  
  19.    ATextRect := AViewInfo.Bounds;  
  20.    InflateRect(ATextRect, -1, -1);  
  21.       
  22.    ASender.LookAndFeelPainter.DrawHeader(ACanvas, AViewInfo.Bounds,  
  23.      ATextRect, [], cxBordersAll, cxbsNormal, taCenter, vaCenter,  
  24.      False, False, '序號', AFont, AFontTextColor, AColor);  
  25.      ADone := True;  
  26.    end ;  
  27. if not (AViewInfo is TcxGridIndicatorRowItemViewInfo) then  
  28.      Exit;  
  29.    ATextRect := AViewInfo.ContentBounds;  
  30.    AIndicatorViewInfo := AViewInfo as TcxGridIndicatorRowItemViewInfo;  
  31.    InflateRect(ATextRect, -1, -1);  
  32.    ASender.LookAndFeelPainter.DrawHeader(ACanvas, AViewInfo.ContentBounds,  
  33.      ATextRect, [], [bBottom, bLeft, bRight], cxbsNormal, taCenter, vaCenter,  
  34.      False, False, IntToStr(AIndicatorViewInfo.GridRecord.Index + 1),  
  35.      AFont, AFontTextColor, AColor);  
  36.    ADone := True;  
  37. ASender.LookAndFeelPainter.DrawIndicatorImage(ACanvas,ATextRect, AIndicatorViewInfo.IndicatorKind);  
  38. end;  
  39.   
  40. 如果你不要行標志的話,你可以不改控件  
  41. 直接注釋掉這一行: ASender.LookAndFeelPainter.DrawIndicatorImage(ACanvas, ATextRect, AIndicatorViewInfo.IndicatorKind);  
  42. 要標志的話,在DrawIndicatorImage 從這里跟進去(Ctrl+左鍵單擊)  
  43. 在 cxLookAndFeelPainters 單元中作如下修改:  
  44.   
  45. class procedure TcxCustomLookAndFeelPainter.DrawIndicatorImage(ACanvas: TcxCanvas;  
  46.    const R: TRect; AKind: TcxIndicatorKind);  
  47. var  
  48.    X, Y: Integer;  
  49. begin  
  50.    if AKind = ikNone then Exit;  
  51.    with cxIndicatorImages, R do  
  52.    begin  
  53.      X := (Left + Right - Width);               //靠右  
  54.      Y := (Top + Bottom - Height) div 2;       //居中  
  55.    end;  
  56.    cxIndicatorImages.Draw(ACanvas.Canvas, X, Y, Ord(AKind) - 1);  
  57. end;  
  58.   
  59. 注意,我已注明靠右的那一行, 就是去掉 DIV 2 了,  
  60. 還要改一個地方:  
  61. SKIN控件目錄下的dxSkinLookAndFeelPainter單元,找到  
  62. TdxSkinLookAndFeelPainter.DrawIndicatorImage 函數  
  63. 的  
  64. OffsetRect(ARect, (Left + Right - cx div 2) , (Top + Bottom - cy) div 2);  
  65. 這一行,將 (Left + Right - cx div 2) 改為(Left + Right - cx) 也是去掉 div 2 就是靠右;  
  66. 修改后: OffsetRect(ARect, (Left + Right - cx) , (Top + Bottom - cy) div 2);  
  67.   
  68. 使用  
  69. procedure TForm1.cxGrid1DBTableView1CustomDrawIndicatorCell(  
  70.    Sender: TcxGridTableView; ACanvas: TcxCanvas;  
  71.    AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean);  
  72. begin  
  73.      SetRowNumber(Sender,AviewInfo,ACanvas,ADone);  
  74. end;  
  75.   
  76. 另外序號列的列寬最好改為25以上!  
  77. 效果圖:  

****************************************************************************
63 cxGrid自帶過濾后數據也數據集同步
解決:
在cxGrid的View Filter事件的OnBeforeChange中寫代碼就可以了.

[delphi]  view plain copy
  1. procedure TForm1.tvcxgd1DBTableView1DataControllerFilterBeforeChange( Sender: TcxDBDataFilterCriteria; ADataSet: TDataSet; const AFilterText: String);   
  2.   
  3. begin   
  4.   
  5. //這里可以增加數據集控件的  
  6.   
  7. filter:=false//如:adoquery.filter:=false; //如果使用的是cxgrid的漢化版本,可以將AFilterText中的中文等於,小於 替換成 = <等 //adoquery.filter:=替換了中文的AFilterText; ShowMessage(AFilterText); end; 寫了上述步驟后可以在tvcxgd1DBTableView1DataControllerFilterChanged寫 adoquery.filter:=true; 這樣就起到了cxgrid過濾后的數據同步到adoquery  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM