Delphi代码在运行时创建TcxGrid GroupSummaries

时间:2014-10-03 23:14:18

标签: delphi tcxgrid

我有代码在运行时为数字列创建摘要页脚,但我无法显示组摘要结果。我查看了How to create group summaries at runtimeHow to set group summary values以及How can create summary footer on runtime?,但我遇到了运行时错误:

  

EcxInvalidDataControllerOperation,消息'RecordIndex超出范围'

网格渲染时。

此代码接受任何TcxGridDBTableView,因此很容易将其放入现有的Delphi表单中。

procedure SummaryGroup(ASummary: TcxDataSummary; AColumn: TcxGridDBColumn;
  AKind: TcxSummaryKind; AFormat: string);
var
  sumGroup: TcxDataSummaryGroup;
  link: TcxGridTableSummaryGroupItemLink; //TcxDataSummaryGroupItemLink;
  item: TcxGridDBTableSummaryItem;
begin
  AColumn.Summary.FooterKind := AKind;
  AColumn.Summary.FooterFormat := AFormat;
  sumGroup := ASummary.SummaryGroups.Add;
  link := sumGroup.Links.Add as TcxGridTableSummaryGroupItemLink;
  link.Column := AColumn;
  item := sumGroup.SummaryItems.Add as TcxGridDBTableSummaryItem;
  item.Column := AColumn;
  item.Kind := AKind;
  item.Position := spGroup;
  item.Format := AColumn.Summary.FooterFormat;
end;

procedure AutoAwesum(AView: TcxGridDBTableView);
var
  summary: TcxDataSummary;
  summing: Boolean;
  i: Integer;
  dc: TcxGridDBDataController;
  col: TcxGridDBColumn;

begin
  dc := AView.DataController;
  summing := False;
  summary := dc.Summary;
  summary.BeginUpdate;
  try
    summary.SummaryGroups.Clear;
    dc.BeginFullUpdate;
    try
      dc.GridView.ClearItems;
      dc.CreateAllItems;
      for i := 1 to AView.ColumnCount - 1 do
      begin
        col := AView.Columns[i];
        case col.DataBinding.Field.DataType of
          ftSmallint, ftInteger, ftWord, ftLargeint, ftAutoInc,
          ftLongWord, ftShortint:
            begin
              summing := true;
              SummaryGroup(summary, col, skSum, '#');
            end;
          ftFloat, ftBCD, ftFMTBcd, ftExtended, ftSingle:
            begin
              summing := true;
              SummaryGroup(summary, col, skSum, '#.##');
            end;
          ftCurrency:
            begin
              summing := true;
              SummaryGroup(summary, col, skSum, '$#.##');
            end;
        end;
      end;
      dc.DataModeController.GridMode := not summing;
      AView.OptionsView.Footer := summing;
      AView.OptionsView.GroupFooterMultiSummaries := summing;
      AView.OptionsView.GroupFooters := gfVisibleWhenExpanded;
    finally
      dc.EndFullUpdate;
    end;
  finally
    summary.EndUpdate;
  end;
end;

我错过了什么?感谢。

1 个答案:

答案 0 :(得分:1)

终于有机会回到这一点。正如预期的那样,变化很少而且很简单。这是一般为网格中的每个数字列创建组摘要标题的代码。我在你可能想要使用的代码中留下了一些注释选项。

uses
  cxGridDBDataDefinitions;

procedure Summarize(ASummary: TcxDataSummary; AColumn: TcxGridDBColumn;
  AKind: TcxSummaryKind; AFormat: string);
var
  sumGroup: TcxDataSummaryGroup;
  link: TcxGridTableSummaryGroupItemLink;
  item: TcxGridDBTableSummaryItem;
begin
  AColumn.Summary.FooterKind := AKind;
  AColumn.Summary.FooterFormat := AFormat;
  AColumn.Summary.GroupKind := AKind;
  AColumn.Summary.GroupFormat := AFormat;
  AColumn.GroupIndex := -1;
  sumGroup := ASummary.SummaryGroups.Add;
  link := sumGroup.Links.Add as TcxGridTableSummaryGroupItemLink;
  link.Column :=  AColumn;
  item := sumGroup.SummaryItems.Add as TcxGridDBTableSummaryItem;
  item.Column := AColumn;
  item.Kind := skSum;
  item.Position := spGroup;
  item.Format := AColumn.Summary.FooterFormat;
end;

procedure AutoAwesum(AView: TcxGridDBTableView);
var
  summary: TcxDataSummary;
  summing: Boolean;
  i: Integer;
  dc: TcxGridDBDataController;
  col: TcxGridDBColumn;

begin
  dc := AView.DataController;
  summing := False;
  summary := dc.Summary;
  summary.BeginUpdate;
  try
    summary.SummaryGroups.Clear;
    dc.BeginFullUpdate;
    try
      dc.GridView.ClearItems;
      dc.CreateAllItems;
      for i := 1 to AView.ColumnCount - 1 do
      begin
        col := AView.Columns[i];
        case col.DataBinding.Field.DataType of
          ftSmallint, ftInteger, ftWord, ftLargeint, ftAutoInc,
          ftLongWord, ftShortint:
            begin
              summing := true;
              Summarize(summary, col, skSum, ',0');
            end;
          ftFloat, ftBCD, ftFMTBcd, ftExtended, ftSingle:
            begin
              summing := true;
              Summarize(summary, col, skSum, ',.00');
            end;
          ftCurrency:
            begin
              summing := true;
              Summarize(summary, col, skSum, '$,0.00');
            end;
        end;
      end;
//      dc.DataModeController.GridMode := not summing;
//      AView.OptionsView.Header := summing;
      AView.OptionsView.Footer := summing;
//      AView.OptionsView.GroupFooterMultiSummaries := summing;
//      AView.OptionsView.GroupFooters := gfVisibleWhenExpanded;
    finally
      dc.EndFullUpdate;
    end;
  finally
    summary.EndUpdate;
  end;
end;