【问题标题】:cxGrid - Footer summary of checked recordscxGrid - 检查记录的页脚摘要
【发布时间】:2017-05-17 14:55:29
【问题描述】:

在 cxGrid 中,我有一个布尔列(属性:复选框)。 如何对此类列进行页脚摘要 (SUM),即汇总检查的记录数。

现在,如果我将其设置为 SUM,我的页脚摘要会为检查的项目显示负数。如何避免这些负数?

编辑: 我在他们的网站上找到了一个解决方案:

procedure TForm1.cxGrid1DBTableView1DataControllerSummaryFooterSummaryItemsSummary(
  ASender: TcxDataSummaryItems; Arguments: TcxSummaryEventArguments;
  var OutArguments: TcxSummaryEventOutArguments);
var
  si: TcxGridDBTableSummaryItem;
begin
  si := Arguments.SummaryItem as TcxGridDBTableSummaryItem;
  if si.Column = cxGrid1DBTableView1Sonda then
    OutArguments.Done := not OutArguments.Value;
end;

但是我得到了错误: 无法将类型 (Null) 的变体转换为类型 (Boolean)。

不明白这个。字段为布尔类型(位)。

编辑2:

问题是sql server默认设置布尔类型为NULL。 这就是转换错误的原因。

【问题讨论】:

  • 我会问here
  • DevExpress 总是广泛更新他们的产品,并且他们的支持得到了很大的改善。您链接的那个问题已有 7 年历史,并且是从他们的旧支持系统迁移而来的。你应该自己再问一遍。
  • 关于您的编辑:我想您必须决定是否要将 Nulls 视为已检查,并相应地使用 VarIsNull
  • 好的,那么我会尝试以这种方式处理它——可能使用VarIsNull,如上所述。 :-)

标签: delphi tcxgrid


【解决方案1】:

您也可以将网格设置为使用不同的字段来计算该摘要,例如,您可以在其中指定每次要添加的确切值的计算字段。

  • 将计算字段添加到您的数据集,并具有所需的值。 MyHiddenField.Value := -1 * YourCheckingField.AsInteger;

  • 转到 CxGrid 对话框上的摘要选项卡,然后添加一个新的摘要:

    1. 将 Column 属性设置为您希望它出现的网格列
    2. 将 FieldName 设置为您的计算字段
    3. 最后将 Kind 设置为 skSum

【讨论】:

  • 非常优雅的解决方案,+1
【解决方案2】:

最好将此类问题发送给 DevExpress 支持团队。 您可以自定义页脚:

  • 将 Kind=skNone 分配给页脚摘要项
  • 使用 OnGetText 事件显示您想要的内容

快速示例(将所有记录中的字符数显示为页脚值):

procedure TForm54.cxGrid1DBTableView1TcxGridDBDataControllerTcxDataSummaryFooterSummaryItems0GetText(
  Sender: TcxDataSummaryItem; const AValue: Variant; AIsFooter: Boolean;
  var AText: string);
var i,j: integer;
begin
  j := 0;
  for i := 0 to cxGrid1DBTableView1.DataController.RecordCount-1 do
    j := j + Length(String(cxGrid1DBTableView1.DataController.Values[i, cxGrid1DBTableView1c.Index]));
  AText := IntToStr(j);
end;

【讨论】:

    【解决方案3】:

    我认为您可以在 SQL 组件中解决该问题。使用类型转换,您的 cxGrid 将使用整数值。

    SELECT CAS(Bit_Column AS int) AS Int_Column
    FROM YourTable
    

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      procedure TForm1.cxGrid1DBTableView1DataControllerSummaryAfterSummary(
        ASender: TcxDataSummary);
      var i, j, Imp:integer;
          Item: TcxGridDBTableSummaryItem;
      begin
        DBTableView1.DataController.BeginLocate;
        for j:=0 to ASender.FooterSummaryItems.Count-1 do ASender.FooterSummaryValues[j]:=0;
        try
          for i:=0 to DBTableView1.DataController.RowCount-1 do
          begin
            if (DBTableView1.DataController.Values[i,cxGrid1DBTableView1Sonda.Index]<>null) then
              for j:=0 to ASender.FooterSummaryItems.Count-1 do
              begin
                Item:=TcxGridDBTableSummaryItem(ASender.FooterSummaryItems[j]);
                Imp:= DBTableView1.DataController.Values[i, cxGrid1DBTableView1Sonda.Index];
                if (Imp= 1) or ((Imp= 2) 
                then ASender.FooterSummaryValues[j]:= ASender.FooterSummaryValues[j]+1;
              end;
          end;
        finally
          DBTableView1.DataController.EndLocate;
        end;
      end;
      

      【讨论】:

        【解决方案5】:
        procedure cxGrid1DBTableView1DataControllerSummaryFooterSummaryItemsSummary(
          ASender: TcxDataSummaryItems; Arguments: TcxSummaryEventArguments;
          var OutArguments: TcxSummaryEventOutArguments);
        
            var
              AValue: Variant;
              AItem: TcxGridTableSummaryItem;
            begin
              AItem := TcxGridTableSummaryItem(Arguments.SummaryItem);
        
              // считаем проверенные
              if (AItem.Column = tvCompareisCorrect) and (AItem.Kind = skCount) and (AItem.Position = spFooter) then begin
                AValue := tvCompare.DataController.Values[ Arguments.RecordIndex, tvCompareisCorrect.Index];
                if not VarIsNull(AValue) then
                  if not VarAsType(AValue, varBoolean) then Dec(OutArguments.CountValue);
              end;
        

        【讨论】:

        • 这个答案需要一些解释,说明您所做的更改以及如何解决问题
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-06
        • 1970-01-01
        • 2019-08-08
        • 2018-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多