zoukankan      html  css  js  c++  java
  • cxGrid使用汇总4

    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 数据排序与对应的数据集同步
    解决:
    COPYRIGHT BY cnCharles, ALL RIGHTS RESERVED.
    delphi群: 16497064, blog: http://hi.baidu.com/cnCharles 
         //描述: 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的数据集,打印的时候就可以打印出符合要求的记录了。

  • 相关阅读:
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result
    smarty {for}{forelse}
    整理了一份比较全面的PHP开发编码规范.
    安装SQL server 提示重新启动计算机失败
    使用自定义《UIActivity》进行内容分享-b
    五子棋-b
    iOS面试题16719-b
    iOS 图片填充 UIImageView
    将UIImage保存到iOS照片库和对应程序沙盒中-b
    IOS webview中cookie的读取与保存-b
  • 原文地址:https://www.cnblogs.com/china1/p/3370941.html
Copyright © 2011-2022 走看看