代码如下:
procedure TForm1.qry_subAfterOpen(DataSet: TDataSet);
var
  m: Integer;
begin
if not (qry_sub.IsEmpty) then grid_sub.Columns.AddAllColumns(True);
  with grid_sub do
  begin
  Columns[0].Title.Alignment:=taCenter;
  Columns[0].Title.Caption:='色号';
  Columns[0].ReadOnly:=True;
  Columns[0].Color:=$0080FF80;
  Columns[0].Width:=36;
  Columns[0].Footers.Add;
  Columns[0].Footers[0].Alignment:=taCenter;
  Columns[0].Footers[0].ValueType:=fvtCount;
  Columns[1].Title.Alignment:=taCenter;
  Columns[1].Title.Caption:='色名';
  Columns[1].ReadOnly:=True;
  Columns[1].Color:=$0080FF80;
  Columns[1].Width:=65;
  for m:=2 to Columns.Count-2 do
    begin
    Columns[m].Title.Alignment:=taCenter;
    Columns[m].Width:=40;
    end;
  Columns[Columns.Count-1].Title.Alignment:=taCenter;
  Columns[Columns.Count-1].ReadOnly:=True;
  Columns[Columns.Count-1].Color:=$0080FF80;
  Columns[Columns.Count-1].Width:=52;
  for m:=2 to Columns.Count-1 do
   begin
    Columns[m].Footers.Add;
    Columns[m].Footers[0].Alignment:=taCenter;
    Columns[m].Footers[0].ValueType:=fvtSum;
   end;
  end;
end;说明一下:
qry_sub中的列是动态语句生成的,列数不定。
使用这段代码后,当列数比较多的时候,正常,此时qry_sub查到的结果如下:
colorid,colorname,1,2,3,4,sums
19,aa,1,2,2,0,5
68,bb,2,2,2,2,8这种情况下正常但当qry_sub只查到一个尺码列的时候,如以下结果时
colorid,colorname,2,sums
19,aa,3,3
77,bb,4,4这种情况的时候,footer中报错,内容如下:
提示如下:qry_sub field '1' not found,dbsumlst.pas系统提示出错
            case Item.GroupOperation of
              goSum:
                if (FDataSet.FieldByName(Item.FieldName).IsNull = False) then
                  Item.SumValue := Item.SumValue + FDataSet.FieldByName(Item.FieldName).AsFloat;

请问这种情况是怎么回事?如何解决?

解决方案 »

  1.   

    过程里面第一行。
    dbgrid.column.clear;
      

  2.   

    楼上的,经过我测试,加上了你提供的那一句,执行的时候,还是报同样的错误。我认为应该不是这个问题
    grid_sub.Columns.AddAllColumns(True)
    句中的参数为true,已经是自动清除了原来所有的columns的。不知道是不是dbgrideh的问题呢?
      

  3.   

    还是不行,columns[m].footers.clear;了,
    还是报同样的错误。
      

  4.   

    没用程序测试,我觉得columns[m].footers.add出错。
    footers不需要增加吧,你在设计窗体时需要特意添加footer吗,所列增加完了,就可以了。直接给footer赋值。
      

  5.   

    footers,不需要ADD。在dbgrid 设置footer行数1提供一段通用动态列footer代码  i:=0;
      while i <DBGridEh1.Columns.Count do
      begin
        if Trim(DBGridEh1.Columns[i].FieldName) = '' then
          Break;
        if (DBGridEh1.DataSource.DataSet.FieldByName(DBGridEh1.Columns[i].FieldName).DataType in [ftbcd])  then
        begin
          DBGridEh1.Columns[i].DisplayFormat:=',0.00';
          DBGridEh1.Columns[i].Footer.DisplayFormat:=',0.00';
          DBGridEh1.Columns[i].Footer.ValueType:=fvtSum;
        end
        else
        if (DBGridEh1.DataSource.DataSet.FieldByName(DBGridEh1.Columns[i].FieldName).DataType in [ftinteger,ftboolean]) then
        begin
          DBGridEh1.Columns[i].DisplayFormat:='0';
          DBGridEh1.Columns[i].Footer.DisplayFormat:='0';
          DBGridEh1.Columns[i].Footer.ValueType:=fvtCount;
        end
        else
        if (DBGridEh1.DataSource.DataSet.FieldByName(DBGridEh1.Columns[i].FieldName).DataType in [ftdatetime,ftdate,fttime]) then
        begin
          DBGridEh1.Columns[i].DisplayFormat:='YYYY-MM-DD';
        end
        else
          DBGridEh1.Columns[i].DisplayFormat:='';
        i:=i+1;
      end;