cxGrid 使用指南 3

时间:2021-10-28 05:18:50

公司目前这个项目要大量的用CxGrid,以前我从未用过,所以被逼得焦头烂额.加之我用的这电脑系统貌似有问题(老出些莫明其妙的事儿,如:突然不能编译出exe,上班开机突然丢失大堆的DLL文件,F9执行后关掉EXE Delphi就死掉了...)有时候做得想骂娘.
现在特将收集的一些文章与大家分享,也希望大家不要重蹈我的覆辙.
  http://www.delphibbs.com/keylife/iblog_show.asp?xid=19911大富翁论坛-富翁笔记-cxgrid (数据库控件)控件的使用
  http://www.delphifans.com/infoView/Article_722.html『Delphi园地』-分享一下ExpressQuantumGrid4的cxGrid的一些使用方法和经验
  http://www.delphibbs.com/delphibbs/dispq.asp?lid=2843325CxGrid显示数据时有多少条记录就画多表格线,其它地方为空,有没有办法可以像DbGrid一样画满
  http://www.delphibbs.com/keylife/iblog_show.asp?xid=16001大富翁论坛-富翁笔记-ExpressQuantumGrid中如何将满足条件的记录用不同颜色显示?
  http://soft.etcell.com/topicView.aspx?Id=35970 开个贴子,专门讨论一下cxGrid,用过的进来看看 
  http://blog.csdn.net/nhconch/archive/2007/03/02/1519254.aspx让cxGrid像Excel那样高亮显示选区的行号列标
  http://community.csdn.net/Expert/topic/5642/5642196.xml?temp=.5949365关于手动向Cxgrid里面添加内容的问题。
  http://download.csdn.net/source/15030DevExpress QuantumGrid4.5 教程

欢迎大家在此帖中提问和解答,在此先谢谢大家!

 

=========================================================

cxgrid为Delphi 上强大的表格控件,可以基本上不用写代码,就可以完成许多的功能,像排序,过滤,分组等。
现在,我们要完成的就是利用cxgrid的强大的过滤器生成器,生成我们的数据库过滤脚本。
cxGrid 使用指南 3
虽然,dev express 提供了TcxDBFilterControl 和TcxFilterControl两个控件,但由于没有提供相应的帮助文件,导致使用起来很有难度。
首先,我们需要的是TcxDBFilterControl,这个好办,有控件可以直接用。
接着,怎么用,由于帮助文件的缺乏,这是最大的问题。
从cxDBFilterControl.pas可以看到这么一个函数
function ExecuteDBFilterControlDialog(ADataSet: TDataSet;
  ALookAndFeel: TcxLookAndFeel; AOnApplyProc: TNotifyEvent = nil;
  AOnShowDialog: TNotifyEvent = nil; AColor: TColor = clDefault;
  const AInitialDir: string = ''): Boolean;
注意到,这是全局函数,就是说可以直接使用的。
可以用来对给定的dataset生成相应的filterControl,使用时,只要传入要过滤的dataset,和一个cxgrid的 lookandFeel就可以了,当然,要真正的使用,还是需要指定apply或者show的事件代码(TNotifyEvent 类型的,就是只带sender:TObject参数的过程),传入相应的函数名就可以了。
比如说,我要为query1生成一个过滤器,在提交的时候,显示过滤器的文本内容
  • 创建OnApplyProc事件代码:
procedure OnApplyProc(Sender:TObject);
//sender就是传入的FilterControl本身,
//通过FilterText属性,就可以访问到生成的filter文本了
begin
    showmessage(TcxdbFiltercontrol(sender).FilterText);
end;
2.   调用ExecuteDBFilterControlDialog
procedure TForm1.Button1Click(Sender: TObject);
begin
  inherited;
  ExecuteDBFilterControlDialog(query1, cxgrid1.LookAndFeel,OnApplyProc);
end;
完成。在点击form1的button1后,出现filterbuilding dialog,点击OK之后呢,出现过滤器的文本。
可以通过把TcxDBFIlterControl的filtertext传递给query组件,放在where语句中,就可以实现服务器端的过滤了。
逝者如斯夫,不舍昼夜!

