200分的小问题,有谁用过DBGridEh的合计功能,请进来讨论一下:(200分)

  • 主题发起人 主题发起人 forgot2002
  • 开始时间 开始时间
F

forgot2002

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样调用DBGridEh的合计功能呢?比如我想改变某个值后,DBGrideh下面的合计值能立刻合计
出来,比如我这样写:
procedure TForm1.DBGridEh1ColExit(Sender: TObject);
begin
DBGridEh1.SumList.RecalcAll;
end;
但合计值死活都出不来。
是不是有什么属性或者事件能够直接调用DBGridEh的合计功能呢?我对DBGridEh不熟,请大家
能够帮帮我,谢谢!
 
DBGridEh.FooterRowCount := 1;
DBGridEh.FooterColor := clYellow;
DBGridEh.SumList.Active := True;

DBGridEh.Columns[0].Footer.ValueType := fvtStaticText;
DBGridEh.Columns[0].Footer.Value := '总计:';
DBGridEh.Columns[1].Footer.ValueType := fvtCount; //fvtSum
 
主要是注意:DBGridEh.FooterRowCount := 1;
表的OnDataChange事件中执行: DBGridEh1.SumList.RecalcAll;
 
我如果启动合计功能,DBGridEh就会出现异常
 
直接设属性:

FooterRowCount=1
双击打开列编辑器:
Footer--ValueType=fvtSum
FieldName=全计的字段


 
你首先设置DBGridEh的FooterRowCount为1;
接着设置DBGridEh的SumList属性的active := True以及VirtualRecords为True;
最后将DBGridEh的字段设置静态字段,对需要进行合计的字段的列的Footer属性的ValueType
设置为合适的值,如fvtSum等,如果设置为fvtStaticText,则你要设置Value值,...
 
刚才忘了一个重要的属性:
DbGridEh.SumList.Active=True;
 
唉,首先感谢大家的回答,都怪我没有把问题描述清楚,合计值我当然知道怎样弄出来,所以
不用大家解释了,我的问题是怎样显式地调用这个合计功能。比如说,目前某列的合计值为100,
而其中有一条记录当前列值=10,如果我把10改为20,应该合计值=110就对不对?但现在我如果
对数据暂时不存盘也不刷新(我是用BatchUpdate缓存更新),DBGridEh的合计值是没有改变的,
还是100,有什么办法可以在DBGridEh的OnColExit事件中编程,强迫DBGridEh立刻把最新的合计
值计算并且显示出来呢?
希望大家帮我想想办法,这个问题确实困扰了我很长时间,我实在没空看DBGridEh的源码。

 
干脆做个临时表,对应DBGridEH,保存时再存到主表.
 
//Table1的Area字段合计值,首先设置属性使DbGridEh计算出合计值,然后再写代码实现如下功能:
procedure TForm1.Table1AreaSetText(Sender: TField; const Text: string);
var
l_New_Value: Double;
begin
if Text = '' then Exit;
l_New_Value := StrToFloat(DBGridEh1.GetFooterValue(0, DBGridEh1.Columns[3])) + StrToFloat(Text) - Sender.AsFloat;
DBGridEh1.Columns[3].Footer.ValueType := fvtStaticText;
DBGridEh1.Columns[3].Footer.Value := FloatToStr(l_New_Value);
Sender.AsString :=Text ;
end;
 
上面的方法应该可以,但却是取巧的不是办法之中的办法,难道就只能这样解决了吗?
 
别想了,你看看它的源码就知道了,它合计的时候其实也是遍历DataSet的每个一个记录的,而移
动记录指针是一定要Post的,也就是说需要合计的话一定要Post的.

不Post是没有办法进行合计的!
 
多人接受答案了。
 
后退
顶部