delphi CXGRID用法 (取行、列值;定位选中某行等等)

时间:2021-09-11 08:26:27

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;  cxGrid的DBTableView的名称为dgtv1

1. 返回选中的行数 gdtv1.DataController.GetSelectedCount; 

2. 返回选中行的索引: gdtv1.DataController.GetSelectedRowIndex(0) , 表示第一个选中行的索引

3. 返回选中行的数据;    

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; 

4. 获取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);  

5.获取多选的值

for   i   :=   0   to   cxgrid1.SelectedRows.Count-1   do begin  

cxgrid1.DataSource.DataSet.GotoBookmark(Pointer(cxgrid1.SelectedRows.Items[i])); //定位选中的字段 end;  

6.//选择行的第1列的值 

for I:=0 to cxGrid1DBTableView1.DataController.GetSelectedCount - 1 do  begin 

J := cxGrid1DBTableView1.DataController.GetSelectedRowIndex(I); 

ShowMessage(VarToStr(cxGrid1DBTableView1.DataController.GetValue(J, 0)));   end;  

7.获取所选行的值 

with cxGrid1DBTableView1.Controller do  

begin 

for i:=0 to SelectedRowCount-1   do    

begin 

SelectedRows[i].Focused:=True; 

ShowMessage(ADOQuery1.fieldbyname(‘mc‘).AsString);   

end; 

end

cxGrid功能强大,适合做企业级的复杂查询。非常方便。

但是对其用法介绍的并不多,在此总结他人的使用经验和自己的一点小经验,供大家参考。

(1)动态设置显示格式

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;

(2)显示行号

procedure TFmQueryBase.cxDBViewMasterCustomDrawIndicatorCell(

Sender: TcxGridTableView; ACanvas: TcxCanvas;

AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean);

var

FValue: string;

FBounds: TRect;

begin

FBounds := AViewInfo.Bounds;

if (AViewInfo is TcxGridIndicatorRowItemViewInfo) then

begin

ACanvas.FillRect(FBounds);

ACanvas.DrawComplexFrame(FBounds, clBlack, clBlack, [bBottom, bLeft, bRight], 1);

FValue := IntToStr(TcxGridIndicatorRowItemViewInfo(AViewInfo).GridRecord.Index+1);

InflateRect(FBounds, -3, -2); //Platform specific. May not work on Linux.

ACanvas.Font.Color := clBlack;

ACanvas.Brush.Style := bsClear;

ACanvas.DrawText(FValue, FBounds, cxAlignCenter or cxAlignTop);

ADone := True;

end;

end;

(3)设置显示格式,我的项目要求先动态添加字段,这时不知道字段类型,所以设置DisplayFormat不方便,我还没有找到好方法。

所以采用打开数据集后再设置:

procedure TFmQueryBase.cdsMasterAfterOpen(DataSet: TDataSet);

var

i: Integer;

begin

for i := 0 to cxDBViewMaster.DataController.DataSet.FieldCount -1 do

begin

if cxDBViewMaster.DataController.DataSet.Fields[i] is TNumericField then

begin

if Pos(‘AMOUNT‘, UpperCase(cxDBViewMaster.DataController.DataSet.Fields[i].FieldName)) > 0 then

begin

TNumericField(cxDBViewMaster.DataController.DataSet.Fields[i]).DisplayFormat := ‘#,##0.000‘;

Continue;

end;

if Pos(‘QUANTITY‘, UpperCase(cxDBViewMaster.DataController.DataSet.Fields[i].FieldName)) > 0 then

begin

TNumericField(cxDBViewMaster.DataController.DataSet.Fields[i]).DisplayFormat := ‘#,##0.000‘;

Continue;

end;

if Pos(‘MONEY‘, UpperCase(cxDBViewMaster.DataController.DataSet.Fields[i].FieldName)) > 0 then

begin

TNumericField(cxDBViewMaster.DataController.DataSet.Fields[i]).DisplayFormat := ‘#,##0.00‘;

Continue;

end;

end;

end;

end;

2007-7-19 12:48:54   

查看评语&raquo;&raquo;&raquo;    

2007-7-19 12:53:09    别人的,转载

最近在学习使用cxGrid,安装的版本是ExpressQuantumGrid   Suite   v5.10  

我发现这个控件功能虽然强大,但是非常难用。  

现在我手头就有几个问题还没解决:  

1)主从模式下导出Excel中文会产生乱码,,而且从表内容没有导出。  

我不知道是不是因为我的字段名包括单引号的原因。  

导出代码:ExportGrid4ToExcel(FileName,   cxGrid);  

2)主从模式下通过按钮对从表添加/删除行,代码怎么写。  

附:单表添加/删除行的代码  

