cxgriddiv 自动换行行

关于delphi中cxgrid插入任意行的方法
[问题点数:40分,结帖人wjx]
本版专家分:0
结帖率 83.33%
CSDN今日推荐
本版专家分:8947
2012年11月 Delphi大版内专家分月排行榜第二2012年10月 Delphi大版内专家分月排行榜第二2012年9月 Delphi大版内专家分月排行榜第二2012年8月 Delphi大版内专家分月排行榜第二
本版专家分:132263
2013年 荣获名人称号
2012年 总版技术专家分年内排行榜第一
2013年 总版技术专家分年内排行榜第七2011年 总版技术专家分年内排行榜第五2009年 总版技术专家分年内排行榜第九
2012年11月 总版技术专家分月排行榜第一
本版专家分:0
结帖率 83.33%
本版专家分:0
结帖率 83.33%
本版专家分:2080
本版专家分:0
结帖率 83.33%
本版专家分:8947
2012年11月 Delphi大版内专家分月排行榜第二2012年10月 Delphi大版内专家分月排行榜第二2012年9月 Delphi大版内专家分月排行榜第二2012年8月 Delphi大版内专家分月排行榜第二
匿名用户不能发表回复!|
CSDN今日推荐cxGrid列中画checkbox
cxGrid列种有一种是CheckBox属性列,用于显示布尔类型数据,可以进行选择。如果改变了该列单元的高和宽之后,默认的checkbox高和宽是不随着改变的,也就导致看起来显得太小,影响美观。有种像人一样,眼睛很大,眼珠子却长得小了。-_-。如图1:
如何能够改变checkbox的大小,让界面看起来更协调美观呢?可以通过该列的CustomDrawCell事件中实现,代码如下:
procedure TFSetItemInf.cxGridDBColumn17CustomDrawCell(
& Sender: TcxCustomGridTableV ACanvas:
& AViewInfo: TcxGridTableDataCellViewI var
ADone: Boolean);
& AEditValue: V
& FBounds:TR
& AEditValue :=
AViewInfo.GridRecord.Values[cxGridDBColumn17.Index];&
//当前单元值
& FBounds := AViewInfo.B
& if (AViewInfo.GridRecord.RecordIndex mod 2) = 0
then& //保持和原有每行样式一致
ACanvas.FillRect(FBounds, $00F9F4F9)
ACanvas.FillRect(FBounds, $00E6F4F1);&
GetSystemMetrics(SM_CXMENUCHECK);&
//获得系统checkbox高
GetSystemMetrics(SM_CYMENUCHECK);&
//获得系统checkbox宽
& Dx := (AViewInfo.Width -
GetSystemMetrics(SM_CXMENUCHECK)) div 2;
& //获得要画checkbox框的位置参数
& r.Top := FBounds.Top + (FBounds.Bottom -
FBounds.Top - s.cy) div 2;
& r.Bottom := r.Top + s.cy + 1;
& r.Left := FBounds.Left + Dx;
& r.Right := r.Left + s.cx + 1;
& //画出checkbox,并且根据当前值确定是否为选择状态
& DrawFrameControl(ACanvas.Handle, r, DFC_BUTTON,
CompareText(AEditValue,'True')=0, DFCS_CHECKED,
DFCS_BUTTONCHECK));
& ADone := T
运行后的效果:
这样效果较之前要好得多了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。1. 去掉cxGrid中台头的Box
解决:在tableview1的optionsview的groupbybox=
*****************************************************************************
2.统计功能
解决:(1) tableview
tableview1的optionsviewfooter=ture
然后在cxGRid1的customize..中的summary 的footer.add需要合计的列kind= skSum
在Footer的第一列显示[合计:]&&
加一个Summary项,Column设为Grid的第一列,Kind设为skNone&&
在该Summary项的OnGetText事件中,输入:&&
procedure&&
TFormExpense.tvExpenseTcxGridDBDataControllerTcxDataSummaryFooterSummaryItems2GetText(&
&&&&& Sender:&&
TcxDataSummaryI&& const&& AValue:&&
V&& AIsFooter:&& B&&
&&&&& var&& AText:&&
String);&&
&&&&& AText&& :=&& '合计:';&&
&&&&& (2) 按条件汇总:&&
在TableView的DataController-&Summary-&FooterSummary-&OnSummary事件中,输入:&&
procedure&& TFormExpense.tvExpenseDataControllerSummaryFooterSummaryItemsSummary(&&
&&&&& ASender:&&
TcxDataSummaryI&& Arguments:&&
TcxSummaryEventA&&
&&&&& var&& OutArguments:&&
TcxSummaryEventOutArguments);&&
&&&&& //得到字段名&&
TcxDBDataSummaryItem(Arguments.SummaryItem).FieldN&&
(ASender.DataController.Values[Arguments.RecordIndex,&&
tvExpenseLevel.Index]&& &&&
1)&&&&&& //只统计Level列=1的值&&
&&&&&&&&& and
(TcxDBDataSummaryItem(Arguments.SummaryItem).Kind&& =&&
skSum)&& then&&
OutArguments.Value&& :=&& 0; //Level&&
&&& 1的统计值设为0&&
OptionView中属性GroupFooters设为gfAlwaysVisible并设置需要求和的列,在summary.default
for Groups 下add加入需要合计的字段,column下显示fieldname 为统计字段,format为格式,kind为统计方法,position 为位子 spfooter 在分组的下面,spgroup 在分组的上面
或用cxGridPopupMenu1,在运行時可对任意数字类型列求和,方法是只需设置cxGridPopupMenu1的属性Grid为cxGrid1DBTableView1的cxGrid,
*****************************************************************************
3.去掉cxgrid 中的过滤下拉箭头
解决: 选择tableview1.optionscustomize.columnfiltering=
****************************************************************************
4.让“Drag a column here
to group by that column”不显示
&& 解决:在cxGrid1DBTableView1-&optionsview-&groupbybox:=false即可
****************************************************************************
5.GroupPanel上面的英文[Drag a
column header to group by that column]怎么可以改成中文
解决:最简单的方法是 TcxGridTableView.OnCustomDrawPartBackground,
也可用 OnCustomDrawGroupCell:
TForm1.cxGrid1DBTableView1CustomDrawPartBackground(
Sender: TcxGridTableV ACanvas: TcxC
AViewInfo: TcxCustomGridCellViewI var ADone: Boolean);
AViewInfo.Text:='动态设置 GroupBox 的显示内容';
ACanvas.FillRect(AViewInfo.Bounds);
注:改成中文后将字段拖上去中文还是会显示,最好是设置空值
****************************************************************************
6.如何实现如下功能:
+原材料仓库
+软件开发部
这个是部门的名称,点击加号就可以将本部门的人员情况显示出来。
解决:其实这是一个主从表关系,1:填好主表的keyfieldnames
2:填好从表的keyfieldnames
3:填好从表的 detaikeyfieldNames与masterkeyfieldnames
4: 从表的数据源一定要按与主表关联的字段排序
注:其它地方设置了主从表结构那样就显示不出来,比如设置了从表的Table或者Query的mastersource和
masterfield就会不能显示数据!如果是两个cxGrid的主从关系,这样设置就很OK了。
****************************************************************************
7.类似PageControl显示
解决:增加一个Level,将cxGrid1-&RootLevelOptions-&DetailTabsPosition设为dtpTop,然后相应的设置cxGrid1Level1,和cxGrid1Level2的Caption值。
****************************************************************************
8.如何设定左边几列,不能滚动
解决:使用DB Banded Table才可以实现,
在cxGrid1DBBandedTableView里建立Band0,Band1
Band0的Fixed=tfLeft
Band1的Fixed=tfnone
设置要锁定的字段的BandIndex=0,其它为1,就OK了。
*******************************************************************************
9. 怎样实现如EXCEL一样的,当前格=G14+G15+G16
这样的功能
解决: 举一个简单的例子:label1.Caption
:= cxGrid1DBTableView1.DataController.Values[2,
3]+cxGrid1DBTableView2.DataController.Values[1, 1]+cxGrid1DBTableView3.DataController.Values[1,
所以不同cxGrid1DBTableView中的数据都可以给当前格,这样就做到了EXCEL中的当前格=G14+G15+G16 类似的功能。
****************************************************************************
10. 鼠标右击cxGrid1DBBandedTableView1菜单里的Edit
Layout什么用,怎么使用?
解决:可以拖动字段,并列的可以拖成有层次感(一层层),
拖动时会显示箭头的,就是说可以拖一个字段放
****************************************************************************
11.怎样将cxGrid里的数据导入到EXCEL,HTML,XML和TEXT
解决:uses
cxExportGrid4L ( cxExportGrid6Link)
procedure TForm1.Button1Click(Sender:
ExportGrid4ToEXCEL('d:/wang.xsl',cxGrid1,True,True);
ExportGrid4ToTEXT('d:/wang.txt',cxGrid1,True,True);
ExportGrid4ToXML('d:/wang.xml',cxGrid1,True,True);
ExportGrid4ToHTML('d:/wang.html',cxGrid1,True,True);
****************************************************************************
12. 如何使满足条件的数据显示不同的颜色?
AYellowStyle: TcxS
procedure TForm1.FormCreate(Sender:
AYellowStyle := TcxStyle.Create(Self);
AYellowStyle.Color := $0080FFFF;
AYellowStyle.TextColor := clM
TForm1.cxGrid1DBBandedTableView1StylesGetContentStyle(
Sender: TcxCustomGridTableV ARecord: TcxCustomGridR
AItem: TcxCustomGridTableI out AStyle: TcxStyle);
if ARecord.Values[cxGrid1DBBandedTableView1Lengthcm.Index] & 81 then
AStyle := AYellowS
这里cxGrid1DBBandedTableView1Lengthcm.Index小于81时就显示黄色
****************************************************************************
13. 如何从外边的TXT文件导入到cxGrid?
procedure CustomizeC
procedure LoadD
procedure TForm1.CustomizeC
cDistance = 1;
cRadius = 5;
cPeriod = 4;
cPstring = 0;
DecimalSeparator := '.';
with cxGrid1TableView2 do
for I := 0 to ColumnCount - 1 do
if I in [cDistance, cRadius] then
Columns[I].DataBinding.ValueTypeClass := TcxIntegerValueType//1,5列为Integer
if I in [cPstring,cPeriod] then
Columns[I].DataBinding.ValueTypeClass := TcxStringValueType//0,4列为String
Columns[I].DataBinding.ValueTypeClass := TcxFloatValueT//其他为Float
procedure TForm1.LoadD
AFileName = '资产负债表.txt';
AHeaderLineCount = 2;
ARecords, AValues: TStringL
procedure InitRecord(const Str: string);
AValues.CommaText := S
for J := 0 to AValues.Count - 1 do
if AValues.Strings[J] && '-' then
V := AValues.Strings[J];
if not VarIsNull(V) then
cxGrid1TableView2.DataController.Values[I, J] := V;
if not FileExists(AFileName) then
raise Exception.Create('Data file not found');
ARecords := TStringList.C
AValues := TStringList.C
with ARecords do
LoadFromFile(AFileName);
cxGrid1TableView2.BeginU
cxGrid1TableView2.DataController.RecordCount := Count - AHeaderLineC
for I := 0 to Count - (AHeaderLineCount + 1) do
InitRecord(Strings[I + AHeaderLineCount]);
cxGrid1TableView2.EndU
ARecords.F
procedure TForm1.FormCreate(Sender:
CustomizeC
LoadData_Z
****************************************************************************
14 如何改变列的颜色?
AFirstColumnStyle: TcxS
procedure TForm1.FormCreate(Sender:
AFirstColumnStyle := TcxStyle.Create(Self);
AFirstColumnStyle.Color := clA
AFirstColumnStyle.TextColor := clB
cxGrid1TableView1.Columns[1].Styles.Content := AFirstColumnS
****************************************************************************
15 Set as default的用法?
解决:Set as default的用法是为了解决设置参数的方便而做的,比如:
连好数据库以后,更改cxGrid1DBBandedTableView1-&OptionsCustomize-& ColumnFiltering 设为False。(这个设置可以将字段名的下拉单给去掉)更改cxGrid1DBBandedTableView1-&OptionsView- &Navigator 设置为True。然后右击cxGrid1DBBandedTableView1,在弹出的菜单栏里面点击Set
as default。
OK,下次你再产生一个新的cxGrid1DBBandedTableView1时这些设置和刚才的一样了。如果需要设置的参数很多的时候,这个Set as default很有用!
****************************************************************************
16. 怎样使鼠标移动时,相应的单元里的文字变色?
FTrackItem: TcxCustomGridTableI
FTrackRec: TcxCustomGridR
procedure TForm1.cxGrid1DBTableView1CustomDrawCell(
Sender: TcxCustomGridTableV ACanvas: TcxC
AViewInfo: TcxGridTableDataCellViewI var ADone: Boolean);
if (AViewInfo.GridRecord = FTrackRec) and (AViewInfo.Item = FTrackItem) then
ACanvas.Font.Color := //红色字体
ACanvas.Font.Style := [fsUnderline];//带下划线
TForm1.cxGrid1DBTableView1MouseMove(Sender: TO
Shift: TShiftS X, Y: Integer);
AHitTest: TcxCustomGridHitT
ATrackItem: TcxCustomGridTableI
ATrackRec: TcxCustomGridR
ATrackItem := FTrackI
ATrackRec := FTrackR
AHitTest := (Sender as
TcxGridSite).GridView.ViewInfo.GetHitTest(X, Y);
if AHitTest is TcxGridRecordCellHitTest then
FTrackItem := TcxGridRecordCellHitTest(AHitTest).I
FTrackRec := TcxGridRecordCellHitTest(AHitTest).GridR
FTrackItem :=
FTrackRec :=
if (ATrackItem && FTrackItem) or
(ATrackRec && FTrackRec) then
// Invalidate old cell
if ATrackRec && nil then
ATrackRec.Invalidate(ATrackItem);
// Invalidate new cell
if FTrackRec && nil then
FTrackRec.Invalidate(FTrackItem);
****************************************************************************
zj注:17-27转载自
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. 在主从表结构时,当点开“+”时怎样将焦点聚在相应主表的记录上?
HitTest: TcxCustomGridHitT
TColumnsShareDemoMainForm.tvProjectsMouseDown(Sender: TO
Button: TMouseB Shift: TShiftS X, Y: Integer);
// 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 := T
****************************************************************************
19 CXGrid4如何展开全部节点
解决:GridDBTableView1.DataController.Groups.FullE
****************************************************************************
20. cxGrid如何动态创建Items的Editor的项?
解决:cxGrid的列有一个属性,它的编辑框可以指定combobox,spinedit等.在设计时,可以为
combobox的items添加项目.请问是否可以动态创建?(run-time时由程序加入)
A:TDataSource:
B:TcxlookupcomboboxP
A:=TDataSource.create(self);
B:=tcxlookupcomboboxproperties.create(self);
A.Dataset:=Dic_ry_//此处指定数据源。
b.listdource:=a;//此处指明字段的listsource属性。
b.keyfieldnames:='a'; //此处指明字段的关键字段
b.listfieldnames:='b'; //此处指明字段的返回值。
b.listcolumns.items[0].caption:='x; //此处默认是会建立一个字段,但是显示的表头是name,所以此处让它显示为自己想要的中午显示。
cxGrid1DBTableView1c1_sex_code.Properties:=b; //此处指明是那个字段。
//这个是初始化的代码
****************************************************************************
21. 拷贝文件时有进度显示
procedure TForm1.mycopyfile(sourcef,targetf:string);
FromF, ToF:
NumRead, NumWritten: I
Buf: array[1..2048] of C
&& AssignFile(FromF, sourcef);
&& Reset(FromF, 1); { Record size = 1 }
&& AssignFile(ToF,targetf); { Open output file }
&& Rewrite(ToF, 1); { Record size = 1 }
&&&&&&& BlockRead(FromF, Buf, SizeOf(Buf),
form1.label1.caption:=IntToStr(sizeof(buf)*n*100 div FileSize(FromF))+'100%';
&&&&&&& application.ProcessM
&&&&&&& //显示进度
&&&&&&& BlockWrite(ToF, Buf, NumRead,
NumWritten);
&&&&&&& inc(n);
&&& until (NumRead = 0) or (NumWritten && NumRead);
&&& form1.Label1.Caption:='100%';
&&& CloseFile(FromF);
&&& CloseFile(ToF);
procedure TForm1.Button1Click(Sender: TObject);
mycopyfile('e:/components/tv2k-w2k.zip','c:/a.zip');
****************************************************************************
22. cxGrid 设置斑马线
在TcxGridDBBandedTableView.Styles属性中有 ContentEven(奇数行风格)
ContentOdd (偶数行风格) ,设定一下风格就好了。
****************************************************************************
23 根据记录内容更改字体颜色
参考范例CustomDrawTableViewDemo,
主要在TcxGridDBBandedTableView.OnCustomDrawCell事件中实现。
如下代码:
(Pos('-',AViewInfo.GridRecord.DisplayTexts[colOrderProductCount.Index]) & 0)
begin //标识负数记录
&&& //ACanvas.Canvas.Brush.Color:= clMoneyG
&&& ACanvas.Canvas.Font.Color:= clR//clActiveCaption
其中colOrderProductCount是“产品订数”列。
还要有一步就是要刷新显示
TcxGridDBBandedTableView.LayoutChanged();
//tvCars.LayoutChanged(False);
TcxGridDBBandedTableView.Painter.I
****************************************************************************
24 用代码展开/收缩主从结构
&&&&& Self.tvDepartment.ViewData.Expand(True);&&
&&&&& Self.tvDepartment.ViewData.Collaspe(True);&&
注:tvDepartment为主表对应的TableView
****************************************************************************
25 在内置右键菜单的后面增加菜单项
首先应在Form上加一个cxGridPopupMenu控件&& 以启用右键菜单&&
UseBuildInPopupMenus设为True&&
procedure&& TFormItemList.FormCreate(Sender:&&
TObject);&&
&&&&& AMenu:&& TC&&
&&&&& FMenuItem,&& FSubMenuItem:&&
&&&&& AMenu&& :=&&&&
&&&&& if&&
cxGridPopupMenu.BuiltInPopupMenus.Count&& =&& 0&&
&&&&&&&&& E&&
&&&&& AMenu&& :=&&
cxGridPopupMenu.BuiltInPopupMenus[0].PopupM //第一个内置右键菜单(表头菜单)&&
&&&&& if&& Assigned(AMenu)&& and&&
AMenu.InheritsFrom(TPopupMenu)&& then&&
&&&&& begin&&
TPopupMenu(AMenu).AutoHotkeys&& :=&&
maM&&&&&&&& //手动热键&&
//-------------------------&&
&&&&&&&&& 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&& :=&& miExpandAllGroupC&&
TPopupMenu(AMenu).Items.Add(FMenuItem);&&
&&&&&&&&& //收缩所有组&&
&&&&&&&&& FMenuItem&&
:=&& TMenuItem.Create(Self);&&
&&&&&&&&& FMenuItem.Name&&
:=&& 'miCollapseAllGroup';&&
FMenuItem.Caption&& :=&& '收缩所有组(&O)';&&
FMenuItem.OnClick&& :=&& miCollapseAllGroupC&&
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&&
FSubMenuItem.GroupIndex&& :=&& 5; //指定同一组&&
FSubMenuItem.Checked&& :=&& T&&
FSubMenuItem.OnClick&& :=&& miFilterPanelC&&
FMenuItem.Add(FSubMenuItem); //加入二级子菜单&&
&&&&&&&&& //总是显示&&
&&&&&&&&& FSubMenuItem&&
:=&& TMenuItem.Create(Self);&&
FSubMenuItem.Name&& :=&& 'miFilterPanelAlways';&&
FSubMenuItem.Caption&& :=&& '总是显示(&W)';&&
FSubMenuItem.RadioItem&& :=&& T&&
FSubMenuItem.GroupIndex&& :=&& 5;&&
FSubMenuItem.OnClick&& :=&& miFilterPanelC&&
FMenuItem.Add(FSubMenuItem);&&
&&&&&&&&& //从不显示&&
&&&&&&&&& FSubMenuItem&&
:=&& TMenuItem.Create(Self);&&
FSubMenuItem.Name&& :=&& 'miFilterPanelNerver';&&
&&&&&&&&& FSubMenuItem.Caption&&
:=&& '从不显示(&N)';&&
FSubMenuItem.RadioItem&& :=&& T&&
FSubMenuItem.GroupIndex&& :=&& 5;&&
FSubMenuItem.OnClick&& :=&& miFilterPanelC&&
FMenuItem.Add(FSubMenuItem);&&
&&&&&&&&& TPopupMenu(AMenu).Items.Add(FMenuItem);&&
&&&&&&&&& //自定义过滤&&
&&&&&&&&& FMenuItem&&
:=&& TMenuItem.Create(Self);&&
FMenuItem.Name&& :=&& 'miCustomFilter';&&
FMenuItem.Caption&& :=&& '自定义过滤(&M)';&&
FMenuItem.OnClick&& :=&& miCustomFilterC&&
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.miFilterBuilderC&&
&&&&&&&&& 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,&&
FMenuItem.ImageIndex&& :=&&
TPopupMenu(AMenu).Images.Count&& -&& 1;&&
&&&&&&&&& FMenuItem.Caption&&
:=&& '导出(&E)';&&
FMenuItem.OnClick&& :=&& Self.miExportC&&
TPopupMenu(AMenu).Items.Add(FMenuItem);&&
&&&&&&&&& //打印&&
&&&&&&&&& FMenuItem&&
:=&& TMenuItem.Create(Self);&&
FMenuItem.Name&& :=&& 'miPrint';&&
FMenuItem.Caption&& :=&& '打印(&P)';&&
TPopupMenu(AMenu).Images.AddImage(FormMain.ImageListExtend,&&
FMenuItem.ImageIndex&& :=&&
TPopupMenu(AMenu).Images.Count&& -&& 1;&&
FMenuItem.OnClick&& :=&& Self.miPrintC&&
TPopupMenu(AMenu).Items.Add(FMenuItem);&&
procedure&& TFormItemList.miExportClick(Sender:&&
TObject);&&
&&&&& FileName,&& FileExt,&&
msg:&& S&&
&&&&& if&& Self.aqyQuery.IsEmpty&&
&&&&& begin&&
&&&&&&&&& msg&&
:=&& '没有导出数据...';&&
Application.MessageBox(PChar(msg),&& PChar(Application.Title),&&
&&&&&&&&&&&&&
MB_OK&& or&& MB_IconWarning);&&
&&&&&&&&& E&&
&&&&& Self.SaveDialogExport.Filter&&
:=&& 'Excel文件&& (*.xls)|*.xls|XML文件&&
(*.xml)|*.xml'&&
&&&&&&&&& +&& '|文本文件&&
(*.txt)|*.txt|网页文件&& (*.html)|*.html';&&
&&&&& Self.SaveDialogExport.Title&&
:=&& '导出为';&&
&&&&& if&& not&&
Self.SaveDialogExport.Execute&& then&&
&&&&&&&&& E&&
&&&&& FileName&& :=&& Self.SaveDialogExport.FileN&&
&&&&& 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);&&
&&&&&&&&& E&&
&&&&& msg&& :=&& '导出完成...';&&
&&&&& Application.MessageBox(PChar(msg),&&
PChar(Application.Title),&&
&&&&&&&&& MB_OK&&
or&& MB_IconInformation);&&
procedure&& TFormItemList.miPrintClick(Sender:&&
TObject);&&
&&&&& //打印&&
Self.dxComponentPrinter.Preview(True,&& Self.dxComponentPrinterLink1);&&
procedure&&
TFormItemList.cxGridPopupMenuPopup(ASenderMenu:&& TC&&
&&&&& AHitTest:&&
TcxCustomGridHitT&& X,&& Y:&&
I&& var&& AllowPopup:&& Boolean);&&
&&&&& 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&&
&&&&&&&&&&&
TMenuItem(Self.FindComponent('miExpandAllGroup')).Visible&&
&&&&&&&&&&&
TMenuItem(Self.FindComponent('miCollapseAllGroup')).Visible&&
&&&&&&&&& end&&
&&&&&&&&& else&&
&&&&&&&&& begin&&
&&&&&&&&&&&
TMenuItem(Self.FindComponent('miLineForGroup')).Visible&&
&&&&&&&&&&&
TMenuItem(Self.FindComponent('miExpandAllGroup')).Visible&&
&&&&&&&&&&&
TMenuItem(Self.FindComponent('miCollapseAllGroup')).Visible&&
&&&&&&&&&&&
procedure&& TFormItemList.miFilterBuilderClick(Sender:&&
TObject);&&
&&&&& //过滤管理器&&
&&&&& //弹出Filter&& Builder&& Dialog对话框&&
&&&&& tvResult.Filtering.RunCustomizeD&&
procedure&& TFormItemList.miCustomFilterClick(Sender:&&
TObject);&&
&&&&& AHitTest:&&
TcxCustomGridHitT&&
&&&&& //自定义过滤&&
&&&&& //弹出Custom&& Filter&& Dialog对话框&&
&&&&& AHitTest&& :=&&
cxGridPopupMenu.HitT&&
&&&&& if&&
GetHitTypeByHitCode(AHitTest.HitTestCode)&& =&&
gvhtColumnHeader&& then //获得右击的列&&
tvResult.Filtering.RunCustomizeDialog(TcxGridColumnHeaderHitTest(AHitTest).Column);&&
procedure&& TFormItemList.miFilterPanelClick(Sender:&& TObject);&&
&&&&& mi:&& TMenuI&&
&&&&& //隐藏/显示过滤面板&&
&&&&& mi&& :=&&
TMenuItem(Sender);&&
&&&&& mi.Checked&& :=&&
&&&&& if&& mi.Name&& =&&
'miFilterPanelAlways'&& then&&
tvResult.Filtering.Visible&& :=&& fvAlways&&
&&&&& else&& if&&
mi.Name&& =&& 'miFilterPanelNerver'&& then&&
tvResult.Filtering.Visible&& :=&& fvNever&&
&&&&& else&&
tvResult.Filtering.Visible&& :=&& fvNonE&&
procedure&& TFormItemList.miExpandAllGroupClick(Sender:&&
TObject);&&
&&&&& //展开所有组&&
&&&&& tvResult.DataController.Groups.FullE&&
procedure&& TFormItemList.miCollapseAllGroupClick(Sender:&&
TObject);&&
&&&&& //收缩所有组&&
tvResult.DataController.Groups.FullC&&
****************************************************************************
26 根据某列的值设定其它列的可编辑性
procedure&& TFormUser.tvUserEditing(Sender:&&
TcxCustomGridTableV&&
&&&&& AItem:&&
TcxCustomGridTableI&& var&& AAllow:&&
Boolean);&&
&&&&& //如果第三列值为True,则第4列不能修改&&
&&&&& if&&
(tvUser.Controller.FocusedRecord.Values[2]&& =&&
True)&& and&& (AItem.Index&& =&&
4)&& then&&
&&&&&&&&& AAllow&&
:=&& False&&
&&&&& else&&
&&&&&&&&& AAllow&&
****************************************************************************
27 保存/恢复Grid布局
网格左上角的自定义布局按钮:
TableView-?OptionsCustiomize?ColumnsQuickC
//恢复布局&&
IniFileName&& :=&&
ExtractFilePath(Application.ExeName)&& +&&
'Layout/'&& +&& Self.Name&& +&&
if&& FileExists(IniFileName)&& then&&
&&&&& Self.tvResult.RestoreFromIniFile(IniFileName) //从布局文件中恢复&&
&&&&& Self.tvResult.BeginU&&
&&&&& for&& i&& :=&&
0&& to&& Self.tvResult.ItemCount&& -&&
Self.tvResult.Items[i].ApplyBestF //调整为最佳宽度&&
&&&&& Self.tvResult.EndU&&
//保存布局&&
IniFileName&& :=&&
ExtractFilePath(Application.ExeName)&& +&&
'Layout/'&& +&& Self.Name&& +&&
if&& not&&
DirectoryExists(ExtractFileDir(IniFileName))&& then&&
&&&&& CreateDir(ExtractFileDir(IniFileName));&&
Self.tvResult.StoreToIniFile(IniFileName); //保存为布局文件
IniFileName:
procedure TMainFM.FormCreate(Sender:
TObject);&&&& //窗体创建时读取布局
&& qyHed.O
&& IniFileName := ExtractFilePath(Application.ExeName) + '/Layout/' +
cxGrd.Owner.ClassName + cxGrd.Name + '.ini';
&& if FileExists(IniFileName) then
&&&&& Self.cxTbv.RestoreFromIniFile(IniFileName) //从布局文件中恢复
&&&&& Self.cxTbv.BeginU
&&&&& for i := 0 to Self.cxTbv.ItemCount - 1 do
Self.cxTbv.Items[i].ApplyBestF //调整为最佳宽度
&&&&& Self.cxTbv.EndU
procedure TMainFM.NSaveGrdClick(Sender:
TObject);&&&&& //保存布局文件
&&&&& IniFileName :=
ExtractFilePath(Application.ExeName) + '/Layout/' + cxGrd.Owner.ClassName +
cxGrd.Name + '.ini';
&&&&& if not
DirectoryExists(ExtractFileDir(IniFileName)) then
CreateDir(ExtractFileDir(IniFileName));
&&&&& Self.cxTbv.StoreToIniFile(IniFileName);
****************************************************************************
28保存/恢复带汇总行的布局解决:
&TableView&.StoreToIniFile('c:/Grid.ini',&& True,&&
[gsoUseSummary]);&&&&
&GridView&.RestoreFromIniFile(&inifilename&,True,False{or
True,optional},[gsoUseSummary]);
&zj:本条与50条重复
****************************************************************************
(以下原博主转载自)
****************************************************************************
28 在主从TableView中根据主TableView得到对应的从TableView
&&&&& ADetailDC:&&
TcxGridDataC&&
&&&&& AView:&& TcxCustomGridTableV&&
&&&&& with&&
cxGrid1DBTableView1.DataController&& do&&
&&&&&&&&& ADetailDC&&
TcxGridDataController(GetDetailDataController(FocusedRecordIndex,&&
&&&&& AView&& :=&&
ADetailDC.GridV&&
==============================================================================
29 定位在第一行并显示内置编辑器
cxDBVerticalGrid1.FocusedRow :=
cxDBVerticalGrid1.Rows[0];
cxDBVerticalGrid1.ShowE
==============================================================================
30 隐藏 "&No data
to display&" 字符串
该文本存储在scxGridNoDataInfoText资源字符串,可以将该资源字符串的内容设为空
来隐藏该文本。
uses cxClasses, cxGridS
cxSetResourceString(@scxGridNoDataInfoText, '');
//如果"&No data
to display&" 字符串已经显示,需要调用:
&View&.LayoutC
============================================================
31 删除应用过滤后的行
with &GridView& do
for I := 0 to ViewData.RecordCount - 1 do
ViewData.Records[0].Focused := T
DataController.DataSet.D
=============================================================&
32 根据单元的值设置样式&&
procedure&& &aForm&.&aColumn&StylesGetContentStyle(&&
&&&&& Sender:&&
TcxCustomGridTableV&& ARecord:&&
TcxCustomGridR&&
&&&&& AItem:&&
TcxCustomGridTableI&& out&& AStyle:&&
TcxStyle);&&
&&&&& if&&
ARecord.Values[AItem.Index]&& =&& aSomeValue&&
&&&&&&&&& AStyle&&
:=&& &aSomeStyle&;&&
procedure&& &aForm&.&aView&StylesGetContentStyle(&&
&&&&& Sender:&&
TcxCustomGridTableV&& ARecord:&&
TcxCustomGridR&&
&&&&& AItem:&&
TcxCustomGridTableI&& out&& AStyle:&&
TcxStyle);&&
&&&&& AColumn:&& TcxCustomGridTableI&&
&&&&& AColumn&& :=&&
(Sender&& as&&
TcxGridDBTableView).GetColumnByFieldName('Email');&&
&&&&& if&&
VarToStr(ARecord.Values[AColumn.Index])&& =&&
''&& then&&
&&&&&&&&& AStyle&&
:=&& cxStyleNullE&&
======================================================================
TcxCustomGridTableView.FindItemByName,&&
TcxGridDBTableView.GetColumnByFieldName&& or&&
TcxGridDBDataController.GetItemByFieldName&&
&&&&& with&&
cxGrid1DBBandedTableView1.DataController&& do&&
&&&&&&&&& AValue&&
:=&& Values[FocusedRecordIndex,&&
GetItemByFieldName('SomeFieldName').Index];&&
****************************************************************************
33 动态生成BandedView
&&&&& AView:&& TcxCustomGridV&&
&&&&& AView&& :=&&
&cxGrid&.CreateView(TcxGridDBBandedTableView);&&
TcxGridDBBandedTableView(AView).DataController.DataSource&&
:=&& &DataSource&;&&
&&&&& TcxGridDBBandedTableView(AView).Bands.A&&
&&&&& with&&
TcxGridDBBandedTableView(AView).Bands.Add&& do&&
&&&&& begin&&
&&&&&&&&& Visible&&
&&&&&&&&& FixedKind&&
:=&& fkL&&
TcxGridDBBandedTableView(AView).DataController.CreateAllI&&
&&&&& &cxGridLevel&.GridView&&
****************************************************************************
34 当底层数据集为空时显示一条空记录
procedure&& &Form&.&cxGrid&Enter(Sender:&&
TObject);&&
&&&&& View:&& TcxGridDBTableV&&
&&&&& View&& :=&&
TcxGridDBTableView((Sender&& as&&
TcxGrid).FocusedView);&&
&&&&& if&& View.DataController.DataSet.IsEmpty&&
&&&&& begin&&
View.DataController.DataSet.A&&
View.Controller.EditingController.ShowE&&
****************************************************************************
35 在当前View插入记录&&
使用FocusedView属性得到当前焦点View,用View.DataController得到对应的Data&& Controller,&&
之后使用Data&& Controller的方法来操作数据:&&
-&& Append&&
-&& Insert&&
-&& Post&&
-&& Cancel&&
-&& DeleteFocused&&
-&& DeleteSelection&&
&&&&& ARecIndex:&& I&&
&&&&& View.DataController.A&&
&&&&& ARecIndex&& :=&&
View.DataController.FocusedRecordI&&
View.DataController.Values[ARecIndex,&& SomeItemIndex]&&
:=&& SomeV&&
&&&&& View.DataController.P&&
另外一种方法是使用View.DataController.DataSource.DataSet得到底层数据集后,再用数据集的方法来操作数据。
****************************************************************************
36 激活内置编辑控件
&aView&.Controller.EditingController.ShowEdit(&aColumn&);&&
&&& 2)&& &aView&.Controller.EditingController.StartEditShowingTimer(&aColumn&);&&
&aView&.Controller.EditingItem&& :=&&
&aColumn&;&&
&&& 4)&& &aColumn&.Editing&&
****************************************************************************
37 隐藏内置编辑控件
&aView&.Controller.EditingController.HideEdit(True);
****************************************************************************
38 移除一个分组列&&
&&&&& &aColumn&.GroupIndex&&
:=&& -1;&&
&&&&& &aColumn&.Visible&&
****************************************************************************
39 保存修改到数据库
procedure&& &aForm&.FormClose(Sender:&&
TO&& var&& Action:&& TCloseAction);&&
if&& (&aGrid&.FocusedView && nil)
and&& (&aGrid&.FocusedView.DataController.EditState &&
[]) then&&
&aGrid&.FocusedView.DataController.P&&
****************************************************************************
40 设置内置右键菜单
内置右键菜单包括二个菜单:cxGridStdHeaderMenu,&& TcxGridStdFooterMenu&&
uses&& cxGridStdPopupM&&
procedure&& TForm1.cxGridPopupMenu1Popup(ASenderMenu:&&
&&&&& AHitTest:&&
TcxCustomGridHitT&& X,&& Y:&&
I&& var&& AllowPopup:&& Boolean);&&
&&&&& if&& ASenderMenu&&
is&& TcxGridStdHeaderMenu&& then&&
TcxGridStdHeaderMenu(ASenderMenu).OnPopup&& :=&&
StdHeaderMenuP&&
procedure&& TForm1.StdHeaderMenuPopup(Sender:&&
TObject);&&
&&&&& I:&& I&&
&&&&& with&&
TcxGridStdHeaderMenu(Sender).Items&& do&&
&&&&&&&&& for&&
I&& :=&& 0&& to&& Count&&
-&& 1&& do&&
&&&&&&&&&&&&&
if&& Items[I].Caption&& =&& 'Group&&
By&& Box'&& then&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&
Items[I].Enabled&& :=&& F&&
&&&&&&&&&&&&&&&&&
System.B&&
&&&&&&&&&&&&&
****************************************************************************
41 得到选中记录的值
1)&& View.DataController.DataModeController.GridMode&&
=&& False时&&
&&&&& RecIdx&& :=&&
View.Controller.SelectedRecords[i].RecordI&&
&&&&& ColIdx&& :=&&
View.DataController.GetItemByFieldName(AFieldName).I&&
&&&&& 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).V&&
&&&&& View.BeginU&&
&&&&& View.DataController.BeginL&&
&&&&& try&&
&&&&&&&&& //&&
make&& changes&& here…&&
&&&&& finally&&
View.DataController.EndL&&
&&&&&&&&& View.EndU&&
****************************************************************************
42 在GridMode禁用内置的右键Footer菜单
uses&& cxGridStdPopupM&&
procedure&& cxGridPopupMenuOnPopup(...)&&
&&&&& if&& (ASenderMenu&&
is&& TcxGridStdFooterMenu)&& and&&
&&&&&&&&&&&&&
&GridView&.DataController.DataModeController.GridMode&&
&&&&&&&&& AllowPopup&&
****************************************************************************
43 主从表任何时候只能展开一个组
procedure&& TForm1.ADetailDataControllerCollapsing(&&
&&&&& ADataController:&&
TcxCustomDataC&& ARecordIndex:&& I&&
&&&&& var&& AAllow:&&
Boolean);&&
&&&&& I:&& I&&
&&&&& C:&& I&&
&&&&& AAllow&& :=&& F&&
&&&&& C&& :=&& 0;&&
&&&&& for&& I&& :=&&
0&& to&& ADataController.RecordCount&&
-&& 1&& do&&
&&&&& begin&&
&&&&&&&&& if&&
ADataController.GetDetailExpanding(I)&& then&&
&&&&&&&&&&&&&
&&&&&&&&& if&&
C&& &&& 1&& then&&
&&&&&&&&&&&&&
AAllow&& :=&& T&&
procedure&& TForm1.ADetailDataControllerExpanding(&&
&&&&& ADataController:&&
TcxCustomDataC&& ARecordIndex:&& I&&
&&&&& var&& AAllow:&&
Boolean);&&
&&&&& ADataController.CollapseD&&
procedure&& TForm1.FormCreate(Sender:&& TObject);&&
begin&&&&&&&
cxGrid1DBTableView1.DataController.OnDetailExpanding:=ADetailDataControllerE&&&&&&&&
cxGrid1DBTableView1.DataController.OnDetailCollapsing:=ADetailDataControllerC&&
****************************************************************************
44 动态创建层次(Level)和视图(View)
&&&&& Grid:&&
TcxG&&&&&&
&&&&& Level:&&
TcxGridL&&&&&&
&&&&& View:&& TcxGridDBTableV&&&&&&
&&&&& //&& Creates&& a&&
Grid&& instance&&
&&&&& Grid&& :=&&
TcxGrid.Create(SomeOwner);&&&&&&
&&&&& Grid.Parent&& :=&&
SomeP&&&&&&
&&&&& //&& Creates&& a&&
&&&&& Level&& :=&&
Grid.Levels.A&&&&&&
&&&&& Level.Name&& :=&&
'SomeLevelName';&&
&&&&& //&& Creates&& a&&
&&&&& View&& :=&&
Grid.CreateView(TcxGridDBTableView)&& as&&
TcxGridDBTableV&&&&&&
&&&&& View.Name&& :=&&
'SomeViewName';&&
&&&&& //&& …&& and&&
binds&& it&& to&& the&& Level&&
&&&&& Level.GridView&& :=&&
&&&&& //&& Hooks&& up&&
the&& View&& to&& the&& data&&
&&&&& View.DataController.DataSource&&
:=&& SomeDataS&&&&&&
&&&&& //&& …&& and&&
creates&& all&& columns&&
View.DataController.CreateAllI&&&&&&
****************************************************************************
45 获得Group&& Footer合计行对应的记录
procedure&& TForm1.cxGrid1DBTableView1CustomDrawFooterCell(&&
&&&&& Sender:&&
TcxGridTableV&& ACanvas:&& TcxC&&
&&&&& AViewInfo:&& TcxGridColumnHeaderViewI&&
var&& ADone:&& Boolean);&&
&&&&& ALevel,&& ADataGroupIndex:&&
&&&&& AGridRecord,&&
AGroupRecord:&& TcxCustomGridR&&
&&&&& if&& AViewInfo&&
is&& TcxGridRowFooterCellViewInfo&& and&&&
//&& Row&& footer&&
&&&&&&&&&&&
(TcxGridDBColumn(AViewInfo.Column).DataBinding.FieldName&&
=&& 'Area')&& then&&&& //&&
Area&& column&&
&& begin&&
&&&&&&& AGridRecord:=&&
TcxGridRowFooterCellViewInfo(AViewInfo).GridR&&
&&&&&&& ALevel:=
TcxGridRowFooterCellViewInfo(AViewInfo).Container.GroupL&&
ADataGroupIndex:=Sender.DataController.Groups.DataGroupIndexByRowIndex[AGridRecord.Index];&&
&&&&&&&& if&&
ADataGroupIndex&& &&&& -1&& then&&
&&&&&&&& begin&&
&&&&&&&&&&&
AGroupRecord&& :=&& AGridR&&
&&&&&&&&&&&
while&& AGroupRecord.Level&& &&&&
ALevel&& do&&
&&&&&&&&&&&
AGroupRecord&& :=&& AGroupRecord.ParentR&&
&&&&&&&&&&&
AViewInfo.Text&& :=&& AGroupRecord.DisplayTexts[0];&&
&&&&&&&&&&
****************************************************************************
46 访问过滤之后的记录
&&&&& I:&& I&&
&&&&& Memo1.Lines.C&&
&&&&& with&&
cxGrid1DBTableView1.DataController&& do&&
&&&&&&&&& for&&
I&& :=&& 0&& to&&
FilteredRecordCount&& -&& 1&& do&&
&&&&&&&&&&&&&
Memo1.Lines.Add(DisplayTexts[FilteredRecordIndex[I],&& 0]);&&
****************************************************************************
47 获得单元的Font
cxGrid1DBTableView1.ViewInfo.RecordsViewInfo.Items[1].GetCellViewInfoByItem(&&
&&&&& cxGrid1DBTableView1Company).EditViewInfo.F
****************************************************************************
48 根据Level名称找到Level对象
function&& GetLevelByName(AGrid:&& TcxG&&
ALevelName:&& string):&& TcxGridL&&
&&&&& function&& LoopThroughLevels(ALevel:&&
TcxGridL&& ALevelName:&& string):&&
TcxGridL&&
&&&&& var&&
&&&&&&&&& I:&&
&&&&& begin&&
&&&&&&&&& Result&&
&&&&&&&&& for&&
I&& :=&& 0&& to&&
ALevel.Count&& -&& 1&& do&&
&&&&&&&&& begin&&
&&&&&&&&&&&&&
if&& ALevel[I].Name&& =&& ALevelName&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&
Result&& :=&& ALevel[I];&&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
if&& ALevel[I].Count&& &&& 0&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&
Result&& :=&& LoopThroughLevels(ALevel[I],&&
ALevelName);&&
&&&&&&&&&&&&&&&&&
if&& Result&& &&&& nil&&
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&& I:&& I&&
&&&&& Result&& :=&&&&
&&&&& for&& I&& :=&&
0&& to&& AGrid.Levels.Count&& -&&
&&&&& begin&&
&&&&&&&&& if&&
AGrid.Levels[I].Name&& =&& ALevelName&&
&&&&&&&&& begin&&
&&&&&&&&&&&&&
Result&& :=&& AGrid.Levels[I];&&
&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&& if&& AGrid.Levels[I].Count&&
&&& 0&& then&&
&&&&&&&&& begin&&
&&&&&&&&&&&&&
Result&& :=&&
LoopThroughLevels(AGrid.Levels[I],&& ALevelName);&&
&&&&&&&&&&&&&
if&& Result&& &&&& nil&&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&
****************************************************************************
&49 指定Filter&&
Builder打开/保存过滤文件的默认路径
&&&&& ...,&& cxFilterControlD&&
procedure&& TForm.GridView1FilterControlDialogShow(&&
&&&&& Sender:&& TObject);&&
&&&&& TfmFilterControlDialog(Sender).OpenDialog.InitialDir&&
:=&& 'D:/'&&
****************************************************************************
50 保存/恢复带汇总行的布局
&TableView&.StoreToIniFile('c:\Grid.ini',
True, [gsoUseSummary]);
&GridView&.RestoreFromIniFile(&inifilename&,True,False {or True,
optional},[gsoUseSummary]);
****************************************************************************
51 取消过滤时移到第一行
&&&&& cxCustomD&&
procedure&&
TYour_Form.AViewDataControllerFilterChanged(Sender:&& TObject);&&
&&&&& Filter:&& TcxDataFilterC&&
&&&&& with&& Sender&&
as&& TcxDataFilterCriteria&& do&&
&&&&&&&&& if&&
IsEmpty&& then&&
&&&&&&&&&&&&&
DataController.FocusedRowIndex&& :=&& 0;&&
****************************************************************************
52 排序后移到第一行
可以设置DataController.Options.FocusTopRowAfterSorting&&
:=&& True,也可以使用如下的代码:&&
&&&&& cxCustomD&&
procedure&& TYour_Form.Your_ViewDataControllerSortingChanged(Sender:&&
TObject);&&
TcxCustomDataController(Sender).FocusedRowIndex&& :=&&
****************************************************************************
53 判断当前行是否第一行或最后一行
可以使用DataController的IsBOF,&& IsEOF方法,或者:&&
&AView&.Controller.Controller.FocusedRow.IsFirst&&
&AView&.Controller.Controller.FocusedRow.IsLast
****************************************************************************
54 根据指定值查找记录
DataController提供了好几个方法来得到指定值对应的RecordIndex&&
对于Bound&& View可以使用FindRecordIndexByKeyValue方法
****************************************************************************
55 编辑和显示Blob字段
该字段的Properties设置为BlobEdit,并将BlobPaintStyle&& 属性设为&&
****************************************************************************
56 得到可见行数
&View&.ViewInfo.VisibleRecordCount
****************************************************************************
57 保存后的行设置为当前行
&&&&& CM_SETFOCUSEDRECORD&& =&&
WM_USER&& +&& 1002;&&
&&&&& TForm1&& =&&
class(TForm)&&
cxGrid1DBTableView1:&& TcxGridDBTableV&&
cxGrid1Level1:&& TcxGridL&&
&&&&&&&&& cxGrid1:&&
&&&&&&&&& dxMemData1:&&
dxMemData1Field1:&& TStringF&&
dxMemData1Field2:&& TIntegerF&&
&&&&&&&&& DataSource1:&&
cxGrid1DBTableView1RecId:&& TcxGridDBC&&
cxGrid1DBTableView1Field1:&& TcxGridDBC&&
cxGrid1DBTableView1Field2:&& TcxGridDBC&&
&&&&&&&&& Timer1:&&
&&&&&&&&& CheckBox1:&&
&&&&&&&&& procedure&&
Timer1Timer(Sender:&& TObject);&&
&&&&&&&&& procedure&&
dxMemData1AfterPost(DataSet:&& TDataSet);&&
&&&&&&&&& procedure&&
CheckBox1Click(Sender:&& TObject);&&
&&&&& private&&
&&&&&&&&& procedure&&
CMSetFocusedRecord(var&& Msg:&& TMessage);&&
message&& CM_SETFOCUSEDRECORD;&&
&&&&& public&&
&&&&&&&&& {&&
Public&& declarations&& }&&
&&&&& Form1:&& TForm1;&&
&&&&& FocusedIdx:&& I&&
implementation&&
{$R&& *.dfm}&&
procedure&& TForm1.Timer1Timer(Sender:&& TObject);&&
&&&&& dxMemData1.AppendRecord(['',&&
IntToStr(Random(1000)),&& Random(1000)]);&&
procedure&& TForm1.dxMemData1AfterPost(DataSet:&&
TDataSet);&&
&&&&& PostMessage(Handle, CM_SETFOCUSEDRECORD,&&
Integer(cxGrid1DBTableView1),&&
MakeLParam(cxGrid1DBTableView1.Controller.FocusedRowIndex,&&
cxGrid1DBTableView1.Controller.TopRowIndex));&&
procedure&& TForm1.CMSetFocusedRecord(var&&
Msg:&& TMessage);&&
&&&&& TcxGridDBTableView(msg.WParam).Controller.FocusedRowIndex&&
:=&& Msg.LParamLo;&&
TcxGridDBTableView(msg.WParam).Controller.TopRowIndex&&
:=&& Msg.LParamHi;&&
procedure&& TForm1.CheckBox1Click(Sender:&& TObject);&&
&&&&& Timer1.Enabled&& :=&&
TCheckBox(Sender).C&&
****************************************************************************
58 删除记录并获得焦点
procedure&& TForm1.BtnDeleteClick(Sender:&& TObject);&&
&&&&& FocusedRow,&& TopRow:&&
&&&&& View:&& TcxGridTableV&&
&&&&& DataController:&&
TcxGridDataC&&
&&&&& View&& :=&&
cxGrid1.FocusedView&& as&& TcxGridTableV&&
&&&&& DataController&& :=&&
View.DataC&&
&&&&& //&& Remember&&
the&& top&& row&& (the&&
vertical&& scrollbar&& position)&&
&&&&& TopRow&& :=&&
View.Controller.TopRowI&&
&&&&& //&& Remember&&
the&& focused&& row(!)&& index&&
&&&&& FocusedRow&& :=&&
DataController.FocusedRowI&&
&&&&& DataController.DeleteF&&
&&&&& //&& After&& deletion&&
the&& same&& row&& must&&
be&& focused,&&
&&&&& //&& although&&
it&& will&& correspond&& to&&
a&& different&& data&& record&&
&&&&& DataController.FocusedRowIndex&&
:=&& FocusedR&&
&&&&& //&& Restore&&
the&& top&& row&&
&&&&& View.Controller.TopRowIndex&&
:=&& TopR&&
****************************************************************************
59 cxGrid的 TableView 数据排序与对应的数据集同步
COPYRIGHT BY cnCharles, ALL RIGHTS RESERVED.
delphi群: , blog:&&&
&&&& //描述: cxGrid的 TableView 数据排序与对应的数据集同步,
该方法主要用于打印时
//&&&&&&&& 的排序与所见到的排序保持一致;
&&&&&& //参数: @tv: 排序的cxGridTableView
&&&&&& //说明: @tv: 对应的数据集只支持
ADOQuery与 ClientDataS
&&&&&& procedure cxGridSortSyncToDataSet(tv:
TcxGridDBTableView);
&&&&&& //描述: 功能同上, 实现代码一样, 如果有更改就同步更改
&&&&&& procedure cxGridSortSyncToDataSet(tv:
TcxGridDBBandedTableView);
procedure cxGridSortSyncToDataSet(tv:
TcxGridDBTableView);
&&&& SortArray: array[soAscending..soDescending] of string
= (’ASC’, ’DESC’);
&&&& AscFields, DescFields, S, SortOrder:
&&&& IndexPrint:
&&&& Index:
&&&& cds: TClientDataS
&&&& S := ’’;
&&&& AscFields := ’’;
&&&& DescFields := ’’;
&&&& if tv.SortedItemCount = 0 then
&&&& if tv.DataController.DataSource.DataSet is TADOQuery
then begin
&&&&&& for I := 0 to tv.SortedItemCount - 1 do
&&&&&&&& SortOrder :=
SortArray[tv.SortedItems[I].SortOrder];
&&&&&&&& if S && ’’ then
&&&&&&&&&& S := S + ’, ’;
&&&&&&&& Index :=
tv.SortedItems[I].I
&&&&&&&& S := S +
tv.Columns[Index].DataBinding.Field.FieldName + ’ ’ + SortO
&&&&&& (tv.DataController.DataSource.DataSet as
TADOQuery).Sort := S;
&&&& end else if (tv.DataController.DataSource.DataSet is
TClientDataSet)&&&& then begin
&&&&&& Cds :=
tv.DataController.DataSource.DataSet as TClientDataS
&&&&&& for I := 0 to tv.SortedItemCount - 1 do
&&&&&&&& Index := tv.SortedItems[I].I
&&&&&&&& S :=
tv.Columns[Index].DataBinding.Field.FieldName +’;’;
&&&&&&&& AscFields := AscFields + S;
&&&&&&&& if tv.SortedItems[I].SortOrder
= soDescending then
&&&&&&&&&& DescFields :=
DescFields + S;
&&&&&& if AscFields && ’’ then
&&&&&&&& Delete(AscFields,
Length(AscFields), 1); //删除 ;
DescFields && ’’ then
&&&&&&&& Delete(DescFields,
Length(DescFields), 1);
&&&&&& IndexPrint := TimeToStr(Now());
&&&&&& Cds.IndexDefs.C
&&&&&& IndexPrint := TimeToStr(Now());
&&&&&& cds.AddIndex(IndexPrint, AscFields, [],
DescFields);
&&&&&& cds.IndexName := IndexP
****************************************************************************
60 cxGRID怎么遍历已经选择的单元格
n := cxGrid1DBTableView1.DataController.GetSelectedC&&
&&&&& for&& i:=0&& to&&
n&& -&& 1&& do&&
&&&&& begin&&
&&&&&&&&& Index&&
:=&& cxGrid1DBTableView1.DataController.GetSelectedRowIndex(i);&&
&&&&&&&&& if&&
Index&& &&& 0&& then&&
&&&&&&&&& AccID&&
&&&&&&&&&&&&&&&&&&&&&&&&&
cxGrid1DBTableView1.DataController.GetRowvalue(&&
&&&&&&&&&&&&&&&&&&&&&&&&&
cxGrid1DBTableView1.DataController.GetRowInfo(Index)&&
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&& AccID&&
:=&& dsData.DataSet.FieldByName(’AccountID’).AsS&&
n := cxGrid1DBTableView1.DataController.GetSelectedC&&
&&&&& for&& i:=0&& to&&
n&& -&& 1&& do&&
&&&&& begin&&
&&&&&&&&& Index&&
:=&& cxGrid1DBTableView1.DataController.GetSelectedRowIndex(i);&&
&&&&&&&&& if&&
Index&& &&& 0&& then&&
&&&&&&&&& AccID&& :=
cxGrid1DBTableView1.DataController.GetRowvalue(&&
&&&&&&&&&&&&&&&&&
cxGrid1DBTableView1.DataController.GetRowInfo(Index)&&
&&&&&&&&&&&&&&&&&
,0);//这里的0是列的索引,能指定,也可用通过GridView获取&&
****************************************************************************
61 动态设置显示格式
procedure SetDisplayFormat(ACtrlData: TClientDataS
TbView: TcxGridDBTableView);
if ACtrlData.RecordCount &= 0 then E
&&& TbView.ClearI
&&& ACtrlData.F
&&& for i := 0 to ACtrlData.RecordCount - 1 do
ACtrlData.FieldByName('SQBF_DisplayInGrid').AsString = '1' then //在表格中显示
&&&&& with TbView.CreateColumn do
&&&&& begin
&&&&&&& DataBinding.FieldName :=
ACtrlData.FieldByName('SQBF_FieldName').AsS
&&&&&&& Caption :=
ACtrlData.FieldByName('SQBF_Caption').AsS //字段中文标题
&&&&&&& Hint :=
ACtrlData.FieldByName('SQBF_Hint').AsS
&&&&&&& Width :=
ACtrlData.FieldByName('SQBF_Width').AsI
&&&&&&& HeaderAlignmentHorz := taC
&&&&& ACtrlData.N
&&& on E: Exception do
&&&&& SaveLog('设置显示格式时出错:' +
E.Message);
****************************************************************************
62 给cxGRID加序号列
procedure SetRowNumber(var ASender: TcxGridTableV
AViewInfo: TcxCustomGridIndicatorItemViewI
&& var ACanvas: TcxC var ADone: boolean);
uses cxLookAndFeelP
procedure SetRowNumber(var ASender:
TcxGridTableV AViewInfo: TcxCustomGridIndicatorItemViewI
&& var ACanvas: TcxC var ADone: boolean);
&& AIndicatorViewInfo: TcxGridIndicatorRowItemViewI
&& ATextRect: TR
&& AFont: TF
&& AFontTextColor, AColor: TC
&& AFont := ACanvas.F
&& AColor := clBtnF
&& AFontTextColor := clWindowT
if (AViewInfo is TcxGridIndicatorHeaderItemViewInfo) then begin
&& ATextRect := AViewInfo.B
&& InflateRect(ATextRect, -1, -1);
&& ASender.LookAndFeelPainter.DrawHeader(ACanvas, AViewInfo.Bounds,
&&&& ATextRect, [], cxBordersAll, cxbsNormal, taCenter,
&&&& False, False, '序号', AFont,
AFontTextColor, AColor);
&&&& ADone := T
if not (AViewInfo is TcxGridIndicatorRowItemViewInfo) then
&& ATextRect := AViewInfo.ContentB
&& AIndicatorViewInfo := AViewInfo as TcxGridIndicatorRowItemViewI
&& InflateRect(ATextRect, -1, -1);
&& ASender.LookAndFeelPainter.DrawHeader(ACanvas,
AViewInfo.ContentBounds,
&&&& ATextRect, [], [bBottom, bLeft, bRight], cxbsNormal,
taCenter, vaCenter,
&&&& False, False, IntToStr(AIndicatorViewInfo.GridRecord.Index
&&&& AFont, AFontTextColor, AColor);
&& ADone := T
ASender.LookAndFeelPainter.DrawIndicatorImage(ACanvas,ATextRect,
AIndicatorViewInfo.IndicatorKind);
如果你不要行标志的话,你可以不改控件
直接注释掉这一行: ASender.LookAndFeelPainter.DrawIndicatorImage(ACanvas, ATextRect,
AIndicatorViewInfo.IndicatorKind);
要标志的话,在DrawIndicatorImage 从这里跟进去(Ctrl+左键单击)
在 cxLookAndFeelPainters 单元中作如下修改:
class procedure
TcxCustomLookAndFeelPainter.DrawIndicatorImage(ACanvas: TcxC
&& const R: TR AKind: TcxIndicatorKind);
&& X, Y: I
&& if AKind = ikNone then E
&& with cxIndicatorImages, R do
&&&& X := (Left + Right -
Width);&&&&&&&&&&&&&&
&&&& Y := (Top + Bottom - Height) div
2;&&&&&& //居中
&& cxIndicatorImages.Draw(ACanvas.Canvas, X, Y, Ord(AKind) - 1);
注意,我已注明靠右的那一行, 就是去掉 DIV 2 了,
还要改一个地方:
SKIN控件目录下的dxSkinLookAndFeelPainter单元,找到
TdxSkinLookAndFeelPainter.DrawIndicatorImage 函数
OffsetRect(ARect, (Left + Right - cx div 2) , (Top + Bottom - cy) div 2);
这一行,将 (Left + Right - cx div 2) 改为(Left + Right - cx)
也是去掉 div 2 就是靠右;
修改后: OffsetRect(ARect, (Left + Right - cx) , (Top + Bottom - cy) div
procedure TForm1.cxGrid1DBTableView1CustomDrawIndicatorCell(
&& Sender: TcxGridTableV ACanvas: TcxC
&& AViewInfo: TcxCustomGridIndicatorItemViewI var ADone:
&&&& SetRowNumber(Sender,AviewInfo,ACanvas,ADone);
另外序号列的列宽最好改为25以上!
****************************************************************************
63 cxGrid自带过滤后数据也数据集同步
在cxGrid的View Filter事件的OnBeforeChange中写代码就可以了.
procedure TForm1.tvcxgd1DBTableView1DataControllerFilterBeforeChange( Sender:
TcxDBDataFilterC ADataSet: TDataS const AFilterText: String); begin
//这里可以增加数据集控件的filter:= //如:adoquery.filter:= //如果使用的是cxgrid的汉化版本,可以将AFilterText中的中文等于,小于 替换成 = &等
//adoquery.filter:=替换了中文的AFilterT ShowMessage(AFilterText); 写了上述步骤后可以在tvcxgd1DBTableView1DataControllerFilterChanged写
adoquery.filter:= 这样就起到了cxgrid过滤后的数据同步到adoquery
阅读(...) 评论()}

我要回帖

更多关于 notepad 自动换行 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信