这是不行的,你在删除前先用MoveLast,之后再删除,如果recordset只有刚新增的记录,这也不行,你最好重新Open recordset.

解决方案 »

  1.   

    下面是代码,请大虾帮忙找找错,我实验的结果是新增是正常的,但是在删除的时候,如果通过按键来控制rstCP的移动,找到某条记录并删除,就会出现:“行句柄引用了一个已被删除的行或被标示未删除的行”的错误,但是我如果在DATAGRID上单击某条记录来定位的话,删除的时候就没问题。
    Dim rstCP As ADODB.Recordset
    ......
    Set GridCP.DataSource = rstCP
    ......
    Case Is = "new"      '新增
      Enable
      rstCP.AddNew
      init
      btnset1
      txtfield(0).SetFocusCase Is = "delete"   '删除
       If MsgBox("确定删除该记录?", 49) = 1 And rstCP.RecordCount > 0 Then
            rstCP.Delete
            rstCP.MoveNext
             If rstCP.RecordCount > 0 Then
                If rstCP.EOF Then
                   rstCP.MovePrevious
                End If
                GetData
             Else
                MsgBox "记录全部都删除了!", vbOKOnly, "产品设置"
                init
             End If
     End If    If rstCP.RecordCount > 0 Then
            btnset2
        Else
            btnset3
        End IfCase Is = "save"     '保存
      SaveData
        If rstCP.EditMode = adEditInProgress Then
           rstCP.Update
        Else
            If rstCP.EditMode = adEditAdd Then
                rstCP.Update
                rstCP.MoveFirst
            End If
        End If
        GetData
        btnset2
        DisableCase Is = "first"       '第一个记录
      rstCP.MoveFirst
      GetDataCase Is = "previous"    '前一个记录
      rstCP.MovePrevious
       If rstCP.BOF Then
        MsgBox "到头了!", vbOKOnly, "系统提示"
        rstCP.MoveFirst
       End If
     GetDataCase Is = "next"        '后一个记录
     rstCP.MoveNext
      If rstCP.EOF Then
       MsgBox "到底了!", vbOKOnly, "系统提示"
       rstCP.MoveLast
      End If
      GetDataCase Is = "last"        '末一个记录
     rstCP.MoveLast
     GetData
    .......
    Private Sub GridCP_Click()
       rstCP.Find ("产品编号='" & GridCP.Columns(0).Value & "'"), , adSearchForward, 1
       GetData
    End Sub
    .......
      

  2.   

    还有一个比较怪的问题就是,如果我在rstCP.Delete这句设断点的话,跟踪的结果是正确的,但是不设断点的话,错误就会在这句出现。
      

  3.   

    你是用Set GridCP.DataSource = rstCP来给Datagrid1赋值的,因此你用键盘移动Datagrid的记录时,并没有移动rstCP的指针,你可以在rstCP.Delete语句之前加上这么一句,应该就可以了: If MsgBox("确定删除该记录?", 49) = 1 And rstCP.RecordCount > 0 Then
            if not (GridCP.DataSource is nothing) then
               set rstCP=GridCP.DataSource 
            else
               exit sub
            end if
            rstCP.Delete
            rstCP.MoveNext
             If rstCP.RecordCount > 0 Then
                If rstCP.EOF Then
                   rstCP.MovePrevious
                End If
                GetData
             Else
                MsgBox "记录全部都删除了!", vbOKOnly, "产品设置"
                init
             End If
     end if
     
      

  4.   

    TO:cwl500449(水中望月)
    可能是我上面的描述不太清楚,造成了你的误解。
    “在删除的时候,如果通过按键来控制rstCP的移动,找到某条记录并删除”
    我这里的按键的意思是说工具条上的按键:”第一条“、”下一条“、”上一条“、”末一条“,我是通过它们来移动rstCP的。
      

  5.   

    是不是记录缓冲在搞鬼呀,
    我以前也出现过类似的问题,改了CACHESIZE属性后就好了
      

  6.   

    谢谢大家,问题解决了,我换了一个表格控件——GRIDEX2000
    不过对于上面那个问题仍然不解中
      

  7.   

    你的recordset对象有没有设置如下属性:
    rstCP.CursorLocation =adUseClient
    如果没有,在添加记录后该记录不会马上写入数据库(即使update也不行),这时候游标指针没有指向任何记录,当然无法删除啦.
      

  8.   

    TO:lkk2073(老头) 
    是向你说的那样做的
    出现那个错误之后,点”确定“,重新载入窗体或者到数据库中看,记录已被删除。
    PS:偶用的是ACCESS2002
      

  9.   

    回复人: Stiven_PFan(NCsoft) ( ) 信誉:100  2002-12-26 19:51:00  得分:0 
     
     是不是记录缓冲在搞鬼呀,
    我以前也出现过类似的问题,改了CACHESIZE属性后就好了
       -------------------------
    能否详细说说?