cxGrid使用汇总4

简介: 49指定Filter   Builder打开/保存过滤文件的默认路径解决:uses         ...,   cxFilterControlDialog;       procedure   TForm.

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的数据集,打印的时候就可以打印出符合要求的记录了。

相关文章
5G 物理资源 |带你读《5G空口特性与关键技术》之八
基站信道带宽是指基站侧上下行所支持的单个 NR 射频载波。同一频段下,支持不同的 UE 信道带宽。在基站信道带宽范围内,UE 信道带宽可以灵活配置。UE 的 BWP 的信号等于或者小于 RF 载波的载波资源块数时,基站就能够在任何载波资源块上收发 UE 的 1 个或者多个 BWP 的信号。
5G 物理资源  |带你读《5G空口特性与关键技术》之八
|
Arthas 监控 Java
Arthas vmtool(从 jvm 里查询对象,执行 forceGc)
Arthas vmtool(从 jvm 里查询对象,执行 forceGc)
906 16
|
存储 缓存 安全
HashMap VS TreeMap:谁才是Java Map界的王者?
HashMap VS TreeMap:谁才是Java Map界的王者?
757 2
|
机器学习/深度学习 人工智能 编解码
Text to Bark:让狗狗听懂人话!全球首个AI"狗语"生成器,137种狗狗口音任君挑选
ElevenLabs推出的Text to Bark是全球首个能将文本转换为逼真狗吠声的AI模型,支持多种犬种选择并适配智能家居设备,其核心技术基于深度神经网络训练。
2765 15
Text to Bark:让狗狗听懂人话!全球首个AI"狗语"生成器,137种狗狗口音任君挑选
|
数据中心
网络拓扑类型分类
本内容介绍了六种常见的网络拓扑结构:总线型、星型、环型、树型、网状型和混合型。每种结构均包含定义、优点、缺点及应用场景的详细说明。例如,总线型成本低但可靠性差;星型易于管理但中心节点负担重;网状型可靠性高但成本昂贵;混合型则结合多种结构以优化性能,但设计复杂。这些拓扑适用于不同规模和需求的网络环境,如家庭网络、企业网络及数据中心等。
3170 13
|
SQL 监控 索引
如何在 SQL Server 中使用 `PATINDEX` 函数
【8月更文挑战第8天】
1403 9
|
网络协议 算法 数据库
搞清RIP和OSPF的区别,这是我见过最好的总结!
搞清RIP和OSPF的区别,这是我见过最好的总结!
1399 0
|
Java 关系型数据库 测试技术
SV学习笔记(四)
SV学习笔记(四)
1341 0
|
iOS开发 开发者
iOS 上架报错:无法添加以供审核
iOS 上架报错:无法添加以供审核

热门文章

最新文章