RT网上搜索了下,一般答案是这样for   i:=0   to   DBGrid1.Columns.Count-1   do   
      xx:=DBGrid1.Columns[I].Field.Value;   
    
  如果是想取某一列的值,则:   
    
  with   DBGrid1.DataSource.DataSet   do   
  begin   
      First;   
      while   not   Eof   do   
      begin   
          xx:=DBGrid1.Columns[xx].Value;   
          //其他处理   
          //也可以xx:=FeildValues[FieldName];   
          //其他处理etc...   
          Next;//这句别忘了.   
      end;   
  end;这样会导致数据库指针的移动,能不能直接从DBGrid的控件角度着手,获得每一行的第一个格子里的内容?

解决方案 »

  1.   

    TDBGrid继承自TCustonStringGrid
    完全可以以TStringGrid方式访问每个Cell
    不过,这样只能访问到当前显示在界面上每个Cell的值,没有显示的内容无法通过Cell访问,因为那个需要在滚动数据集的时候,后台提取数据显示到对应位置的Cell上。TStringGrid的行数和列数是可预见的,也就是RowCount,ColCount,虽然你可以动态改变,但也是相对“固定”的。
    TDBGrid的行数和列数就只有界面上显示那些Row和Col,需要滚动的时候或则大小改变的时候才有变化,无穷的数据都是临时绘制到适当位置的Cell上。
      

  2.   

    DBGrid连RowCount都没有,怎么高啊?按你说的StringGrid的方式
      

  3.   

    思路不对。
    比如DBGrid的Dataset是ADOQuery,则应当ADOQuery.Next,取ADOQuery.Fields[0]
      

  4.   

    你是不是不喜欢遍历时候数据表会滚动呢??另开一个adoquery进行操作就好了.
      

  5.   

    DBGrid1是感知控件,滚动DBGrid1记录,对应的Dataset当然也就会滚动
    若不想看到滚动,另外用一个Dataset操作啊也可以这样,或用Locate方法重新定位,让人感觉不到记录在滚动:
    var
      P:Pointer;
    begin
       P:=ADOQuery1.GetBook;  
       ADOQuery1.DisableControls;
       try
       //...读取值的操作
       if P<>nil then
         ADOQuery1.GotoBook(P);
       finally
        ADOQuery1.EnableControls;
       end;
    end;
      

  6.   


    不明白你的意思,这个是通过ADOQuery的Next来遍历行的,怎么了
      

  7.   

    算了,结贴吧。
    哎。万恶的Delphi