cxGrid使用总结

1、cxgrid 如何动态创建列?

var i: Integer;
  Column: TcxGridDBColumn;
  cxView: TcxGridDBTableView;  
begin
  cxView := Self.Levels[0].GridView as TcxGridDBTableView;
  if cxView.DataController.DataSource <> nil then
    if cxView.DataController.DataSource.DataSet <> nil then
    begin
      cxView.ClearItems;
      for i:=0 to  cxView.DataController.DataSource.DataSet.FieldCount-1 do 
    	begin
         Column := cxView.CreateColumn;
         Column.DataBinding.FieldName := cxView.DataController.DataSource.DataSet.Fields[i].FieldName;
         Column.PropertiesClass := TcxTextEditProperties;
      end;
    end;
end;
for i := 0 to Query.FieldCount - 1 do   
begin   
  cxGrid.CreateColumn;   
  cxGrid.columns[i].DataBinding.FieldName := Query.Fields[i].DisplayName;   
  cxGrid.Columns[i].Caption := 'XXXX';   
  cxGrid.Columns[i].Width   :=80;   
end;

2、cxgrid默认把“0.1”显示为“.1”,小数点前的0没有显示出来

CxGrid 默认把 “0.1” 显示为 “.1” ,0没有显示出来。如何解决。

方法1:

properties属性中选择calcedit

方法2:
properties属性中选择CurrencyEdit 或maskedit等
选择CurrencyEdit,   其displayformat设为: #.#;-,#.#  或0.#;-,0.#

3、获取所选行的值

for I := 0 to cxGridDBTableView1.Controller.selectedRowCount - 1 do
      begin
        cxGridDBTableView1.Controller.SelectedRows[i].Focused := True;
        ShowMessage(dsDevice.DataSet.FieldByName('id').AsString);
      end;

4、选取行的第一列的值

for I :=0 to cxGrid1DBTableView1.DataController.GetSelectedCount-1 do
begin
  J:=cxGrid1DBTableView1.DataController.GetSelectedRowIndex(1);
  ShowMessage(VarToStr(cxGrid1DBTableView1.DataController.GetValue(J,0)));
end;

 5、获取多选的值

for   i   :=   0   to   cxgrid1.SelectedRows.Count-1   do
begin 
 cxgrid1.DataSource.DataSet.GotoBookmark(Pointer(cxgrid1.SelectedRows.Items[i])); //定位选中的字段
end;

6、获取cxGrid排序规则

const
   OrderArray: array[soNone..soDescending] of string = ('None', 'ASC', 'DESC');
var
   I: integer;
   S, OrderStr: string;
begin
   for I := 0 to gdtv1.SortedItemCount - 1 do begin
     if S <> '' then
       S := S + ', ';
     OrderStr := OrderStr + gdtv1.SortedItems[I].DataBinding.DefaultCaption + ' ';
     OrderStr := OrderStr + OrderArray[TcxDataSortOrder(gdtv1.SortedItems[I].SortOrder)];
     S := S + OrderStr;
   end;
   ShowMessage('ORDER BY ' + S);

7、返回选中行数

gdtv1.DataController.GetSelectedCount;

8、返回选中行的索引

gdtv1.DataController.GetSelectedRowIndex(0)表示第一个选中行的索引

9、返回选中行的数据;

var
   I, J:Integer;
begin
   for I:=0 to gdtv1.DataController.GetSelectedCount - 1 do begin
     J := gdtv1.DataController.GetSelectedRowIndex(I);
     ShowMessage(VarToStr(gdtv1.DataController.GetValue(J, 0))); //选择中行的第列的值
   end;
end;

10、获取cxGrid排序规则

const
   OrderArray: array[soNone..soDescending] of string = ('None', 'ASC', 'DESC');
var
   I: integer;
   S, OrderStr: string;
begin
   for I := 0 to gdtv1.SortedItemCount - 1 do begin
     if S <> '' then
       S := S + ', ';
     OrderStr := OrderStr + gdtv1.SortedItems[I].DataBinding.DefaultCaption + ' ';
     OrderStr := OrderStr + OrderArray[TcxDataSortOrder(gdtv1.SortedItems[I].SortOrder)];
     S := S + OrderStr;
   end;
   ShowMessage('ORDER BY ' + S);

11、Delphi Cxgrid获取选中行列,排序规则,当前正在编辑的单元格内的值

cxGrid1DBTableView1.Controller.FocusedRowIndex 当前行号
cxGrid1DBTableView1.Controller.FocusedRow 当前行
cxGrid1DBTableView1.Controller.FocusedColumn 当前列
cxGrid1DBTableView1.Controller.FocusedColumnIndex 当前列号
cxGrid1DBTableView1.Controller.EditingItem 当前编辑中的单元框
cxGrid1DBTableView1.Controller.EditingController.Edit 当前的编辑框
在编辑状态下可以这样取当前单元格的值:
if cxGrid1DBTableView1.Controller.FocusedColumn.Editing then
ShowMessage(cxGrid1DBTableView1.Controller.EditingController.Edit.EditingValue)
else
cxGrid1DBTableView1.DataController.GetValue(cxGrid1DBTableView1.DataController.FocusedRecordIndex,
cxGrid1DBTableView1.Controller.FocusedItemIndex);
非编辑状态下可以这样取得单元格内的值:
OnCellClick事件代码: 
procedure   TForm1.cxGrid1DBTableView1CellClick( 
    Sender:   TcxCustomGridTableView; 
    ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton; 
    AShift: TShiftState;   var   AHandled: Boolean); 
