不要跟我说dbGrid1.DataSource.DataSet.Recno,我是用的ltBatchOptimistic的,数据根本还没写入数据库的,ehlib的dbgrid就有这个功能的,可以选择是否选择显示行号,问题是我如何获取呢?

解决方案 »

  1.   

    虽然TDbgrid没有提供col和row属性,但是他的基类TCustomGrid却是实现了row和col属性。因此我们可以重新派生一个叫做的TMgrid的类来输出row和col属性,并将dbgrid的实例强制转换成TMgrid ,既可准确快速的获取这两个属性了,代码如下:
    Type
       TMgrid = class (TDbgrid);
     

    Begin

      ShowMessage(IntToStr(TMgird(DbGrid1).row));
      ShowMessage(IntToStr(TMgird(DbGrid1).rol));

    End;
     
    从这个例子中我们不难得到这样的启示,当我们无法从当前使用的类直接获取我们需要的信息时,不要急于求成而绕弯路,我们可以去考察一下它的基类(基类的基类…,一直找上去),是否为我们提供了我们需要的信息。如果有,我们可以简单的从当前类来继承一个新的类(当然你也可以从它的基类直接继承,例如上面的例子,TMgrids甚至可以从TCustomGrid类来继承。但是为了安全起见,我建议直接从当前类来继承),然后强制转换当前对象为新的类型,这时我们就可以非常容易获得我们需要的信息。
      

  2.   

    row  col只表示GRID的显示的行列,和数据集无关。DBGrid绝不会反应数据集真实的记录数,显示的只是某一部分的数据,ROW,COL只也是针对这一部分数据。
      

  3.   

    是要显示数据集当前的行号吗?我怎么觉得问题就是要获取dbgrid的当前行号啊。如果是数据集中的行号,可否先用updatebatch   命令提交保存呢?
      

  4.   

    谢谢回复,上面的代码,是不科学的。不知您试过了没有,当这个dbgrid有滚动条,只能显示5条记录的时候,用您说的代码,就只能取得最大行号为5,哪怕您新增第6条记录,行号还是为5
      

  5.   

    jjwwang说的对,就是这个意思,但是大家用过ehlib的dbgrid没有,它就可以自动计算出当前行号的
      

  6.   

    如果只是显示或许还容易些. 如果还有删除和插入操作的话问题就比较麻烦了.
    如果新增一条记录,显示什么? 如果这条记录是删除的,又显示什么?RecNo之所以有时候不准确, 是和一定的状态有关的. RecNo=-2表示dataset.DisenablControls状态.
    如果是IsEmpty or state=dsinsert 就是-1.楼主要这么行号不知道具体做什么,所以需要具体问题具体分析.
      

  7.   

    可以在clientdataset中添加一列来做序号,然后..........
      

  8.   

    DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);dbgrid的Recno