cxGrid使用技巧 转载自http://topic.csdn.net/t/20060106/09/4500997.html#

小技巧:用代码展开/收缩主从结构

Self.tvDepartment.ViewData.Expand(True);

Self.tvDepartment.ViewData.Collaspe(True);

注:tvDepartment为主表对应的TableView

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

首先应在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;

=========

技巧三 按条件计算合计值

在Footer的第一列显示[合计:]

加一个Summary项,Column设为Grid的第一列,Kind设为skNone

在该Summary项的OnGetText事件中,输入:

procedure TFormExpense.tvExpenseTcxGridDBDataControllerTcxDataSummaryFooterSummaryItems2GetText(

Sender: TcxDataSummaryItem; const AValue: Variant; AIsFooter: Boolean;

var AText: String);

begin

AText := '合计:';

end;

按条件汇总:

在TableView的DataController->Summary->FooterSummary->OnSummary事件中,输入:

procedure TFormExpense.tvExpenseDataControllerSummaryFooterSummaryItemsSummary(

ASender: TcxDataSummaryItems; Arguments: TcxSummaryEventArguments;

var OutArguments: TcxSummaryEventOutArguments);

begin

//得到字段名 TcxDBDataSummaryItem(Arguments.SummaryItem).FieldName;

if (ASender.DataController.Values[Arguments.RecordIndex, tvExpenseLevel.Index] > 1) //只统计Level列=1的值

and (TcxDBDataSummaryItem(Arguments.SummaryItem).Kind = skSum) then

OutArguments.Value := 0; //Level > 1的统计值设为0

end;

=========

技巧四:根据某列的值设定其它列的可编辑性

procedure TFormUser.tvUserEditing(Sender: TcxCustomGridTableView;

AItem: TcxCustomGridTableItem; var AAllow: Boolean);

begin

//如果第三列值为True,则第4列不能修改

if (tvUser.Controller.FocusedRecord.Values[2] = True) and (AItem.Index = 4) then

AAllow := False

else

AAllow := True;

end;

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

技巧五:保存/恢复Grid布局

//恢复布局

IniFileName := ExtractFilePath(Application.ExeName) + 'Layout\' + Self.Name + '.ini';

if FileExists(IniFileName) then

Self.tvResult.RestoreFromIniFile(IniFileName) //从布局文件中恢复

else

begin

Self.tvResult.BeginUpdate;

for i := 0 to Self.tvResult.ItemCount - 1 do

Self.tvResult.Items[i].ApplyBestFit; //调整为最佳宽度

Self.tvResult.EndUpdate;

end;

//保存布局

IniFileName := ExtractFilePath(Application.ExeName) + 'Layout\' + Self.Name + '.ini';

if not DirectoryExists(ExtractFileDir(IniFileName)) then

CreateDir(ExtractFileDir(IniFileName));

Self.tvResult.StoreToIniFile(IniFileName); //保存为布局文件

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

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

在主从TableView中根据主TableView得到对应的从TableView

var

ADetailDC: TcxGridDataController;

AView: TcxCustomGridTableView;

begin

with cxGrid1DBTableView1.DataController do

ADetailDC := TcxGridDataController(GetDetailDataController(FocusedRecordIndex, 0));

AView := ADetailDC.GridView;

end;

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

定位在第一行并显示内置编辑器

cxDBVerticalGrid1.FocusedRow := cxDBVerticalGrid1.Rows[0];

cxDBVerticalGrid1.ShowEdit;

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

隐藏 "<No data to display>" 字符串

该文本存储在scxGridNoDataInfoText资源字符串,可以将该资源字符串的内容设为空

来隐藏该文本。

uses cxClasses, cxGridStrs;

...

cxSetResourceString(@scxGridNoDataInfoText, '');

//如果"<No data to display>" 字符串已经显示,需要调用:

<View>.LayoutChanged;

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

删除应用过滤后的行

var

I: Integer;

begin

with <GridView> do