var 
    v : Variant; 
begin 
    v := ACellViewInfo.Value; 
end;

取列值
i := cxGrid1DBBandedTableView1.Controller.FocusedColumn.Index;
cxGrid1DBBandedTableView1.DataController.GetValue(cxGrid1DBBandedTableView1.Controller.SelectedRows[0].RecordIndex,i);
cxGrid1DBTableView1.DataController.Values[行,列]
取得焦点
cxGrid1DBTableView1.Columns[5].FocusWithSelection;
cxGrid1DBTableView1.Columns[4].Focused:=True;
得到当前点击的单元格的值
uses   Clipbrd;
OnCellClick事件代码:
procedure   TForm1.cxGrid1DBTableView1CellClick(
    Sender:   TcxCustomGridTableView;
    ACellViewInfo:   TcxGridTableDataCellViewInfo;   AButton:   TMouseButton;
    AShift:   TShiftState;   var   AHandled:   Boolean);
var
    v   :   Variant;
begin
    v   :=     ACellViewInfo.Value;//值
    Clipboard.AsText     :=     vartostr(v);//保存到clipboard
end;

12、cxGrid内容xlsx、xls、csv格式导出

.xls格式导出,uses中添加cxGridExportLink

代码如下:

function SaveToExcel(gridMain: TcxGrid; FileName: string): string;
var
    SaveFileDialog: TSaveDialog;
begin
    //示例:SaveToExcel(dxDBGrid1,'默认文件名');
    SaveFileDialog := TSaveDialog.Create(nil);
    SaveFileDialog.FileName := FileName;
    SaveFileDialog.Filter := '*.xls';
    if SaveFileDialog.Execute then
    begin
        if pos('.XLS', UpperCase(SaveFileDialog.FileName)) <= 0 then
            SaveFileDialog.FileName := SaveFileDialog.FileName + '.XLS';
        ExportGridToExcel(SaveFileDialog.FileName, gridMain);
        ShowMessage('数据已成功导出到您指定的目录中');
    end;
    Result := SaveFileDialog.FileName;
    SaveFileDialog.Free;
end;

.csv格式导出,uses中添加cxGridExportLink

代码如下:

begin
    Screen.Cursor := crSQLWait;
    FileNameCache := FileName + FormatDateTime('YYYYMMDD', NOW);
    FileName := FileNameCache + '.CSV';
    FilePathCache := 'C:/TMP/' + FileNameCache;
    FilePath := FilePathCache + '.CSV';
    ExportGridToText(FilePathCache + '.XLS', cxGrid_M, True, True, ',', '', '', 'CSV');
    Screen.Cursor := crDefault;
end;

.xlsx格式无法通过cxGrid现有封装的方法实现,可以通过.xls/.csv格式转换成.xlsx格式。

代码如下:

procedure Saveto_xlsx(tn: string; fn: string);
var
   ExcelApp, Excelbook, ExcelChart: OleVariant;
//tn:需要转换格式的源文件路径
//fn:转换之后的文件存储路径
begin
   try
      ExcelApp := CreateOleObject('Excel.Application');
      ExcelApp.Visible := True;//False
      ExcelApp.Caption := '应用程序调用 Microsoft Excel';
      ExcelApp.Application.DisplayAlerts := False;
      ExcelApp.WorkBooks.Open(tn);
      ExcelApp.ActiveWorkbook.SaveAs(fn, 51);
      ExcelApp.Application.Quit;
      ExcelApp.Application.DisplayAlerts := True;
      Excelapp := Null;
   except
      Application.Messagebox('Excel 没有安装!', 'Hello', MB_ICONERROR + mb_Ok);
      Abort;
   end;
end;

13、GroupPanel上面的英文[Drag a column header to group by that column]怎么可以改成中文?
    解决:最简单的方法是 TcxGridTableView.OnCustomDrawPartBackground ,也可用 OnCustomDrawGroupCell:

procedure TForm1.cxGrid1DBTableView1CustomDrawPartBackground(Sender: TcxGridTableView; ACanvas: TcxCanvas;AViewInfo: TcxCustomGridCellViewInfo; var ADone: Boolean);
begin
  AViewInfo.Text:='动态设置 GroupBox 的显示内容';
  ACanvas.FillRect(AViewInfo.Bounds);
end;
注:改成中文后将字段拖上去中文还是会显示,最好是设置空值

14、Delphi中关于DevExpress VCL汉化方法

用法1:在工程中加入控件cxLocalizer;

在程序中加入如下语句:

Localizer.LoadFromFile(‘DevLocal.ini‘);

Localizer.Language := '中文(简体,中国)';

Localizer.Active := true;