procedure   TFormAccount.cxButtonNewClick(Sender:   TObject);  

begin  

Self.tvAccount.DataController.Append;  

Self.tvAccount.Columns[0].Focused   :=   True;  

cxGrid.SetFocus;  

end;  

procedure   TFormAccount.cxButtonDeleteClick(Sender:   TObject);  

begin  

if   Self.tvAccount.DataController.RowCount   =   0   then  

Exit;  

if   Application.MessageBox(‘确认删除当前记录?‘,   ‘确认删除‘,  

MB_YesNo   +   MB_IconQuestion)   =   IDNO   then  

Exit;  

Self.tvAccount.DataController.DeleteFocused;  

end;  

3)动态创建主从结构出错(Compiler没错,运行时出现系统错误0000000018),  

我使用了二个ADOStoreProcedure作主从表  

代码如下:  

var  

Level:   TcxGridLevel;  

GridView:   TcxGridDBTableView;  

begin  

Level   :=   cxGrid1.Levels[0].Add;  

GridView   :=   TcxGridDBTableView(cxGrid1.CreateView(TcxGridDBTableView));  

GridView.DataController.DataSource   :=   Self.dsDetail;  

GridView.DataController.KeyFieldNames   :=   ‘PurchOrderID;POLineNbr;PromiseDate;ReceiverDate‘;  

GridView.DataController.MasterKeyFieldNames   :=   ‘VendorID‘;  

GridView.DataController.DetailKeyFieldNames   :=   ‘VendorID‘;  

GridView.DataController.DataModeController.SmartRefresh   :=   True;  

GridView.OptionsCustomize.ColumnHiding   :=   True;  

GridView.OptionsCustomize.ColumnsQuickCustomization   :=   True;  

GridView.OptionsData.Deleting   :=   False;  

GridView.OptionsData.Inserting   :=   False;  

GridView.OptionsView.Indicator   :=   True;  

Level.GridView   :=   GridView;  

GridView   :=   TcxGridDBTableView(cxGrid1.Levels[0].GridView);  

GridView.DataController.KeyFieldNames   :=   ‘VendorID‘;  

GridView.OptionsView.GroupByBox   :=   False;  

//显示主表内容  

tvResult.BeginUpdate;  

tvResult.ClearItems;  

tvResult.DataController.CreateAllItems;  

tvResult.EndUpdate;  

//显示明细表内容  

GridView   :=   TcxGridDBTableView(cxGrid1.Levels[0].Items[0].GridView);  

GridView.BeginUpdate;  

GridView.ClearItems;  

GridView.DataController.CreateAllItems;  

GridView.DataController.Refresh;  

GridView.EndUpdate;  

end;

技巧二:在内置右键菜单的后面增加菜单项  

首先应在Form上加一个cxGridPopupMenu控件   以启用右键菜单  

UseBuildInPopupMenus设为True  

procedure   TFormItemList.FormCreate(Sender:   TObject);  

var  

AMenu:   TComponent;  

FMenuItem,   FSubMenuItem:   TMenuItem;  

begin  

AMenu   :=   nil;  

if   cxGridPopupMenu.BuiltInPopupMenus.Count   =   0   then  

Exit;  

AMenu   :=   cxGridPopupMenu.BuiltInPopupMenus[0].PopupMenu; //第一个内置右键菜单(表头菜单)  

if   Assigned(AMenu)   and   AMenu.InheritsFrom(TPopupMenu)   then  

begin  

TPopupMenu(AMenu).AutoHotkeys   :=   maManual;         //手动热键  

//-------------------------  

FMenuItem   :=   TMenuItem.Create(Self);  

FMenuItem.Caption   :=   ‘-‘;  

FMenuItem.Name   :=   ‘miLineForGroup‘;  

TPopupMenu(AMenu).Items.Add(FMenuItem);  

//展开所有组  

FMenuItem   :=   TMenuItem.Create(Self);  

FMenuItem.Name   :=   ‘miExpandAllGroup‘;  

FMenuItem.Caption   :=   ‘展开所有组(&X)‘;  

FMenuItem.OnClick   :=   miExpandAllGroupClick;  

TPopupMenu(AMenu).Items.Add(FMenuItem);  

//收缩所有组  

FMenuItem   :=   TMenuItem.Create(Self);  

FMenuItem.Name   :=   ‘miCollapseAllGroup‘;  

FMenuItem.Caption   :=   ‘收缩所有组(&O)‘;  

FMenuItem.OnClick   :=   miCollapseAllGroupClick;  

TPopupMenu(AMenu).Items.Add(FMenuItem);  

//-------------------------  

FMenuItem   :=   TMenuItem.Create(Self);  

