2010-关于cxgrid使用的方法收藏

  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使用的方法收藏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章