for I := 0 to ViewData.RecordCount - 1 do

begin

ViewData.Records[0].Focused := True;

DataController.DataSet.Delete;

end;

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

根据单元的值设置样式

procedure <aForm>.<aColumn>StylesGetContentStyle(

Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;

AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);

begin

if ARecord.Values[AItem.Index] = aSomeValue then

AStyle := <aSomeStyle>;

end;

procedure <aForm>.<aView>StylesGetContentStyle(

Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;

AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);

var

AColumn: TcxCustomGridTableItem;

begin

AColumn := (Sender as TcxGridDBTableView).GetColumnByFieldName('Email');

if VarToStr(ARecord.Values[AColumn.Index]) = '' then

AStyle := cxStyleNullEmail;

end;

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

TcxCustomGridTableView.FindItemByName, TcxGridDBTableView.GetColumnByFieldName or

TcxGridDBDataController.GetItemByFieldName

with cxGrid1DBBandedTableView1.DataController do

AValue := Values[FocusedRecordIndex, GetItemByFieldName('SomeFieldName').Index];

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

动态生成BandedView

var

AView: TcxCustomGridView;

begin

AView := <cxGrid>.CreateView(TcxGridDBBandedTableView);

TcxGridDBBandedTableView(AView).DataController.DataSource := <DataSource>;

TcxGridDBBandedTableView(AView).Bands.Add;

with TcxGridDBBandedTableView(AView).Bands.Add do

begin

Visible := False;

FixedKind := fkLeft;

end;

TcxGridDBBandedTableView(AView).DataController.CreateAllItems;

<cxGridLevel>.GridView := AView;

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

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

当底层数据集为空时显示一条空记录

procedure <Form>.<cxGrid>Enter(Sender: TObject);

var

View: TcxGridDBTableView;

begin

View := TcxGridDBTableView((Sender as TcxGrid).FocusedView);

if View.DataController.DataSet.IsEmpty then

begin

View.DataController.DataSet.Append;

View.Controller.EditingController.ShowEdit;

end;

end;

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

在当前View插入记录

使用FocusedView属性得到当前焦点View,用View.DataController得到对应的Data Controller,

之后使用Data Controller的方法来操作数据:

- Append

- Insert

- Post

- Cancel

- DeleteFocused

- DeleteSelection

示例:

var

ARecIndex: Integer;

View.DataController.Append;

ARecIndex := View.DataController.FocusedRecordIndex;

View.DataController.Values[ARecIndex, SomeItemIndex] := SomeValue;

View.DataController.Post;

另外一种方法是使用View.DataController.DataSource.DataSet得到底层数据集后,再用数据集的

方法来操作数据。

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

激活内置编辑控件

1) <aView>.Controller.EditingController.ShowEdit(<aColumn>);

2) <aView>.Controller.EditingController.StartEditShowingTimer(<aColumn>);

3) <aView>.Controller.EditingItem := <aColumn>;

4) <aColumn>.Editing := True;

隐藏内置编辑控件

<aView>.Controller.EditingController.HideEdit(True);

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

移除一个分组列

<aColumn>.GroupIndex := -1;

<aColumn>.Visible := True;

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

保存修改到数据库

procedure <aForm>.FormClose(Sender: TObject; var Action: TCloseAction);

begin

if (<aGrid>.FocusedView <> nil) and (<aGrid>.FocusedView.DataController.EditState <> []) then

<aGrid>.FocusedView.DataController.Post;

end;

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

设置内置右键菜单

内置右键菜单包括二个菜单:cxGridStdHeaderMenu, TcxGridStdFooterMenu

uses cxGridStdPopupMenu;

procedure TForm1.cxGridPopupMenu1Popup(ASenderMenu: TComponent;

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

begin

if ASenderMenu is TcxGridStdHeaderMenu then

TcxGridStdHeaderMenu(ASenderMenu).OnPopup := StdHeaderMenuPopup;

end;

procedure TForm1.StdHeaderMenuPopup(Sender: TObject);

var

I: Integer;

begin

with TcxGridStdHeaderMenu(Sender).Items do

for I := 0 to Count - 1 do

if Items[I].Caption = 'Group By Box' then

begin

Items[I].Enabled := False;

System.Break;

end

end;

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

得到选中记录的值

1) View.DataController.DataModeController.GridMode = False时

