Delphi CxGrid 匯總(3)
列
解決:
<aColumn>.GroupIndex := -1;
<aColumn>.Visible := True;
****************************************************************************
39 保存修改到數據庫
解決:
procedure <aForm>.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if (<aGrid>.FocusedView <> nil)
and (<aGrid>.FocusedView.DataController.EditState <> []) then
<aGrid>.FocusedView.DataController.Post;
end;
****************************************************************************
40 設置內置右鍵菜單
解決:
內置右鍵菜單包括二個菜單:cxGridStdHeaderMenu, TcxGridStdFooterMenu
uses cxGridStdPopupMenu; procedure TForm1.cxGridPopupMenu1Popup(ASenderMenu: TComponent; AHitTest: TcxCustomGridHitTest; X, Y: Integer; var AllowPopup: Boolean); begin if ASenderMenu is TcxGridStdHeaderMenu thenTcxGridStdHeaderMenu(ASenderMenu).OnPopup := StdHeaderMenuPopup; end; procedure TForm1.StdHeaderMenuPopup(Sender: TObject); var I: Integer; begin with TcxGridStdHeaderMenu(Sender).Items do for I := 0 to Count - 1do if Items[I].Caption = ‘Group By Box‘ then begin Items[I].Enabled := False; System.Break; end end;
****************************************************************************
41 得到選中記錄的值
解決:
-
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); if ADataSet.BookmarkValid(TBookmark(Bkm)) then begin ADataSet.Bookmark := TBookmark(Bkm); OutputVal := ADataSet.FieldByName(AFieldName).Value; end; View.BeginUpdate; View.DataController.BeginLocate; try // make changes here… finally View.DataController.EndLocate; View.EndUpdate; end; **********************************************
42 在GridMode禁用內置的右鍵Footer菜單
解決:
uses cxGridStdPopupMenu;
procedure cxGridPopupMenuOnPopup(...)
begin
if (ASenderMenu is TcxGridStdFooterMenu) and
<GridView>.DataController.DataModeController.GridMode then
AllowPopup := False;
end;
****************************************************************************
43 主從表任何時候只能展開一個組
解決:
-
procedure TForm1.ADetailDataControllerCollapsin( ADataController: TcxCustomDataController; ARecordIndex: Integer; var AAllow: Boolean); var I: Integer; C: Integer; begin AAllow := False; C := 0; for I := 0 to ADataController.RecordCount - 1 do begin if ADataController.GetDetailExpanding(I) then Inc(C); if C > 1 then AAllow := True; end; end; procedure TForm1.ADetailDataControllerExpanding( ADataController: TcxCustomDataController; ARecordIndex: Integer; var AAllow: Boolean); begin ADataController.CollapseDetails; end; procedure TForm1.FormCreate(Sender: TObject); begin cxGrid1DBTableView1.DataController.OnDetailExpanding:=ADetailDataControllerExpanding; cxGrid1DBTableView1.DataController.OnDetailCollapsing:=ADetailDataControllerCollapsing; end; **************************************************************************** 44 動態創建層次(Level)和視圖(View) 解決: var Grid: TcxGrid; Level: TcxGridLevel; View: TcxGridDBTableView; begin // Creates a Grid instance Grid := TcxGrid.Create(SomeOwner); Grid.Parent := SomeParent; // Creates a Level Level := Grid.Levels.Add; Level.Name := ‘SomeLevelName‘; // Creates a View View := Grid.CreateView(TcxGridDBTableView) as TcxGridDBTableView; View.Name := ‘SomeViewName‘; // … and binds it to the Level Level.GridView := View; // Hooks up the View to the data View.DataController.DataSource := SomeDataSource; // … and creates all columns View.DataController.CreateAllItems; end;
****************************************************************************
45 獲得Group Footer合計行對應的記錄
解決:
-
procedure TForm1.cxGrid1DBTableView1CustomDrawFooterCell( Sender: TcxGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean); var ALevel, ADataGroupIndex: Integer; AGridRecord, AGroupRecord: TcxCustomGridRecord; begin if AViewInfo is TcxGridRowFooterCellViewInfo and // Row footer (TcxGridDBColumn(AViewInfo.Column).DataBinding.FieldName = ‘Area‘) then // Area column begin AGridRecord:= TcxGridRowFooterCellViewInfo(AViewInfo).GridRecord; ALevel:= TcxGridRowFooterCellViewInfo(AViewInfo).Container.GroupLevel; ADataGroupIndex:=Sender.DataController.Groups.DataGroupIndexByRowIndex[AGridRecord.Index]; if ADataGroupIndex <> -1 then begin AGroupRecord := AGridRecord; while AGroupRecord.Level <> ALevel do AGroupRecord := AGroupRecord.ParentRecord; AViewInfo.Text := AGroupRecord.DisplayTexts[0]; end; end; end; **************************************
46 訪問過濾之後的記錄
解決:
var
I: Integer;
begin
Memo1.Lines.Clear;
with cxGrid1DBTableView1.DataController do
for I := 0 to FilteredRecordCount - 1 do
Memo1.Lines.Add(DisplayTexts[FilteredRecordIndex[I], 0]);
end;
****************************************************************************
47 獲得單元的Font
解決:
cxGrid1DBTableView1.ViewInfo.RecordsViewInfo.Items[1].GetCellViewInfoByItem(
cxGrid1DBTableView1Company).EditViewInfo.Font;
****************************************************************************
48 根據Level名稱找到Level對象
解決:
-
function GetLevelByName(AGrid: TcxGrid; ALevelName: string): TcxGridLevel; function LoopThroughLevels(ALevel: TcxGridLevel; ALevelName: string): TcxGridLevel; var I: Integer; begin Result := nil; for I := 0 to ALevel.Count - 1 do begin if ALevel[I].Name = ALevelName then begin Result := ALevel[I]; Exit; end; if ALevel[I].Count > 0 then begin Result := LoopThroughLevels(ALevel[I], ALevelName); if Result <> nil then Exit; end; end; end; var I: Integer; begin Result := nil; for I := 0 to AGrid.Levels.Count - 1 do begin if AGrid.Levels[I].Name = ALevelName then begin Result := AGrid.Levels[I]; Exit; end; if AGrid.Levels[I].Count > 0 then begin Result := LoopThroughLevels(AGrid.Levels[I], ALevelName); if Result <> nil then Exit; end; end; end;
****************************************************************************
49 指定Filter Builder打開/保存過濾文件的默認路徑
解決:
uses
..., cxFilterControlDialog;
procedure TForm.GridView1FilterControlDialogShow(
Sender: TObject);
begin
TfmFilterControlDialog(Sender).OpenDialog.InitialDir := ‘D:/‘
end;
Delphi CxGrid 匯總(3)