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

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