cxGrid - 已检查记录的页脚摘要

时间:2017-05-16 06:41:00

标签: delphi tcxgrid

在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)的变体转换为类型(布尔值)。

不明白这一点。字段是布尔类型(位)。

EDIT2:

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

5 个答案:

答案 0 :(得分:2)

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

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

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

    1. 将Column属性设置为您希望其显示的Grid Column
    2. 将FieldName设置为您计算的字段
    3. 最后将Kind设为skSum

答案 1 :(得分:1)

最好将这些问题发送给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;

答案 2 :(得分:0)

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

SELECT CAS(Bit_Column AS int) AS Int_Column
FROM YourTable

答案 3 :(得分:0)

你可以试试这个:

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;

答案 4 :(得分:0)

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;