1. 程式人生 > >Delphi CxGrid 匯總(3)

Delphi CxGrid 匯總(3)

evel 文件 ews some edr apt .post book con


解決:
<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

[delphi] view plaincopy
uses   cxGridStdPopupMenu;    
     
procedure   TForm1.cxGridPopupMenu1Popup(ASenderMenu:   TComponent;    
      AHitTest:   TcxCustomGridHitTest;   X,   Y:   Integer;   var   AllowPopup:   Boolean);    
begin    
      if   ASenderMenu   is   TcxGridStdHeaderMenu   then
TcxGridStdHeaderMenu(ASenderMenu).OnPopup := StdHeaderMenuPopup; end; procedure TForm1.StdHeaderMenuPopup(Sender: TObject); var I: Integer; begin with TcxGridStdHeaderMenu(Sender).Items do for I := 0 to Count - 1
do if Items[I].Caption = Group By Box then begin Items[I].Enabled := False; System.Break; end end;

****************************************************************************
41 得到選中記錄的值
解決:

[delphi] view plaincopy
  1. 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 主從表任何時候只能展開一個組
解決:

[delphi] view plaincopy
  1. 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合計行對應的記錄
解決:

[delphi] view plaincopy
  1. 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對象
解決:

[delphi] view plaincopy
  1. 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)