【问题标题】:Delphi code to create TcxGrid GroupSummaries at runtimeDelphi 代码在运行时创建 TcxGrid GroupSummaries
【发布时间】:2014-10-23 03:04:53
【问题描述】:

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

带有消息“记录索引超出范围”的 EcxInvalidDataControllerOperation

当网格渲染时。

此代码接受任何 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;

我错过了什么?谢谢。

【问题讨论】:

  • 哪一行产生了异常?
  • 我的代码中没有发生这种情况。它在 cxGrid 运行时中,在 TcxCustomDataController.CheckRecordRange 上。
  • 然后查看堆栈跟踪,找出在您的代码中触发异常的位置。如果异常确实无法追溯到您自己的代码,那么您需要向供应商提交错误报告。
  • 感谢您的回复,肯。正如我在最初的问题中所说,在渲染网格时会发生错误。这是在我的代码在网格上设置属性之后(没有错误)。我希望通过提供适用于任何 TcxGrid 的完整通用代码,我可以获得关于可能缺少网格的哪些属性的特定指针,而不是关于如何在 Delphi 中调试问题的一般建议。
  • 嗯。好的,但这似乎又是应该在供应商论坛上提出的问题(这不是 Developers Express 组件吗?)而不是在这里。如果没有使用该组件的代码,很难调试第三方供应商的组件,除非您非常熟悉该组件的内部工作原理。您能否提供一个在运行时设置产生错误的属性的 MVCE?或者包含来自 DFM 的文本,该文本将属性设置为您拥有的属性?

标签: delphi tcxgrid


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 2010-11-03
    • 2013-02-21
    • 2010-12-30
    • 1970-01-01
    • 2019-05-09
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多