RecIdx := View.Controller.SelectedRecords[i].RecordIndex;

ColIdx := View.DataController.GetItemByFieldName(AFieldName).Index;

OutputVal := View.DataController.Values[RecIdx, ColIdx];

//RecID := View.DataController.GetRecordId(RecIdx);

//OutputVal := ADataSet.Lookup(View.DataController.KeyFieldNames, RecID, AFieldName);

2) View.DataController.DataModeController.GridMode = True时

Bkm := View.DataController.GetSelectedBookmark(ASelectedRecordIndex);

if ADataSet.BookmarkValid(TBookmark(Bkm)) then

begin

ADataSet.Bookmark := TBookmark(Bkm);

OutputVal := ADataSet.FieldByName(AFieldName).Value;

end;

View.BeginUpdate;

View.DataController.BeginLocate;

try

// make changes here…

finally

View.DataController.EndLocate;

View.EndUpdate;

end;

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

在GridMode禁用内置的右键Footer菜单

uses cxGridStdPopupMenu;

procedure cxGridPopupMenuOnPopup(...)

begin

if (ASenderMenu is TcxGridStdFooterMenu) and

<GridView>.DataController.DataModeController.GridMode then

AllowPopup := False;

end;

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

主从表任何时候只能展开一个组

procedure TForm1.ADetailDataControllerCollapsing(

ADataController: TcxCustomDataController; ARecordIndex: Integer;

var AAllow: Boolean);

var

I: Integer;

C: Integer;

begin

AAllow := False;

C := 0;

for I := 0 to ADataController.RecordCount - 1 do

begin

if ADataController.GetDetailExpanding(I) then

Inc(C);

if C > 1 then

AAllow := True;

end;

end;

procedure TForm1.ADetailDataControllerExpanding(

ADataController: TcxCustomDataController; ARecordIndex: Integer;

var AAllow: Boolean);

begin

ADataController.CollapseDetails;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

cxGrid1DBTableView1.DataController.OnDetailExpanding := ADetailDataControllerExpanding;

cxGrid1DBTableView1.DataController.OnDetailCollapsing := ADetailDataControllerCollapsing;

end;

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

动态创建层次(Level)和视图(View)

var

Grid: TcxGrid;

Level: TcxGridLevel;

View: TcxGridDBTableView;

begin

// Creates a Grid instance

Grid := TcxGrid.Create(SomeOwner);

Grid.Parent := SomeParent;

// Creates a Level

Level := Grid.Levels.Add;

Level.Name := 'SomeLevelName';

// Creates a View

View := Grid.CreateView(TcxGridDBTableView) as TcxGridDBTableView;

View.Name := 'SomeViewName';

// … and binds it to the Level

Level.GridView := View;

// Hooks up the View to the data

View.DataController.DataSource := SomeDataSource;

// … and creates all columns

View.DataController.CreateAllItems;

end;

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

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

获得Group Footer合计行对应的记录

procedure TForm1.cxGrid1DBTableView1CustomDrawFooterCell(

Sender: TcxGridTableView; ACanvas: TcxCanvas;

AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);

var

ALevel, ADataGroupIndex: Integer;

AGridRecord, AGroupRecord: TcxCustomGridRecord;

begin

if AViewInfo is TcxGridRowFooterCellViewInfo and // Row footer

(TcxGridDBColumn(AViewInfo.Column).DataBinding.FieldName = 'Area') then // Area column

begin

AGridRecord := TcxGridRowFooterCellViewInfo(AViewInfo).GridRecord;

ALevel := TcxGridRowFooterCellViewInfo(AViewInfo).Container.GroupLevel;

