Delphi CxGrid 汇总

Posted westsoft

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi CxGrid 汇总相关的知识,希望对你有一定的参考价值。

列  
解决:
      <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 汇总的主要内容,如果未能解决你的问题,请参考以下文章

Delphi cxGrid使用汇总

Delphi CxGrid 汇总

Delphi cxGrid表对行的操作

delphi使用cxGrid

求delphi 高手救命...cxgrid 问题

delphi cxgrid 列内容 中心对齐如何实现