在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。 这就是转换错误的原因。
答案 0 :(得分:2)
您也可以设置网格以使用其他字段计算摘要,例如计算字段,您可以在其中指定每次要添加的确切值。
将计算字段添加到数据集中,并使用所需的值。 MyHiddenField.Value:= -1 * YourCheckingField.AsInteger;
转到CxGrid对话框上的Summaries选项卡,然后添加一个新摘要:
答案 1 :(得分:1)
最好将这些问题发送给DevExpress支持团队。 您可以自定义页脚:
快速示例(将所有记录中的字符数显示为页脚值):
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;