一般是在ADOquery中Add Calculated field 加入新计算字段后,在OnCalcFields事件中对其赋值!以前此方法都管用,但现在发现一个重大问题,很疑惑,不知是何原因,如下示:ADOquery执行查询过后,得到2000多条记录,显示在DBGridEh中,由于DBGridEh的大小原因,只能显示前面的30条记录,其它的要通过拖动滚动条来显示,问题就在这儿,OnCalcFields事件只对这30条记录(DBGridEh中可以看到的记录)进行赋值计算,而其他的就不计算,如果拖动滚动条,它又才开始计算。晕了,这是怎么回事?我记得它可以一次性全部计算完的,为何还要依靠DBGridEh呢,DBGridEh中只能显示那么多条它就只计算那么多条,不会是这样的吧!!是不是哪里还要设置?各位帮忙解答一下!!疑惑中!!!

解决方案 »

  1.   

    adodataset的OnCalcFields事件与grid没有啥关系啊,不应该出现这种问题吧。
      

  2.   

    楼主试一下ADOquery的AutoCalcFields属性。
    ADOquery打开前先把DBGridEh的DataSource1属性屏蔽掉,ADOquery打开后在重新设置一下DBGridEh的DataSource1属性。
    或者在ADOquery的OnCalcFields事件中加一个计数器,看看ADOquery执行查询过后是否只赋值30次,如果等于记录数,那就不是OnCalcFields事件中的问题了,而是DBGridEh显示的问题了。
    俺试了TDBGrid、TwwDBGrid、TdxDBGrid三种都没问题,从来没发现你说的问题。呵呵,替你郁闷
      

  3.   

    晕了,很难想像,如果先把DBGridEh的DataSource属性屏蔽掉,ADOquery的OnCalcFields中就只计算第一条记录的,后面的都不计算了,如果设置了DBGridEh的DataSource属性,就只计算DBGridEh中显示出来的记录的,显示不了的也还是不计算,真的是这样啊!!郁闷!!!
      

  4.   

    看看DBGridEH的Options里面有没有LoadAllRecords属性,如果有设置为True试试
      

  5.   

    没有这个属性,就ADOquery有一个MaxRecords属性
      

  6.   

    把ADOQurey删除之后,再放一个上去,试试看。
      

  7.   

    人为加个循环,看看能不能解决问题。
    Adoquery1.DisableControls;
    //这里还可以加上book控制
    try
      AdoQuery1.First
      while not AdoQuery1.Eof do
      begin
        AdoQuery1.Next;
      end;
    finally
      AdoQuery1.EnableCOntrols;
    end;