FMenuItem.Caption   :=   ‘-‘;  

TPopupMenu(AMenu).Items.Add(FMenuItem);  

//过滤面板  

FMenuItem   :=   TMenuItem.Create(Self);  

FMenuItem.Name   :=   ‘miFilterPanel‘;  

FMenuItem.Caption   :=   ‘过滤面板(&P)‘;  

//自动显示  

FSubMenuItem   :=   TMenuItem.Create(Self);  

FSubMenuItem.Name   :=   ‘miFilterPanelAuto‘;  

FSubMenuItem.Caption   :=   ‘自动(&A)‘;  

FSubMenuItem.RadioItem   :=   True;  

FSubMenuItem.GroupIndex   :=   5; //指定同一组  

FSubMenuItem.Checked   :=   True;  

FSubMenuItem.OnClick   :=   miFilterPanelClick;  

FMenuItem.Add(FSubMenuItem); //加入二级子菜单  

//总是显示  

FSubMenuItem   :=   TMenuItem.Create(Self);  

FSubMenuItem.Name   :=   ‘miFilterPanelAlways‘;  

FSubMenuItem.Caption   :=   ‘总是显示(&W)‘;  

FSubMenuItem.RadioItem   :=   True;  

FSubMenuItem.GroupIndex   :=   5;  

FSubMenuItem.OnClick   :=   miFilterPanelClick;  

FMenuItem.Add(FSubMenuItem);  

//从不显示  

FSubMenuItem   :=   TMenuItem.Create(Self);  

FSubMenuItem.Name   :=   ‘miFilterPanelNerver‘;  

FSubMenuItem.Caption   :=   ‘从不显示(&N)‘;  

FSubMenuItem.RadioItem   :=   True;  

FSubMenuItem.GroupIndex   :=   5;  

FSubMenuItem.OnClick   :=   miFilterPanelClick;  

FMenuItem.Add(FSubMenuItem);  

TPopupMenu(AMenu).Items.Add(FMenuItem);  

//自定义过滤  

FMenuItem   :=   TMenuItem.Create(Self);  

FMenuItem.Name   :=   ‘miCustomFilter‘;  

FMenuItem.Caption   :=   ‘自定义过滤(&M)‘;  

FMenuItem.OnClick   :=   miCustomFilterClick;   

TPopupMenu(AMenu).Items.Add(FMenuItem);  

//过滤管理器  

FMenuItem   :=   TMenuItem.Create(Self);  

FMenuItem.Name   :=   ‘miFilterBuilder‘;  

TPopupMenu(AMenu).Images.AddImage(FormMain.ImageListExtend,   44); //添加图标图像  

FMenuItem.ImageIndex   :=   TPopupMenu(AMenu).Images.Count   -   1; //指定图标序号  

FMenuItem.Caption   :=   ‘过滤管理器‘;  

FMenuItem.OnClick   :=   Self.miFilterBuilderClick;  

TPopupMenu(AMenu).Items.Add(FMenuItem);  

//---------------------  

FMenuItem   :=   TMenuItem.Create(Self);  

FMenuItem.Caption   :=   ‘-‘;  

TPopupMenu(AMenu).Items.Add(FMenuItem);  

//导出  

FMenuItem   :=   TMenuItem.Create(Self);  

FMenuItem.Name   :=   ‘miExport‘;  

TPopupMenu(AMenu).Images.AddImage(FormMain.ImageListExtend,   37);  

FMenuItem.ImageIndex   :=   TPopupMenu(AMenu).Images.Count   -   1;  

FMenuItem.Caption   :=   ‘导出(&E)‘;  

FMenuItem.OnClick   :=   Self.miExportClick;  

TPopupMenu(AMenu).Items.Add(FMenuItem);  

//打印  

FMenuItem   :=   TMenuItem.Create(Self);  

FMenuItem.Name   :=   ‘miPrint‘;  

FMenuItem.Caption   :=   ‘打印(&P)‘;  

TPopupMenu(AMenu).Images.AddImage(FormMain.ImageListExtend,   14);  

FMenuItem.ImageIndex   :=   TPopupMenu(AMenu).Images.Count   -   1;  

FMenuItem.OnClick   :=   Self.miPrintClick;  

TPopupMenu(AMenu).Items.Add(FMenuItem);  

end;  

end;  

procedure   TFormItemList.miExportClick(Sender:   TObject);  

var  

FileName,   FileExt,   msg:   String;  

begin  

if   Self.aqyQuery.IsEmpty   then  

begin  

msg   :=   ‘没有导出数据...‘;  

Application.MessageBox(PChar(msg),   PChar(Application.Title),  

MB_OK   or   MB_IconWarning);  

