您的位置:首页 > 其它

cxGrid使用汇总2

2013-04-04 10:07 417 查看
17. 怎样设计多表头的cxGrid?

解决:cxGrid可以解决如下的表头:

---------------------------------

| 说明1 | 说明2 |

---------------------------------

| 字段1 | 字段2 | 字段3 | 字段4 |

| 字段5 | 字段6 |

| 字段7 | 字段8 | 字段9 |

实现这个很简单,你可以直接在上面拖动字段名,拖动时会显示箭头的,放入你想显示的位置就OK了。或者在鼠标右击cxGrid1DBBandedTableView1菜单里的Edit Layout里也可以拖放。

但是cxGrid不能实现如下的多表头形式:

---------------------------------

| 说明1 | 说明2 |

---------------------------------

| 说明3 | 说明4 | 说明5 | 说明6 |

| 字段1 | 字段2 |

| 字段3 | 字段4 | 字段5 |

不知道有谁能实现这样的多表头?

****************************************************************************

18. 在主从表结构时,当点开“+”时怎样将焦点聚在相应主表的记录上?

解决:

var

HitTest: TcxCustomGridHitTest;

procedure TColumnsShareDemoMainForm.tvProjectsMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

// Note that the Sender parameter is a Site

HitTest := (Sender as TcxGridSite).GridView.ViewInfo.GetHitTest(X, Y);

// The point belongs to the [+]/[-] button area

if HitTest is TcxGridExpandButtonHitTest then

// Move focus to the record

TcxGridExpandButtonHitTest(HitTest).GridRecord.Focused := True;

end;

****************************************************************************

19 CXGrid4如何展开全部节点

解决:GridDBTableView1.DataController.Groups.FullExpand;

****************************************************************************

20. cxGrid如何动态创建Items的Editor的项?

解决:cxGrid的列有一个属性,它的编辑框可以指定combobox,spinedit等.在设计时,可以为

combobox的items添加项目.请问是否可以动态创建?(run-time时由程序加入)

var

A:TDataSource:

B:TcxlookupcomboboxProperties;

begin

A:=TDataSource.create(self);

B:=tcxlookupcomboboxproperties.create(self);

A.Dataset:=Dic_ry_xb;//此处指定数据源。

b.listdource:=a;//此处指明字段的listsource属性。

b.keyfieldnames:='a'; //此处指明字段的关键字段

b.listfieldnames:='b'; //此处指明字段的返回值。

b.listcolumns.items[0].caption:='x; //此处默认是会建立一个字段,但是显示的表头是name,所以此处让它显示为自己想要的中午显示。

cxGrid1DBTableView1c1_sex_code.Properties:=b; //此处指明是那个字段。

end; //这个是初始化的代码

****************************************************************************

21. 拷贝文件时有进度显示

解决:

procedure TForm1.mycopyfile(sourcef,targetf:string);

var

FromF, ToF: file;

NumRead, NumWritten: Integer;

Buf: array[1..2048] of Char;

n:integer;

begin

AssignFile(FromF, sourcef);

Reset(FromF, 1); { Record size = 1 }

AssignFile(ToF,targetf); { Open output file }

Rewrite(ToF, 1); { Record size = 1 }

n:=0;

repeat

BlockRead(FromF, Buf, SizeOf(Buf), NumRead);

form1.label1.caption:=IntToStr(sizeof(buf)*n*100 div FileSize(FromF))+'100%';

application.ProcessMessages;

//显示进度

BlockWrite(ToF, Buf, NumRead, NumWritten);

inc(n);

until (NumRead = 0) or (NumWritten <> NumRead);

form1.Label1.Caption:='100%';

CloseFile(FromF);

CloseFile(ToF);

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

mycopyfile('e:/components/tv2k-w2k.zip','c:/a.zip');

end;

****************************************************************************

22. cxGrid 设置斑马线

解决:

在TcxGridDBBandedTableView.Styles属性中有 ContentEven(奇数行风格) ContentOdd (偶数行风格) ,设定一下风格就好了。

****************************************************************************

23根据记录内容更改字体颜色

解决:

参考范例CustomDrawTableViewDemo,

主要在TcxGridDBBandedTableView.OnCustomDrawCell事件中实现。

如下代码:

if (Pos('-',AViewInfo.GridRecord.DisplayTexts[colOrderProductCount.Index]) > 0) then

begin //标识负数记录

//ACanvas.Canvas.Brush.Color:= clMoneyGreen;

ACanvas.Canvas.Font.Color:= clRed;//clActiveCaption

end;

其中colOrderProductCount是“产品订数”列。

还要有一步就是要刷新显示

TcxGridDBBandedTableView.LayoutChanged();

//tvCars.LayoutChanged(False);

TcxGridDBBandedTableView.Painter.Invalidate;

****************************************************************************

24用代码展开/收缩主从结构

解决:

Self.tvDepartment.ViewData.Expand(True);

Self.tvDepartment.ViewData.Collaspe(True);

注:tvDepartment为主表对应的TableView

****************************************************************************

25在内置右键菜单的后面增加菜单项

解决:

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

****************************************************************************

26根据某列的值设定其它列的可编辑性

解决:

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;

****************************************************************************

27保存/恢复Grid布局

解决:

网格左上角的自定义布局按钮:

TableView-OptionsCustiomizeColumnsQuickCustomization true;

//恢复布局

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); //保存为布局文件

实例:

IniFileName: string;

procedure TMainFM.FormCreate(Sender: TObject); //窗体创建时读取布局

var i: Integer;

begin

qyHed.Open;

IniFileName := ExtractFilePath(Application.ExeName) + '/Layout/' + cxGrd.Owner.ClassName + cxGrd.Name + '.ini';

if FileExists(IniFileName) then

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

else

begin

Self.cxTbv.BeginUpdate;

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

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

Self.cxTbv.EndUpdate;

end;

end;

procedure TMainFM.NSaveGrdClick(Sender: TObject); //保存布局文件

begin

try

IniFileName := ExtractFilePath(Application.ExeName) + '/Layout/' + cxGrd.Owner.ClassName + cxGrd.Name + '.ini';

if not DirectoryExists(ExtractFileDir(IniFileName)) then

CreateDir(ExtractFileDir(IniFileName));

Self.cxTbv.StoreToIniFile(IniFileName);

except

end;

end;

****************************************************************************

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

解决:

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

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

****************************************************************************

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

解决:

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

cxDBVerticalGrid1.ShowEdit;

****************************************************************************

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

解决:

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

来隐藏该文本。

uses cxClasses, cxGridStrs;

...

cxSetResourceString(@scxGridNoDataInfoText, '');

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

<View>.LayoutChanged;

****************************************************************************

31删除应用过滤后的行

解决:

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;

end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: