就是说用鼠标单击某一格单元格的时候,RecordSet的游标会不会同时移动到对应该行的Record?我发现有时候是同步的,有时候又不是。晕了……不同步的时候,我写了下面的代码来手动的维持同步Private Sub dgProduct_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
    Dim row As Long
    Set db_rst = deSell.rstblProduct
    row = dgProduct.row
    db_rst.MoveFirst
    db_rst.Move row '<-----Stack Overflow!!!
End Sub有时候工作的很好,有时候又会出现堆栈溢出。这又是为什么?db_rst.Move到底会不会引发DataGrid的RowColChange事件?

解决方案 »

  1.   

    你是想在DataGrid的Click事件里获得当前行的数据吧?
      

  2.   

    主要是为了在其他的函数里对DataGrid中当前行对应的记录进行更新、删除操作。
      

  3.   

    如果是,那么可以这样做:把dgProduct_Click()事件的代码移到dgProduct_RowColChange()事件下,然后在dgProduct_Click()事件里调用dgProduct_RowColChange()就行了Private Sub dgProduct_Click()
        Call dgProduct_RowColChange(0,0)
    End SubPrivate Sub dgProduct_RowColChange()
        '......你的代码
    End Sub
      

  4.   

    谢谢,我可能没有讲清楚。我有两个问题:1. DataGrid和RecordSet绑定的时候,Cursor会不会随着DataGrid的当前行变化?2. 我想不明白上面代码里面的堆栈溢出是怎么回事?
      

  5.   

    单击某一格单元格的时候,RecordSet的游标会不会同时移动到对应该行的Record?
    --------------------------------------------------------
    单击某一单元格的时候,首先触发的是Click事件(记录集还没移动),然后才触发RowColChange事件(记录集已经移动了)
      

  6.   

    上面代码里面的堆栈溢出是怎么回事?
    ------------------------------------Private Sub dgProduct_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
        Dim row As Long
        Set db_rst = deSell.rstblProduct
        row = dgProduct.row
        db_rst.MoveFirst
        db_rst.Move row '<-----执行这句的时候,记录集会移动,同时会触发RowColChange事件,所以相当一个死循环在执行
    End Sub
      

  7.   

    刚才试了一下,好像不是这样的*_*Private Sub dgProduct_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
    '    Dim row As Long
    '    Set db_rst = deSell.rstblProduct
    '    row = dgProduct.row
    '    db_rst.MoveFirst
    '    db_rst.Move row
        Debug.Print db_rst.Fields(0).Value
    End Sub结果我单击单元格时出现3021的Runtime Error,RecordSet还处于EOF或者BOF状态,Cursor没有移动。
      

  8.   

    可是奇怪的是发生RowColChange事件时,堆栈溢出只是有时候会发生,又时候不会发生*_*
      

  9.   

    下面的代码可以正确执行,并打印出RecordSet中第一列的值Private Sub dgProduct_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
        Dim row As Long
        Set db_rst = deSell.rstblProduct
        row = dgProduct.row
        db_rst.MoveFirst
        db_rst.Move row
        Debug.Print db_rst.Fields(0).Value
    End Sub这可以说明:
    1. 发生RowColChange事件时,Cursor没有移动,而必须手动移动
    2. 没有发生溢出,说明Move方法没有引发RowColChange事件
      

  10.   

    我试了一下,你说的也有道理
    我发现,当我点的是固定列(也就是第1列,没有数据的那列)时,Move方法会造成死循环,知道提示错误,推出
    如果点的是有数据的单元格,Move方法不会出发RowColChange事件
      

  11.   

    你的 dgProduct是与db_rst绑定吗
      

  12.   

    DBGRID好象是有BUG,选取记录要在第1列的前面1列,就没问题了
      

  13.   

    datagrid有没有显示关键字
    db_rst.filter="关键字='" & 当前行关键字的值 & "'"