得到cxGrid被选(多选)后的字段内容

wITh   cxGrid1DBTableView1.Controller   do   
   begin   
         BeginUpdate   ;   
               for   iRow   :=   0   to   SelectedRowCount   -   1   do   
               begin   
                     SelectedRows[iRow].Focused   :=   True   ;         //我就差这句!   
                     valueStr   :=   DataSource.DatASEt.FieldValues['Name'];
ShowMessage(valueStr);   
              end;      
        EndUpdate   ;   
  end;
逝者如斯夫,不舍昼夜!
===============================================================
Developer Express的cxGrid控件是一个相当有特色的数据栅格组件,支持自动分组、卡片式显示、和像Excel那样的过滤功能等。不过它在多选区时的显示方式却不太友善,对于我这样还有点追求的人来说肯定是不会满足的了,于是通过它的OnDrawColumnHeader事件和OnDrawIndicatorCell事件把它变成像Excel那样以高亮显示行号列标。一切以图片说话,如下图:
cxGrid 使用指南 3

PS:我平时是用来显示数据的,没有考虑编辑状态;为了说明效果,cxGrid使用DBTableView并设成允许多选和选区方式(在OptionsView里有设)。
OnDrawColumnHeader事件源码如下:
procedure TfrmAccount.cxtvMasterCustomDrawColumnHeader(
  Sender: TcxGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
var
    AButtonState: TcxButtonState;
    ARect: TRect;
begin
    if AViewInfo.Column.Selected then begin
        AButtonState := cxbsHot;
        ARect := AViewInfo.Bounds;
        Sender.LookAndFeelPainter.DrawHeader(ACanvas, ARect, AViewInfo.TextAreaBounds
            , [], cxBordersAll, AButtonState, AViewInfo.Column.HeaderAlignmentHorz
            , AViewInfo.Column.HeaderAlignmentVert, False, False
            , AViewInfo.Column.Caption, ACanvas.Font, Sender.Styles.Selection.TextColor
            , Sender.Styles.Selection.Color);
{========================================================================
  DESIGN BY :  彭国辉
  DATE:        2007-03-02
  SITE:        
http://kacarton.yeah.net/
  BLOG:        http://blog.csdn.net/nhconch
  EMAIL:       kacarton#sohu.com
  文章为作者原创,转载前请先与本人联系,转载请注明文章出处、保留作者信息,谢谢支持!
=========================================================================}

        ARect.Left := ARect.Right - 19;
        ARect.Right := ARect.Right - 1;
        InflateRect(ARect, -1, -3);
        if AViewInfo.Column.Options.Filtering then begin
            Sender.LookAndFeelPainter.DrawFilterDropDownButton(ACanvas, ARect
                , cxbsNormal, AViewInfo.Column.Filtered);
            OffsetRect(ARect, -16, 0);
        end;
        if AViewInfo.Column.SortIndex <> -1 then
            Sender.LookAndFeelPainter.DrawSortingMark(ACanvas, ARect
                , AViewInfo.Column.SortOrder=soAscending);
        ADone := true;
    end;
end;
OnDrawIndicatorCell事件源码如下:
procedure TfrmAccount.cxtvMasterCustomDrawIndicatorCell(
  Sender: TcxGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean);
var
    AButtonState: TcxButtonState;
    clFont, clBrush: TColor;
begin
    if not (AViewInfo is TcxGridIndicatorRowItemViewInfo) then Exit;
    if TcxGridIndicatorRowItemViewInfo(AViewInfo).GridRecord.Selected then begin
        AButtonState := cxbsHot;
        if Sender.LookAndFeelPainter.LookAndFeelStyle = lfsOffice11 then begin
            clFont := ACanvas.Font.Color;
            clBrush := ACanvas.Brush.Color;
        end else begin
            clFont := Sender.Styles.Selection.TextColor;
            clBrush := Sender.Styles.Selection.Color;
       end;
    end else begin
        AButtonState := cxbsNormal;
        clFont := ACanvas.Font.Color;
        clBrush := ACanvas.Brush.Color;
    end;
    Sender.LookAndFeelPainter.DrawHeader(ACanvas, AViewInfo.ContentBounds,
        AViewInfo.ContentBounds, [], [bLeft, bRight, bBottom], AButtonState, taCenter
        , vaCenter, False, False, IntToStr(TcxGridIndicatorRowItemViewInfo(AViewInfo).GridRecord.Index + 1)
        , ACanvas.Font, clFont, clBrush);
    ADone := True;
end;
逝者如斯夫,不舍昼夜!


Delphi 动态创建 cxGrid Column

DevExpresscxGrid  实在太复杂了,连动态创建一个 View ,以及自动生成数据集的所有列,都不能使用一般的方法。下面显示了如何用代码来进行这些操作:
TableView := TcxGridDBTableView(cxGrid1.CreateView(TcxGridDBTableView));
with TableView do
begin
  DataController.DataSource := 数据源;
  (DataController as IcxCustomGridDataController).DeleteAllItems;
  (DataController as IcxCustomGridDataController).CreateAllItems;

end;
逝者如斯夫,不舍昼夜!


使用cxGrid对数据集进行Sort和Locate操作

在编写某个系统时,由于使用了数据集类型无关技术(即数据集可能是ADOQuery,也有可能是TClientDataSet等等)。当需要对数据进行排序和查找时,只好利用cxGrid自身的功能来实现:

function GridSortColumn(View : TcxGridDBTableView; FieldName : String) : Boolean;
var
  i : Integer;
begin
  {数据排序}
  Result := False;
  for i := 0 to View.ColumnCount -1 do
  begin
    if (UpperCase(View.Columns.DataBinding.FieldName) = FieldName) then
    begin
      View.Columns.SortIndex := 0;
      View.Columns.SortOrder := soAscending;
      Result := True;
    end
    else
    begin
      View.Columns.SortIndex := -1;
      View.Columns.SortOrder := soNone;
    end;
  end;
end;
function GridLocateRecord(View : TcxGridDBTableView; FieldName, LocateValue : String) : Boolean;
begin
  {数据查找}
  Result := False;
  if (View.GetColumnByFieldName(FieldName) <> nil) then
    Result := View.DataController.Search.Locate(View.GetColumnByFieldName(FieldName).Index, LocateValue);
end;
对于cxGrid排序后的数据集,不应该进行Next, Prior等操作,因为数据集的排序并没有变化,进行Next等操作时,会出现记录乱跳的情况,应该如下处理:
Prior:
DBView.DataController.FocusedRowIndex := DBView.DataController.FocusedRowIndex - 1;
Next:
DBView.DataController.FocusedRowIndex := DBView.DataController.FocusedRowIndex + 1;
逝者如斯夫,不舍昼夜!

=====================================================

1. 去掉cxgrid中台头的box ,在tableview1的ptionsview的groupbybox=false;
2. 在GRID footer 中加入sum(列), tableview1的optionsviewàfooter=ture
然后在cxGRid1的customize..中的summary 的footer.add需要合计的列kind= skSum
3. 去掉cxgrid 中的过滤下拉箭头选择tableview1.optionscustomize.columnfiltering=fasle;
4. cxGrid1DBTableView1的 OptionView中屬性GroupFooters設為gfAlwaysVisible並設置需要求和的列,在summary.defaultfor Groups 下add加入需要合计的字段,column下显示fieldname为统计字段,format为格式,kind为统计方法,position 为位子 spfooter 在分组的下面,spgroup 在分组的上面
或用cxGridPopupMenu1,在運行時可對任意數字類型列求和,方法是只需設置cxGridPopupMenu1的屬性Grid為cxGrid1DBTableView1的cxGrid,
即可實現您所需功能
5. DEV Express里的cxGrid默认的数值格式带¥,怎么去掉啊!
6. 雙擊Cxgrid,選擇colmnum改變類型 options.properties.Memo
7. 在displayformat中进行设置

设置行高
在cxGridDBTableView1.OptionsView.DataRowHeight

改变字体在
cxStyleRepository 双击它,在里面添加GridTableViewStyleSheetDevExpress
然后改变Style标签里面的cxStyle的字体就可以控制cxGrid的字体了