Exit;  

end;  

Self.SaveDialogExport.Filter   :=   ‘Excel文件   (*.xls)|*.xls|XML文件   (*.xml)|*.xml‘  

+   ‘|文本文件   (*.txt)|*.txt|网页文件   (*.html)|*.html‘;  

Self.SaveDialogExport.Title   :=   ‘导出为‘;  

if   not   Self.SaveDialogExport.Execute   then  

Exit;  

FileName   :=   Self.SaveDialogExport.FileName;  

FileExt   :=   LowerCase(ExtractFileExt(FileName));  

if   FileExt   =   ‘.xls‘   then  

ExportGrid4ToExcel(FileName,   Self.cxGrid1)  

else   if   FileExt   =   ‘.xml‘   then  

ExportGrid4ToXML(FileName,   Self.cxGrid1)  

else   if   FileExt   =   ‘.txt‘   then  

ExportGrid4ToText(FileName,   Self.cxGrid1)  

else   if   FileExt   =   ‘.html‘   then   

ExportGrid4ToHTML(FileName,   Self.cxGrid1)  

else  

begin  

msg   :=   ‘不支持的导出文件类型...‘;  

Application.MessageBox(PChar(msg),   PChar(Application.Title),  

MB_OK   or   MB_IconError);  

Exit;  

end;  

msg   :=   ‘导出完成...‘;  

Application.MessageBox(PChar(msg),   PChar(Application.Title),  

MB_OK   or   MB_IconInformation);  

end;  

procedure   TFormItemList.miPrintClick(Sender:   TObject);  

begin  

//打印  

Self.dxComponentPrinter.Preview(True,   Self.dxComponentPrinterLink1);  

end;  

procedure   TFormItemList.cxGridPopupMenuPopup(ASenderMenu:   TComponent;  

AHitTest:   TcxCustomGridHitTest;   X,   Y:   Integer;   var   AllowPopup:   Boolean);  

begin  

if   GetHitTypeByHitCode(AHitTest.HitTestCode)   =   gvhtColumnHeader   then //右击列标题时  

begin  

//if   tvResult.DataController.Groups.GroupingItemCount   >   0   then  

if   tvResult.GroupedColumnCount   >   0   then //有分组时显示  

begin  

TMenuItem(Self.FindComponent(‘miLineForGroup‘)).Visible   :=   True;  

TMenuItem(Self.FindComponent(‘miExpandAllGroup‘)).Visible   :=   True;  

TMenuItem(Self.FindComponent(‘miCollapseAllGroup‘)).Visible   :=   True;  

end  

else  

begin  

TMenuItem(Self.FindComponent(‘miLineForGroup‘)).Visible   :=   False;  

TMenuItem(Self.FindComponent(‘miExpandAllGroup‘)).Visible   :=   False;  

TMenuItem(Self.FindComponent(‘miCollapseAllGroup‘)).Visible   :=   False;  

end;  

end;  

end;  

procedure   TFormItemList.miFilterBuilderClick(Sender:   TObject);  

begin  

//过滤管理器  

//弹出Filter   Builder   Dialog对话框  

tvResult.Filtering.RunCustomizeDialog;  

end;  

procedure   TFormItemList.miCustomFilterClick(Sender:   TObject);  

var  

AHitTest:   TcxCustomGridHitTest;  

begin  

//自定义过滤  

//弹出Custom   Filter   Dialog对话框  

AHitTest   :=   cxGridPopupMenu.HitTest;  

if   GetHitTypeByHitCode(AHitTest.HitTestCode)   =   gvhtColumnHeader   then //获得右击的列  

tvResult.Filtering.RunCustomizeDialog(TcxGridColumnHeaderHitTest(AHitTest).Column);  

end;  

procedure   TFormItemList.miFilterPanelClick(Sender:   TObject);  

var  

mi:   TMenuItem;  

begin  

//隐藏/显示过滤面板  

mi   :=   TMenuItem(Sender);  

mi.Checked   :=   True;  

if   mi.Name   =   ‘miFilterPanelAlways‘   then  

tvResult.Filtering.Visible   :=   fvAlways  

else   if   mi.Name   =   ‘miFilterPanelNerver‘   then  

tvResult.Filtering.Visible   :=   fvNever  

else  

tvResult.Filtering.Visible   :=   fvNonEmpty;  

end;  

procedure   TFormItemList.miExpandAllGroupClick(Sender:   TObject);  

begin  

//展开所有组  

tvResult.DataController.Groups.FullExpand;  

end;  

procedure   TFormItemList.miCollapseAllGroupClick(Sender:   TObject);  

begin  

//收缩所有组  

tvResult.DataController.Groups.FullCollapse;  

end;