用法2:用DevExpress提供的工具cxLocalizerEditor打开这个ini文件,然后File->Build Resource File...;

在工程中加入控件cxLocalizer;

在程序中加入如下语句:

{$R 语言文件.res}

Localizer.LoadFromResource(HInstance);

Localizer.Language := '中文(简体,中国)';

Localizer.Active := true;

用法2可将语言嵌入程序内部而不需要分发res文件
 

15、设置cxGrid标题栏背景色

选择TableView.backgroundBitmaps属性background选项

16、 设置cxGrid标题栏背景色外观

选择cxGrid控件,设置LookAndFeel.Kind属性(lfOffice11)

17、实现标题头伸缩的功能

procedure TfrmQuery.cxgrdbclmnIDHeaderClick(Sender: TObject);
begin
  self.GridTreeExpand := not self.GridTreeExpand;

  if self.GridTreeExpand then
    self.cxgrdDeviceDataDBTableView1.ViewData.Expand(True)
  else
    self.cxgrdDeviceDataDBTableView1.ViewData.Collapse(True);
end;

18、列内容居中

property 设为lable  子属性horz设为center

19、行高列宽定义

行高度定义

TableView->OptionView->dataRowHieght  即可设置行高度

自动调整行宽

1、选中cxgridview,在属性中找OptionsView--->ColumAutoWidth,把这个属性设为True;

2、在adoquery的open之后加上如下代码即可

  1. for i := 0 to cxGridView1.ColumnCount - 1 do  
  2. begin  
  3.   cxGridView1.Columns[i].ApplyBestFit();  
  4. end; 

20、行高、行分隔线颜色、字体

行高: TableView->OptionView->dataRowHieght

颜色:TableView->OptionView->GridLineColor

字体:cxGrid->Font

21、cxGridDBTableView设置风格用style属性

(1)每创建一个style会生成一个TcxStyleRepository

(2)设置新创建的style属性,style可以应用到其他cxGridDBTableView

22、cxGrid高级特性

(1)过滤器

过滤器可以用于快速查找和过滤数据。以下是一个简单的演示:

// 创建过滤器
cxGridView1.DataController.Filter.Root.Clear;
cxGridView1.DataController.Filter.Active := True;
cxGridView1.DataController.Filter.Root.AddItem(cxGridColumn1, foEqual, 'ALFKI', 'ALFKI');

上面的代码中,我们首先清空了过滤器的根节点,并激活了过滤器。然后,我们添加了一个过滤条件,即对CustomerID等于'ALFKI'的记录进行过滤。

(2)排序

排序可以将数据按照指定的列进行升序或降序排列。以下是一个简单的演示:

// 创建排序
cxGridView1.DataController.Sorting.Clear;
cxGridView1.DataController.SortBy(cxGridColumn2, True);

上面的代码中,我们首先清空了排序设置,并按照CompanyName列进行升序排列。 

(3)分组

分组可以将数据按照指定的列进行分组,以便更好地展示和分析数据。以下是一个简单的演示:

// 创建分组
cxGridView1.DataController.Groups.Clear;
cxGridView1.DataController.Groups.Add(cxGridColumn2);

上面的代码中,我们首先清空了分组设置,并按照CompanyName列进行分组。 

(4)汇总

汇总可以对数据按照指定的列进行统计分析,例如计算总数、平均数、最大值和最小值等。以下是一个简单的演示:

// 创建汇总
cxGridView1.DataController.Summary.Clear;
cxGridView1.DataController.Summary.FooterSummaryItems[0].Column := cxGridColumn1;
cxGridView1.DataController.Summary.FooterSummaryItems[0].Kind := skCount;
cxGridView1.DataController.Summary.FooterSummaryItems[0].Format := 'Count = %d';

 上面的代码中,我们首先清空了汇总设置,并设置了一个统计项,即对CustomerID列进行计数,并使用指定格式('Count = %d')显示计数结果。

23、构建多级视图

View.DetailKeyFieldNames设上级视图主键的外键

24、delphi 动态设置和访问cxgrid列的Properties 

设置:

  cxGrid1DBTableView1Column.PropertiesClass   =   TcxTextEditProperties;  
  cxGrid1DBTableView1Column.PropertiesClass   =   TcxDateEditProperties;  
  cxGrid1DBTableView1Column.PropertiesClass   =   TcxCalcEditProperties;  
  cxGrid1DBTableView1Column.PropertiesClass   =   TcxCheckboxProperties;  
  等  
   
  访问:  
  cxGrid1DBTableView1Column.Properties     as   TcxTextEditProperties  
  cxGrid1DBTableView1Column.Properties     as   TcxDateEditProperties;  
  cxGrid1DBTableView1Column.Properties     as   TcxCalcEditProperties;

if (cxGridDeviceDBTableView1Column3.PropertiesClass=TcxComboBoxProperties) then
  begin
    TcxComboBoxProperties(cxGridDeviceDBTableView1Column3.Properties).Items := TDeviceModelService.GetAllModel;
  end; 

转载于:https://www.cnblogs.com/acmexyz/p/10515013.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值