2010-关于cxgrid使用的方法收藏
2010-11-05 14:26
513 查看
cxGrid控件功能很强大,有许多方法及属性,其中有一个属性gridmode。 当你设置gridmode=true时,会提高查询速度,为false时则反之,为什么如此,在网上有相关的贴子。 当设置gridmode=true时,则在cxGrid上设置的filtering,sorting,footer中的合计信息均无效(几天前做一个模块时发现的)。 我要实现的功能如下:。 2010-关于cxgrid使用的方法收藏。 1.在cxgrid上显示一些信息(连接数据集很容易实现)。 2.每列要有filter的功能(每一列的filtering=true)。 3.要有一个合计列(footer,合计的记录数,数量,金额等)。 4.可以选择部分信息,然后统计更新某一列或几列的值。 2010-关于cxgrid使用的方法收藏。 *的还有许多,主要的功能是想把对于Excel操作的相关操作用程序来实现,要达到信息共享,方便统计查询等但最主要的用程序不能增加工作量(与Excel相比)。 在实现过程想了很多办法为子操作能够快速简单,处理过程。 1.将一些繁琐的查询条件进行分析,然后进行分类,使其简单化。 2.对于复制粘贴等,采用了对像,指针及类似Excel的操作方法实现。 3.增加多种条件的筛选及统计,做相关的统计报表避免重复的工作。 ......。 在做的过程中有一个问题,就是在选择性更新过程中如何刷新使用户能够立刻看到结果。 第一种方法:。 增加刷新的方法,利用update语句来实现更新,然后commit,最后根据选定的条件重新刷新界面,这是我用的比较多的,但目前不方便,刷新后,我看不到我正在更改的是哪条或哪几条记录了(如果很多数据)。 第二种方法:。 利用dataset的edit,post方法进行更新。 a.。 fori:=0toDSRFTDAVEW.Controller.SelectedRowCount-1do。 begin。 DSRFTDAVEW.DataController.FocusSelectedRow(i);//这种方法需要设置gridmode=true,但此时会将filtering,sorting,footer等失效。 oraQuery1.Edit;。 oraQuery1.FieldByName('FeatSN').Value:=SerialNO;。 end;。 这样要首先设置gridmode=true,但就会出现最开始提到的问题。 我试著在修改时将gridmode=true,当修寇成后再将其gridmode=false,虽然可以修改,但是在修改过程中如果利用某列的filtering先筛选一些数据后,就会出现问题。 b.。 利用DSRFTDAVEW.Controller.FocusedRow:=DSRFTDAVEW.Controller.SelectedRows[i];来获取数据的焦点即用cxgridview的controller来实现,这样就可以避免gridmode=true的冲突。 下面是在网上找到的相关的资料。 2009-03-2721:31。 激活内置编辑控件。 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;。 ===========================================================================。 保存修改到数据库。 procedureaForm.FormClose(Sender:TObject;varAction:TCloseAction);。 begin。 if(aGrid.FocusedViewnil)and(aGrid.FocusedView.DataController.EditState[])then。 aGrid.FocusedView.DataController.Post;。 end;。 设置内置右键菜单。 内置右键菜单包括二个菜单:cxGridStdHeaderMenu,TcxGridStdFooterMenu。 usescxGridStdPopupMenu;。 procedureTForm1.cxGridPopupMenu1Popup(ASenderMenu:TComponent;。 AHitTest:TcxCustomGridHitTest;X,Y:Integer;varAllowPopup:Boolean);。 begin。 ifASenderMenuisTcxGridStdHeaderMenuthen。 TcxGridStdHeaderMenu(ASenderMenu).OnPopup:=StdHeaderMenuPopup;。 end;。 procedureTForm1.StdHeaderMenuPopup(Sender:TObject);。 var。 I:Integer;。 begin。 withTcxGridStdHeaderMenu(Sender).Itemsdo。 forI:=0toCount-1do。 ifItems[I].Caption='GroupByBox'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);。 ifADataSet.BookmarkValid(TBookmark(Bkm))then。 begin。 ADataSet.Bookmark:=TBookmark(Bkm);。 OutputVal:=ADataSet.FieldByName(AFieldName).Value;。 end;。 View.BeginUpdate;。 View.DataController.BeginLocate;。 try。 //makechangeshere…。 finally。 View.DataController.EndLocate;。 View.EndUpdate;。 end;。 =============================================================。 在GridMode禁用内置的右键Footer菜单。 usescxGridStdPopupMenu;。 procedurecxGridPopupMenuOnPopup(...)。 begin。 if(ASenderMenuisTcxGridStdFooterMenu)and。 GridView.DataController.DataModeController.GridModethen。 AllowPopup:=False;。 end;。 ==============================================================。 主从表任何时候只能展开一个组。 procedureTForm1.ADetailDataControllerCollapsing(。 ADataController:TcxCustomDataController;ARecordIndex:Integer;。 varAAllow:Boolean);。 var。 I:Integer;。 C:Integer;。 begin。 AAllow:=False;。 C:=0;。 forI:=0toADataController.RecordCount-1do。 begin。 ifADataController.GetDetailExpanding(I)then。 Inc(C);。 ifC1then。 AAllow:=True;。 end;。 end;。 procedureTForm1.ADetailDataControllerExpanding(。 ADataController:TcxCustomDataController;ARecordIndex:Integer;。 varAAllow:Boolean);。 begin。 ADataController.CollapseDetails;。 end;。 procedureTForm1.FormCreate(Sender:TObject);。 begin。 cxGrid1DBTableView1.DataController.OnDetailExpanding:=ADetailDataControllerExpanding;。 cxGrid1DBTableView1.DataController.OnDetailCollapsing:=ADetailDataControllerCollapsing;。 end;。 =================================================================。 动态创建层次(Level)和视图(View)。 var。 Grid:TcxGrid;。 Level:TcxGridLevel;。 View:TcxGridDBTableView;。 begin。 //CreatesaGridinstance。 Grid:=TcxGrid.Create(SomeOwner);。 Grid.Parent:=SomeParent;。 //CreatesaLevel。 Level:=Grid.Levels.Add;。 Level.Name:='SomeLevelName';。 //CreatesaView。 View:=Grid.CreateView(TcxGridDBTableView)asTcxGridDBTableView;。 View.Name:='SomeViewName';。 //…andbindsittotheLevel。 Level.GridView:=View;。 //HooksuptheViewtothedata。 View.DataController.DataSource:=SomeDataSource;。 //…andcreatesallcolumns。 View.DataController.CreateAllItems;。 end;。 此楼回复Re:。 --------------------------------------------------------------------------------。 ======================================================================。 获得GroupFooter合计行对应的记录。 procedureTForm1.cxGrid1DBTableView1CustomDrawFooterCell(。 Sender:TcxGridTableView;ACanvas:TcxCanvas;。 AViewInfo:TcxGridColumnHeaderViewInfo;varADone:Boolean);。 var。 ALevel,ADataGroupIndex:Integer;。 AGridRecord,AGroupRecord:TcxCustomGridRecord;。 begin。 ifAViewInfoisTcxGridRowFooterCellViewInfoand//Rowfooter。 (TcxGridDBColumn(AViewInfo.Column).DataBinding.FieldName='Area')then//Areacolumn。 begin。 AGridRecord:=TcxGridRowFooterCellViewInfo(AViewInfo).GridRecord;。 ALevel:=TcxGridRowFooterCellViewInfo(AViewInfo).Container.GroupLevel;。 ADataGroupIndex:=Sender.DataController.Groups.DataGroupIndexByRowIndex[AGridRecord.Index];。 ifADataGroupIndex-1then。 begin。 AGroupRecord:=AGridRecord;。 whileAGroupRecord.LevelALeveldo。 AGroupRecord:=AGroupRecord.ParentRecord;。 AViewInfo.Text:=AGroupRecord.DisplayTexts[0];。 end;。 end;。 end;。 ===========================================================================。 访问过滤之后的记录。 var。 I:Integer;。 begin。 Memo1.Lines.Clear;。 withcxGrid1DBTableView1.DataControllerdo。 forI:=0toFilteredRecordCount-1do。 Memo1.Lines.Add(DisplayTexts[FilteredRecordIndex[I],0]);。 end;。 ============================================================================。 获得单元的Font。 cxGrid1DBTableView1.ViewInfo.RecordsViewInfo.Items[1].GetCellViewInfoByItem(。 cxGrid1DBTableView1Company).EditViewInfo.Font;。 ============================================================================。 根据Level名称找到Level对象。 functionGetLevelByName(AGrid:TcxGrid;ALevelName:string):TcxGridLevel;。 functionLoopThroughLevels(ALevel:TcxGridLevel;ALevelName:string):TcxGridLevel;。 var。 I:Integer;。 begin。 Result:=nil;。 forI:=0toALevel.Count-1do。 begin。 ifALevel[I].Name=ALevelNamethen。 begin。 Result:=ALevel[I];。 Exit;。 end;。 ifALevel[I].Count0then。 begin。 Result:=LoopThroughLevels(ALevel[I],ALevelName);。 ifResultnilthen。 Exit;。 end;。 end;。 end;。 var。 I:Integer;。 begin。 Result:=nil;。 forI:=0toAGrid.Levels.Count-1do。 begin。 ifAGrid.Levels[I].Name=ALevelNamethen。 begin。 Result:=AGrid.Levels[I];。 Exit;。 end;。 ifAGrid.Levels[I].Count0then。 begin。 Result:=LoopThroughLevels(AGrid.Levels[I],ALevelName);。 ifResultnilthen。 Exit;。 end;。 end;。 end;。 ============================================================================。 指定FilterBuilder打开/保存过滤文件的默认路径。 uses。 ...,cxFilterControlDialog;。 procedureTForm.GridView1FilterControlDialogShow(。 Sender:TObject);。 begin。 TfmFilterControlDialog(Sender).OpenDialog.InitialDir:='D:/'。 end;。 ============================================================================。 保存/恢复带汇总行的布局。 TableView.StoreToIniFile('c:/Grid.ini',True,[gsoUseSummary]);。 GridView.RestoreFromIniFile(inifilename,True,False{orTrue,optional},[gsoUseSummary]);。 ============================================================================。 取消过滤时移到第一行。 uses。 cxCustomData;。 procedureTYour_Form.AViewDataControllerFilterChanged(Sender:TObject);。 var。 Filter:TcxDataFilterCriteria;。 begin。 withSenderasTcxDataFilterCriteriado。 ifIsEmptythen。 DataController.FocusedRowIndex:=0;。 end;。 =============================================================================。 排序后移到第一行。 可以设置DataController.Options.FocusTopRowAfterSorting:=True,也可以使用如下的代码:。 uses。 cxCustomData;。 procedureTYour_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。 对于BoundView可以使用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;。 procedureTimer1Timer(Sender:TObject);。 proceduredxMemData1AfterPost(DataSet:TDataSet);。 procedureCheckBox1Click(Sender:TObject);。 private。 procedureCMSetFocusedRecord(varMsg:TMessage);messageCM_SETFOCUSEDRECORD;。 public。 {Publicdeclarations}。 end;。 var。 Form1:TForm1;。 FocusedIdx:Integer;。 implementation。 {$R*.dfm}。 procedureTForm1.Timer1Timer(Sender:TObject);。 begin。 dxMemData1.AppendRecord(['',IntToStr(Random(1000)),Random(1000)]);。 end;。 procedureTForm1.dxMemData1AfterPost(DataSet:TDataSet);。 begin。 PostMessage(Handle,CM_SETFOCUSEDRECORD,Integer(cxGrid1DBTableView1),MakeLParam(cxGrid1DBTableView1.Controller.FocusedRowIndex,cxGrid1DBTableView1.Controller.TopRowIndex));。 end;。 procedureTForm1.CMSetFocusedRecord(varMsg:TMessage);。 begin。 TcxGridDBTableView(msg.WParam).Controller.FocusedRowIndex:=Msg.LParamLo;。 TcxGridDBTableView(msg.WParam).Controller.TopRowIndex:=Msg.LParamHi;。 end;。 procedureTForm1.CheckBox1Click(Sender:TObject);。 begin。 Timer1.Enabled:=TCheckBox(Sender).Checked;。 end;。 end.。 =================================================================================。 删除记录并获得焦点。 procedureTForm1.BtnDeleteClick(Sender:TObject);。 var。 FocusedRow,TopRow:Integer;。 View:TcxGridTableView;。 DataController:TcxGridDataController;。 begin。 View:=cxGrid1.FocusedViewasTcxGridTableView;。 DataController:=View.DataController;。 //Rememberthetoprow(theverticalscrollbarposition)。 TopRow:=View.Controller.TopRowIndex;。 //Rememberthefocusedrow(!)index。 FocusedRow:=DataController.FocusedRowIndex;。 DataController.DeleteFocused;。 //Afterdeletionthesamerowmustbefocused,。 //althoughitwillcorrespondtoadifferentdatarecord。 DataController.FocusedRowIndex:=FocusedRow;。 //Restorethetoprow。 View.Controller.TopRowIndex:=TopRow;。 end;。 //=======================================================================================。 数据库中的财务表为:。 ID收支类型金额*属性。 其中收支类型只有两种值:0表示收入,1表示支出;金额都是正数。 设置cxGrid的Footer可以使得在显示时,列表的下方出现汇总行:“金额”的和。 同样设置DefaultForGroups可以使得在用户拖动表头属性实现分组时,显示组内的汇总行:“金额”的和。 上面说的,用过cxGrid应该都会,下面就有这么一个问题。 如果我想使汇总行的值变为如下的值应该怎样实现:。 收支类型为0的金额的和-收支类型为1的金额的和。 实现Footer的功能好办,因为它的值不会变,自己用循环写一个就完了,但是DefaultForGroups的功能就不好说了,因为它的值是根据用户拖动的属性计算的,而且还有可能是多层分组,想不出来了,所有到这来问。 是不是要设置什么属性?或者cxGrid根本就没这个功能,那该用什么方法解决?希望哪位帮我解决,谢谢了先!。 给你一个例子,可能对你有帮助,。 withtvOrders.DataController.Summarydo。 begin。 BeginUpdate;。 try。 SummaryGroups.Clear;。 //Thefirstsummarygroup。 withSummaryGroups.Adddo。 begin。 //Addproposedgroupingcolumn(s)。 TcxGridTableSummaryGroupItemLink(Links.Add).Column:=tvOrdersCustomerID;。 //Addsummaryitems。 withSummaryItems.AddasTcxGridDBTableSummaryItemdo。 begin。 Column:=tvOrdersPaymentAmount;。 Kind:=skSum;。 Format:='AmountPaid:$,0';。 end;。 withSummaryItems.AddasTcxGridDBTableSummaryItemdo。 begin。 Column:=tvOrdersPaymentAmount;。 Kind:=skCount;。 Format:='Records:0';。 end;。 end;。 //Thesecondsummarygroup。 withSummaryGroups.Adddo。 begin。 //Addproposedgroupingcolumn(s)。 TcxGridTableSummaryGroupItemLink(Links.Add).Column:=tvOrdersProductID;。 //Addsummaryitems。 withSummaryItems.AddasTcxGridDBTableSummaryItemdo。 begin。 Column:=tvOrdersQuantity;。 Kind:=skSum;。 Position:=spFooter;。 Format:='TOTAL=0';。 end;。 withSummaryItems.AddasTcxGridDBTableSummaryItemdo。 begin。 Column:=tvOrdersPurchaseDate;。 Kind:=skMin;。 Position:=spFooter;。 end;。 end;。 finally。 EndUpdate;。 end;。 end;。 2007-7-1912:56:41goon。 订单号商品名单价数量金额。 001aa11.00222.00。 001bb2.0024.00。 001cc3.0039.00。 ----------------------合计735.00。 002ee11.00222.00。 002bb3.0026.00。 002cc3.0039.00。 ----------------------合计737.00。 总计1472.00。 每个单号分一个小结,能实现吗?。 最后在底下实现总的合计。 回复人:dctony()()信誉:1002007-1-1221:48:23得分:100。 ?。 可以的,cxGrid的功能比你想象的还要强大。 1.你先放一个cxGrid,设置好View,设置View.DataController连接的DataSource。 2.激活DataSource连接的DataSet,双击cxGrid,点击RetrieveFields,取得所有的Column。 3.设置View的OptionsView.Footer=True,OptionsView.GroupFooters=True,这是为了把分组小计和总计面板显示出来。 4.将“订单号”字段拖到cxGrid上方的分组面板(GroupbyBox),将数据按“订单号”分组。这时你会发现单身所有的数据都缩起来了,如果想使所有的数据都展开,可以设置View.DataController.Options.dcoGroupsAlwaysExpanded=True。 5.设置分组小计:把View.DataController.Summary.DefaultGroupSummaryItems点开,新增一个Item,Column属性在下拉里选择“数量”字段,FieldName属性为空,Format属性可以设置数值的显示格式,Kind属性下拉skSum加总,Position属性一定要选择spFooter。 6.设置总计:把View.DataController.Summary.FooterSummaryItems点开,新增一个Item,Column属性在下拉里选择“数量”字段,FieldName属性为空,Format属性可以设置数值的显示格式,Kind属性下拉skSum加总,Position属性一定要选择spFooter。 大功告成,按F9看一下胜利果实吧。 再奉送一个技巧,在Form1再放一个TcxGridPopupMenu控件,就在cxGrid控件旁边的那个,把TcxGridPopupMenu的Grid属性设置成你的cxGrid。 然后运行程序,在运行状态,点击Grid上的所有地方,左键或右键,你都会有意外收获。 ExpressQuantumGrid控件实在是太复杂,太庞大,最好的了解它的方法就是查帮助。 贴一些小技巧,希望与各位使用cxGrid的朋友共同交流。 各位有什么好个技巧也可以贴出来:。 技巧二:在内置右键菜单的后面增加菜单项。 首先应在Form上加一个cxGridPopupMenu控件以启用右键菜单。 UseBuildInPopupMenus设为True。 procedureTFormItemList.FormCreate(Sender:TObject);。 var。 AMenu:TComponent;。 FMenuItem,FSubMenuItem:TMenuItem;。 begin。 AMenu:=nil;。 ifcxGridPopupMenu.BuiltInPopupMenus.Count=0then。 Exit;。 AMenu:=cxGridPopupMenu.BuiltInPopupMenus[0].PopupMenu;//第一个内置右键菜单(表头菜单)。 ifAssigned(AMenu)andAMenu.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;。 procedureTFormItemList.miExportClick(Sender:TObject);。 var。 FileName,FileExt,msg:String;。 begin。 ifSelf.aqyQuery.IsEmptythen。 begin。 msg:='没有导出数据...';。 Application.MessageBox(PChar(msg),PChar(Application.Title),。 MB_OKorMB_IconWarning);。 Exit;。 end;。 Self.SaveDialogExport.Filter:='Excel文件(*.xls)|*.xls|XML文件(*.xml)|*.xml'。 +'|文本文件(*.txt)|*.txt|网页文件(*.html)|*.html';。 Self.SaveDialogExport.Title:='导出为';。 ifnotSelf.SaveDialogExport.Executethen。 Exit;。 FileName:=Self.SaveDialogExport.FileName;。 FileExt:=LowerCase(ExtractFileExt(FileName));。 ifFileExt='.xls'then。 ExportGrid4ToExcel(FileName,Self.cxGrid1)。 elseifFileExt='.xml'then。 ExportGrid4ToXML(FileName,Self.cxGrid1)。 elseifFileExt='.txt'then。 ExportGrid4ToText(FileName,Self.cxGrid1)。 elseifFileExt='.html'then。 ExportGrid4ToHTML(FileName,Self.cxGrid1)。 else。 begin。 msg:='不支持的导出文件类型...';。 Application.MessageBox(PChar(msg),PChar(Application.Title),。 MB_OKorMB_IconError);。 Exit;。 end;。 msg:='导出完成...';。 Application.MessageBox(PChar(msg),PChar(Application.Title),。 MB_OKorMB_IconInformation);。 end;。 procedureTFormItemList.miPrintClick(Sender:TObject);。 begin。 //打印。 Self.dxComponentPrinter.Preview(True,Self.dxComponentPrinterLink1);。 end;。 procedureTFormItemList.cxGridPopupMenuPopup(ASenderMenu:TComponent;。 AHitTest:TcxCustomGridHitTest;X,Y:Integer;varAllowPopup:Boolean);。 begin。 ifGetHitTypeByHitCode(AHitTest.HitTestCode)=gvhtColumnHeaderthen//右击列标题时。 begin。 //iftvResult.DataController.Groups.GroupingItemCount0then。 iftvResult.GroupedColumnCount0then//有分组时显示。 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;。 procedureTFormItemList.miFilterBuilderClick(Sender:TObject);。 begin。 //过滤管理器。 //弹出FilterBuilderDialog对话框。 tvResult.Filtering.RunCustomizeDialog;。 end;。 procedureTFormItemList.miCustomFilterClick(Sender:TObject);。 var。 AHitTest:TcxCustomGridHitTest;。 begin。 //自定义过滤。 //弹出CustomFilterDialog对话框。 AHitTest:=cxGridPopupMenu.HitTest;。 ifGetHitTypeByHitCode(AHitTest.HitTestCode)=gvhtColumnHeaderthen//获得右击的列。 tvResult.Filtering.RunCustomizeDialog(TcxGridColumnHeaderHitTest(AHitTest).Column);。 end;。 procedureTFormItemList.miFilterPanelClick(Sender:TObject);。 var。 mi:TMenuItem;。 begin。 //隐藏/显示过滤面板。 mi:=TMenuItem(Sender);。 mi.Checked:=True;。 ifmi.Name='miFilterPanelAlways'then。 tvResult.Filtering.Visible:=fvAlways。 elseifmi.Name='miFilterPanelNerver'then。 tvResult.Filtering.Visible:=fvNever。 else。 tvResult.Filtering.Visible:=fvNonEmpty;。 end;。 procedureTFormItemList.miExpandAllGroupClick(Sender:TObject);。 begin。 //展开所有组。 tvResult.DataController.Groups.FullExpand;。 end;。 procedureTFormItemList.miCollapseAllGroupClick(Sender:TObject);。 begin。 //收缩所有组。 tvResult.DataController.Groups.FullCollapse;。 end;。 此楼回复Re:。 --------------------------------------------------------------------------------。 在用,留名。 此楼回复Re:。 --------------------------------------------------------------------------------。 技巧三按条件计算合计值。 在Footer的第一列显示[合计:]。 加一个Summary项,Column设为Grid的第一列,Kind设为skNone。 在该Summary项的OnGetText事件中,输入:。 procedureTFormExpense.tvExpenseTcxGridDBDataControllerTcxDataSummaryFooterSummaryItems2GetText(。 Sender:TcxDataSummaryItem;constAValue:Variant;AIsFooter:Boolean;。 varAText:String);。 begin。 AText:='合计:';。 end;。 按条件汇总:。 在TableView的DataController-Summary-FooterSummary-OnSummary事件中,输入:。 procedureTFormExpense.tvExpenseDataControllerSummaryFooterSummaryItemsSummary(。 ASender:TcxDataSummaryItems;Arguments:TcxSummaryEventArguments;。 varOutArguments: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;//Level1的统计值设为0。 end;。 此楼回复Re:。 --------------------------------------------------------------------------------。 借贵地一用,问个CXGrid问题,在cxgrid中如何使一些行不能编辑,如:字段isenable=false的行。 此楼回复Re:。 --------------------------------------------------------------------------------。 楼上的问题。 请参考下面的技巧。 技巧四:根据某列的值设定*列的可编辑性。 procedureTFormUser.tvUserEditing(Sender:TcxCustomGridTableView;。 AItem:TcxCustomGridTableItem;varAAllow:Boolean);。 begin。 //如果第三列值为True,则第4列不能修改。 if(tvUser.Controller.FocusedRecord.Values[2]=True)and(AItem.Index=4)then。 AAllow:=False。 else。 AAllow:=True;。 end;。 此楼回复Re:。 --------------------------------------------------------------------------------。 技巧五:保存/恢复Grid布局。 //恢复布局。 IniFileName:=ExtractFilePath(Application.ExeName)+'Layout/'+Self.Name+'.ini';。 ifFileExists(IniFileName)then。 Self.tvResult.RestoreFromIniFile(IniFileName)//从布局文件中恢复。 else。 begin。 Self.tvResult.BeginUpdate;。 fori:=0toSelf.tvResult.ItemCount-1do。 Self.tvResult.Items[i].ApplyBestFit;//调整为最佳宽度。 Self.tvResult.EndUpdate;。 end;。 //保存布局。 IniFileName:=ExtractFilePath(Application.ExeName)+'Layout/'+Self.Name+'.ini';。 ifnotDirectoryExists(ExtractFileDir(IniFileName))then。 CreateDir(ExtractFileDir(IniFileName));。 Self.tvResult.StoreToIniFile(IniFileName);//保存为布局文件。 此楼回复Re:。 --------------------------------------------------------------------------------。 借用地问一下:在cxgrid中,如果我同时选中主表与子表中的记录,怎么样能同时进行对其所选记录进行处理呢。 我现在只能判断焦点是在主表还是从表中,然后只能对主表或子表中的数据进行处理。 此楼回复Re:。 --------------------------------------------------------------------------------。 看来用cxGrid人不多啊。 再多贴一些技巧,需要的朋友顶一下。 ==========================================================================。 在主从TableView中根据主TableView得到对应的从TableView。 var。 ADetailDC:TcxGridDataController;。 AView:TcxCustomGridTableView;。 begin。 withcxGrid1DBTableView1.DataControllerdo。 ADetailDC:=TcxGridDataController(GetDetailDataController(FocusedRecordIndex,0));。 AView:=ADetailDC.GridView;。 end;。 ==============================================================================。 定位在第一行并显示内置编辑器。 cxDBVerticalGrid1.FocusedRow:=cxDBVerticalGrid1.Rows[0];。 cxDBVerticalGrid1.ShowEdit;。 ==============================================================================。 隐藏"Nodatatodisplay"字符串。 该文本存储在scxGridNoDataInfoText资源字符串,可以将该资源字符串的内容设为空。 来隐藏该文本。 usescxClasses,cxGridStrs;。 ...。 cxSetResourceString(@scxGridNoDataInfoText,'');。 //如果"Nodatatodisplay"字符串已经显示,需要调用:。 View.LayoutChanged;。 ============================================================。 删除应用过滤后的行。 var。 I:Integer;。 begin。 withGridViewdo。 forI:=0toViewData.RecordCount-1do。 begin。 ViewData.Records[0].Focused:=True;。 DataController.DataSet.Delete;。 end;。 =============================================================。 根据单元的值设置样式。 procedureaForm.aColumnStylesGetContentStyle(。 Sender:TcxCustomGridTableView;ARecord:TcxCustomGridRecord;。 AItem:TcxCustomGridTableItem;outAStyle:TcxStyle);。 begin。 ifARecord.Values[AItem.Index]=aSomeValuethen。 AStyle:=aSomeStyle;。 end;。 procedureaForm.aViewStylesGetContentStyle(。 Sender:TcxCustomGridTableView;ARecord:TcxCustomGridRecord;。 AItem:TcxCustomGridTableItem;outAStyle:TcxStyle);。 var。 AColumn:TcxCustomGridTableItem;。 begin。 AColumn:=(SenderasTcxGridDBTableView).GetColumnByFieldName('Email');。 ifVarToStr(ARecord.Values[AColumn.Index])=''then。 AStyle:=cxStyleNullEmail;。 end;。 ==============================================================================。 TcxCustomGridTableView.FindItemByName,TcxGridDBTableView.GetColumnByFieldNameor。 TcxGridDBDataController.GetItemByFieldName。 withcxGrid1DBBandedTableView1.DataControllerdo。 AValue:=Values[FocusedRecordIndex,GetItemByFieldName('SomeFieldName').Index];。 ===================================================================。 动态生成BandedView。 var。 AView:TcxCustomGridView;。 begin。 AView:=cxGrid.CreateView(TcxGridDBBandedTableView);。 TcxGridDBBandedTableView(AView).DataController.DataSource:=DataSource;。 TcxGridDBBandedTableView(AView).Bands.Add;。 withTcxGridDBBandedTableView(AView).Bands.Adddo。 begin。 Visible:=False;。 FixedKind:=fkLeft;。 end;。 TcxGridDBBandedTableView(AView).DataController.CreateAllItems;。 cxGridLevel.GridView:=AView;。 此楼回复Re:。 --------------------------------------------------------------------------------。 ======================================================================。 当底层数据集为空时显示一条空记录。 procedureForm.cxGridEnter(Sender:TObject);。 var。 View:TcxGridDBTableView;。 begin。 View:=TcxGridDBTableView((SenderasTcxGrid).FocusedView);。 ifView.DataController.DataSet.IsEmptythen。 begin。 View.DataController.DataSet.Append;。 View.Controller.EditingController.ShowEdit;。 end;。 end;。 =======================================================================。 在当前View*记录。 使用FocusedView属性得到当前焦点View,用View.DataController得到对应的DataController,。 之后使用DataController的方法来操作数据:。 -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得到底层数据集后,再用数据集的。 方法来操作数据。 本文地址:2010-关于cxgrid使用的方法收藏
相关文章推荐
- 关于cxgrid使用的方法收藏
- cxgrid使用的方法 -2010-1
- 关于ExpressQuantumGrid4的cxGrid的一些使用方法
- 关于for each循环不能直接使用集合的remove方法的原因
- 关于存储过程中一个参数表示多个查询条件使用方法的简单处理
- 关于notification的使用,setLatestEventInfo方法在新SDK不能使用的解决方法
- 【OpenCV】关于 waitKey()的使用方法
- 关于linux中使用vim打开文件出现^M的解决方法
- Android关于PagerAdapter的使用方法的总结
- 关于ubuntu在使用apt-get update时Hash Sum mismatch的解决方法
- 【收藏】.net中arraylist使用方法
- 一滴水:关于Java容器类库概念及Map.put();方法的使用
- 关于Oracle 的LPAD和RPAD函数的使用方法
- 一个关于WCF调用远程链接返回405错误不允许使用此方法的问题
- iOS 关于UICollectionView选中状态,当使用reloadData方法时出现数据的问题?
- 关于使用Spring声明式事务时,在类的内部方法互相调用时,Spring无法拦截内部方法调用,导致事务不起作用的问题研究
- 关于传统的软件开发方法在实际软件开发过程中的使用情况
- 关于使用badboy录制jmeter时报脚本错误的解决方法
- 关于在使用rowid和rownum时遇到ORA-01446错误的原因即解决方法。
- Linux平台下关于GCC编译及使用的方法