ADataGroupIndex := Sender.DataController.Groups.DataGroupIndexByRowIndex[AGridRecord.Index];

if ADataGroupIndex <> -1 then

begin

AGroupRecord := AGridRecord;

while AGroupRecord.Level <> ALevel do

AGroupRecord := AGroupRecord.ParentRecord;

AViewInfo.Text := AGroupRecord.DisplayTexts[0];

end;

end;

end;

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

访问过滤之后的记录

var

I: Integer;

begin

Memo1.Lines.Clear;

with cxGrid1DBTableView1.DataController do

for I := 0 to FilteredRecordCount - 1 do

Memo1.Lines.Add(DisplayTexts[FilteredRecordIndex[I], 0]);

end;

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

获得单元的Font

cxGrid1DBTableView1.ViewInfo.RecordsViewInfo.Items[1].GetCellViewInfoByItem(

cxGrid1DBTableView1Company).EditViewInfo.Font;

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

根据Level名称找到Level对象

function GetLevelByName(AGrid: TcxGrid; ALevelName: string): TcxGridLevel;

function LoopThroughLevels(ALevel: TcxGridLevel; ALevelName: string): TcxGridLevel;

var

I: Integer;

begin

Result := nil;

for I := 0 to ALevel.Count - 1 do

begin

if ALevel[I].Name = ALevelName then

begin

Result := ALevel[I];

Exit;

end;

if ALevel[I].Count > 0 then

begin

Result := LoopThroughLevels(ALevel[I], ALevelName);

if Result <> nil then

Exit;

end;

end;

end;

var

I: Integer;

begin

Result := nil;

for I := 0 to AGrid.Levels.Count - 1 do

begin

if AGrid.Levels[I].Name = ALevelName then

begin

Result := AGrid.Levels[I];

Exit;

end;

if AGrid.Levels[I].Count > 0 then

begin

Result := LoopThroughLevels(AGrid.Levels[I], ALevelName);

if Result <> nil then

Exit;

end;

end;

end;

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

指定Filter Builder打开/保存过滤文件的默认路径

uses

..., cxFilterControlDialog;

procedure TForm.GridView1FilterControlDialogShow(

Sender: TObject);

begin

TfmFilterControlDialog(Sender).OpenDialog.InitialDir := 'D:\'

end;

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

保存/恢复带汇总行的布局

<TableView>.StoreToIniFile('c:\Grid.ini', True, [gsoUseSummary]);

<GridView>.RestoreFromIniFile(<inifilename>,True,False {or True, optional},[gsoUseSummary]);

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

取消过滤时移到第一行

uses

cxCustomData;

procedure TYour_Form.AViewDataControllerFilterChanged(Sender: TObject);

var

Filter: TcxDataFilterCriteria;

begin

with Sender as TcxDataFilterCriteria do

if IsEmpty then

DataController.FocusedRowIndex := 0;

end;

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

排序后移到第一行

可以设置DataController.Options.FocusTopRowAfterSorting := True,也可以使用如下的代码:

uses

cxCustomData;

procedure TYour_Form.Your_ViewDataControllerSortingChanged(Sender: TObject);

begin

TcxCustomDataController(Sender).FocusedRowIndex := 0;

end;

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

判断当前行是否第一行或最后一行

可以使用DataController的IsBOF, IsEOF方法,或者:

<AView>.Controller.Controller.FocusedRow.IsFirst

<AView>.Controller.Controller.FocusedRow.IsLast

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

根据指定值查找记录

DataController提供了好几个方法来得到指定值对应的RecordIndex

对于Bound View可以使用FindRecordIndexByKeyValue方法

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

编辑和显示Blob字段

该字段的Properties设置为BlobEdit,并将BlobPaintStyle 属性设为 bpsText

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

得到可见行数

<View>.ViewInfo.VisibleRecordCount

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

保存后的行设置为当前行

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.

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

删除记录并获得焦点

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;

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zwzgood/archive/2009/07/07/4328525.aspx