• cxgrid使用体会


    1.去掉cxgrid或dxdbgrid的分组标题行
    设置TableView中的optionview中的GroupByBox为False

    2.设置排序字段
    打开TableView中,看到右边的字段,单击要分组的字段名,设置其GroupIndex为0,1等(默认值-1不分组)

    3.自动过滤设置与禁止
    设置TableView中的OptionsCustomize中的ColumnFiltering为True时自动过滤,False为禁止过滤

    CxGrid使用小结(续) 
     ======================================================================== 
      
      激活内置编辑控件 
      
        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; 
      
      =========================================================================== 
      
      保存修改到数据库 
      
      procedure   <aForm>.FormClose(Sender:   TObject;   var   Action:   TCloseAction); 
      begin 
          if   (<aGrid>.FocusedView   <>   nil)   and   (<aGrid>.FocusedView.DataController.EditState   <>   [])   then 
              <aGrid>.FocusedView.DataController.Post; 
      end; 
      
      ============================================================================ 
      
      设置内置右键菜单 
      
      内置右键菜单包括二个菜单:cxGridStdHeaderMenu,   TcxGridStdFooterMenu 
      
      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; 
      
      =========================================================================== 
      
      得到选中记录的值 
      
      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; 
      
      ============================================================= 
      
      在GridMode禁用内置的右键Footer菜单 
      
      uses   cxGridStdPopupMenu; 
      
      procedure   cxGridPopupMenuOnPopup(...) 
      begin 
          if   (ASenderMenu   is   TcxGridStdFooterMenu)   and 
                  <GridView>.DataController.DataModeController.GridMode   then 
              AllowPopup   :=   False; 
      end; 
      
      ============================================================== 
      
      主从表任何时候只能展开一个组 
      
      procedure   TForm1.ADetailDataControllerCollapsing( 
          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; 
      
      ================================================================= 
      
      动态创建层次(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;   
     


    此楼回复Re: 
    --------------------------------------------------------------------------------

    ====================================================================== 
      
      获得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; 
      
      =========================================================================== 
      
      访问过滤之后的记录 
      
      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; 
      
      ============================================================================ 
      
      获得单元的Font 
      
      cxGrid1DBTableView1.ViewInfo.RecordsViewInfo.Items[1].GetCellViewInfoByItem( 
          cxGrid1DBTableView1Company).EditViewInfo.Font; 
      
      ============================================================================ 
      
      根据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; 
      
      ============================================================================ 
      
      指定Filter   Builder打开/保存过滤文件的默认路径 
      
      uses 
          ...,   cxFilterControlDialog; 
      
      procedure   TForm.GridView1FilterControlDialogShow( 
          Sender:   TObject); 
      begin 
          TfmFilterControlDialog(Sender).OpenDialog.InitialDir   :=   'D:\' 
      end;   
      
      ============================================================================ 
      
      保存/恢复带汇总行的布局 
      
      <TableView>.StoreToIniFile('c:\Grid.ini',   True,   [gsoUseSummary]);   
      <GridView>.RestoreFromIniFile(<inifilename>,True,False   {or   True,   optional},[gsoUseSummary]); 
      
      ============================================================================ 
      
      取消过滤时移到第一行 
      
      uses 
          cxCustomData; 
      
      procedure   TYour_Form.AViewDataControllerFilterChanged(Sender:   TObject); 
      var 
          Filter:   TcxDataFilterCriteria; 
      begin 
          with   Sender   as   TcxDataFilterCriteria   do 
              if   IsEmpty   then 
                  DataController.FocusedRowIndex   :=   0; 
      end; 
      
      ============================================================================= 
      
      排序后移到第一行 
      
      可以设置DataController.Options.FocusTopRowAfterSorting   :=   True,也可以使用如下的代码: 
      
      uses 
          cxCustomData; 
      
      procedure   TYour_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 
      对于Bound   View可以使用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; 
              procedure   Timer1Timer(Sender:   TObject); 
              procedure   dxMemData1AfterPost(DataSet:   TDataSet); 
              procedure   CheckBox1Click(Sender:   TObject); 
          private 
              procedure   CMSetFocusedRecord(var   Msg:   TMessage);   message   CM_SETFOCUSEDRECORD; 
          public 
              {   Public   declarations   } 
          end; 
      
      var 
          Form1:   TForm1; 
          FocusedIdx:   Integer; 
      
      
      implementation 
      
      {$R   *.dfm} 
      
      procedure   TForm1.Timer1Timer(Sender:   TObject); 
      begin 
          dxMemData1.AppendRecord(['',   IntToStr(Random(1000)),   Random(1000)]); 
      end; 
      
      procedure   TForm1.dxMemData1AfterPost(DataSet:   TDataSet); 
      begin 
          PostMessage(Handle,   CM_SETFOCUSEDRECORD,   Integer(cxGrid1DBTableView1),   MakeLParam(cxGrid1DBTableView1.Controller.FocusedRowIndex,   cxGrid1DBTableView1.Controller.TopRowIndex)); 
      end; 
      
      procedure   TForm1.CMSetFocusedRecord(var   Msg:   TMessage); 
      begin 
          TcxGridDBTableView(msg.WParam).Controller.FocusedRowIndex   :=   Msg.LParamLo; 
          TcxGridDBTableView(msg.WParam).Controller.TopRowIndex   :=   Msg.LParamHi; 
      end; 
      
      procedure   TForm1.CheckBox1Click(Sender:   TObject); 
      begin 
          Timer1.Enabled   :=   TCheckBox(Sender).Checked; 
      end; 
      
      end. 
      
      ================================================================================= 
      
      删除记录并获得焦点 
      
      procedure   TForm1.BtnDeleteClick(Sender:   TObject); 
      var 
          FocusedRow,   TopRow:   Integer; 
          View:   TcxGridTableView; 
          DataController:   TcxGridDataController; 
      begin 
          View   :=   cxGrid1.FocusedView   as   TcxGridTableView; 
          DataController   :=   View.DataController; 
      
          //   Remember   the   top   row   (the   vertical   scrollbar   position) 
          TopRow   :=   View.Controller.TopRowIndex; 
          //   Remember   the   focused   row(!)   index 
          FocusedRow   :=   DataController.FocusedRowIndex; 
      
          DataController.DeleteFocused; 
      
          //   After   deletion   the   same   row   must   be   focused, 
          //   although   it   will   correspond   to   a   different   data   record 
          DataController.FocusedRowIndex   :=   FocusedRow; 
          //   Restore   the   top   row 
          View.Controller.TopRowIndex   :=   TopRow; 
      end; 

    //=======================================================================================
    数据库中的财务表为: 
          ID     收支类型     金额     其它属性 
      
      其中收支类型只有两种值:0   表示收入,1   表示支出   ;金额都是正数。 
      
      设置cxGrid的Footer   可以使得在显示时,列表的下方出现汇总行:“金额”的和 
      同样设置Default   For   Groups可以使得在用户拖动表头属性实现分组时,显示组内的汇总行:“金额”的和。 
      
      上面说的,用过cxGrid应该都会,下面就有这么一个问题 
      
      如果我想使汇总行的值变为如下的值应该怎样实现: 
                    收支类型为0的金额的和   -   收支类型为1的金额的和 
      实现Footer的功能好办,因为它的值不会变,自己用循环写一个就完了,但是Default   For   Groups的功能就不好说了,因为它的值是根据用户拖动的属性计算的,而且还有可能是多层分组,想不出来了,所有到这来问 
      是不是要设置什么属性?或者cxGrid根本就没这个功能,那该用什么方法解决?希望哪位帮我解决,谢谢了先! 

    给你一个例子,可能对你有帮助, 
        with   tvOrders.DataController.Summary   do 
      
          begin 
              BeginUpdate; 
              try 
                  SummaryGroups.Clear; 
                  //The   first   summary   group 
                  with   SummaryGroups.Add   do 
                  begin 
                      //Add   proposed   grouping   column(s) 
                      TcxGridTableSummaryGroupItemLink(Links.Add).Column   :=   tvOrdersCustomerID; 
                      //Add   summary   items 
                      with   SummaryItems.Add   as   TcxGridDBTableSummaryItem   do 
                      begin 
                          Column   :=   tvOrdersPaymentAmount; 
                          Kind   :=   skSum; 
                          Format   :=   'Amount   Paid:   $,0'; 
                      end; 
      
                      with   SummaryItems.Add   as   TcxGridDBTableSummaryItem   do 
                      begin 
                          Column   :=   tvOrdersPaymentAmount; 
                          Kind   :=   skCount; 
                          Format   :=   'Records:   0'; 
                      end; 
      
                  end; 
      
                  //The   second   summary   group 
                  with   SummaryGroups.Add   do 
                  begin 
                      //Add   proposed   grouping   column(s) 
                      TcxGridTableSummaryGroupItemLink(Links.Add).Column   :=   tvOrdersProductID; 
                      //Add   summary   items 
                      with   SummaryItems.Add   as   TcxGridDBTableSummaryItem   do 
                      begin 
                          Column   :=   tvOrdersQuantity; 
                          Kind   :=   skSum; 
                          Position   :=   spFooter; 
                          Format   :=   'TOTAL   =   0'; 
                      end; 
      
                      with   SummaryItems.Add   as   TcxGridDBTableSummaryItem   do 
                      begin 
                          Column   :=   tvOrdersPurchaseDate; 
                          Kind   :=   skMin; 
                          Position   :=   spFooter; 
                      end; 
                  end; 
      
              finally 
                  EndUpdate; 
              end; 
          end;  

  • 相关阅读:
    C语言博客作业-字符数组
    C语言博客作业--一二维数组
    个人作业5
    个人作业4
    个人作业3
    201521123072 结对编程
    软件工程 个人阅读作业2
    软件工程 个人阅读作业
    java课程设计--WeTalk(201521123072秦贞一)
    201521123072《java程序设计》第十四周学习总结
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2035727.html
Copyright © 2020-2023  润新知