已有23人关注
删除行定位书签的问题
发表在VB答疑区 2007-10-30
是否精华
版块置顶:
    老师,我用下面的代码[_[font|_|size=4]_]删除最后一行刷新显示时为什么书签总是显示在DATAGRID的第一行呢[_[/font]_],如果删除的是其它行,则刷新后书签就能自动移到删除的下一行。该如何解决呢?请指导,谢谢!

Private Sub Cmd_Del_Click()
Dim mybookmark As Variant
On Error Resume Next
 Adodc2.RecordSource = "select * from 表 where clbm= + RTrim(DataGrid2.Columns(1).Text) + "
 Adodc2.Refresh
 If Adodc2.Recordset.RecordCount > 0 Then
     aa = MsgBox("你确定要删除该记录吗?", vbYesNo, "提示")
    If aa = vbYes Then
     Adodc2.Recordset.Delete
     If Adodc2.Recordset.EOF Then
       Adodc2.Recordset.MoveLast
       mybookmark = DataGrid2.Bookmark
     Else
       Adodc2.Recordset.MoveNext
       mybookmark = DataGrid2.Bookmark
     End If
      Adodc2.Refresh
   End If
 End If
    Adodc2.RecordSource = "select c.xh,c.clbm,b.clmc,b.clxh,b.cldw,c.clde,c.clnote,c.clcj from 表 c,cl_bm b where c.clbm=b.clbm and c.clcj= + Combo3.Text + "
      Adodc2.Refresh
      Set DataGrid2.DataSource = Adodc2.Recordset
      DataGrid2.Bookmark = mybookmark
End Sub
分享到:
精彩评论 5
Lemon
学分:0 LV1
2007-11-01
沙发
您好 !

因为在删除最后一行以后,已经没有下一行了,所以指到记录集的第一行是正确的。如果想实现当删除最后一行以后,记录还是指到最后一行的话,可以参看下面的代码。

Dim MyStr As String
Private Sub Command1_Click()
Adodc1.RecordSource = "select * from 表1 where 姓名= + MyStr + "
Adodc1.Refresh
If Adodc1.Recordset.RecordCount > 0 Then
     Adodc1.Recordset.Delete
     Adodc1.Recordset.Update
     Adodc1.Refresh
End If
    Adodc1.RecordSource = "select * from 表1 "
    Adodc1.Refresh
    Adodc1.Recordset.MoveLast
End Sub

Private Sub DataGrid1_Click()
MyStr = Adodc1.Recordset.Fields("姓名")
End Sub
rjl0663
学分:0 LV1
2007-11-02
板凳
    老师,我里面是已经加了Adodc2.Recordset.MoveLast的呀,但是没作用.

     If Adodc2.Recordset.EOF Then
       Adodc2.Recordset.MoveLast
       mybookmark = DataGrid2.Bookmark
     Else
       Adodc2.Recordset.MoveNext
       mybookmark = DataGrid2.Bookmark
     End If
Lemon
学分:0 LV1
2007-11-03
地板
您好!

事实上如果不用错误处理的话,您的代码在执行的 DataGrid2.Bookmark = mybookmark语句的时候应该出错,因为您前后的记录集是不一样的,不同的记录集用同一个书签肯定会有问题。这些错误都通过您的错误处理语句给屏蔽掉了。

对于您的要求,您可以试一下下面的代码,这里在DataGrid1_Click事件中将书签保存到变量mybookmark中,这个的mybookmark是以个全局变量,在窗体中的所有事件都可以调用它,在“删除”操作执行完成以后,刷新纪录集。这里的
 Adodc1.RecordSource = "select * from CL_BM_CPBB order by CPDATE"
要和最初的记录集是一致的,以保持mybookmark中的值的有效性。
这里对最后一条的处理是,如果记录为最后一条,其书签值将大于记录的个数,因此将书签设为记录的个数。


您尝试一下,如果有问题,您可以再联系我们。

Dim MyStr As String
Dim mybookmark
Private Sub Command1_Click()
    Adodc1.RecordSource = "select * from CL_BM_CPBB where CPDATE= + MyStr + "
    Adodc1.Refresh
    If Adodc1.Recordset.RecordCount > 0 Then
        Adodc1.Recordset.Delete
        Adodc1.Recordset.Update
        Adodc1.Refresh
    End If
    Adodc1.RecordSource = "select * from CL_BM_CPBB order by CPDATE"
    Adodc1.Refresh
    Set DataGrid1.DataSource = Adodc1.Recordset
    If mybookmark > Adodc1.Recordset.RecordCount Then
        DataGrid1.Bookmark = Adodc1.Recordset.RecordCount
    Else
        DataGrid1.Bookmark = mybookmark
    End If
End Sub

Private Sub DataGrid1_Click()
    MyStr = Adodc1.Recordset.Fields("CPDATE")
    mybookmark = DataGrid1.Bookmark
End Sub
rjl0663
学分:0 LV1
2007-11-03
4L
    老师,按照您的指导这样不管删除的是那一行,删除之后书签总是跳到DataGrid的第一行。
    如果我增加[_[font|_|color=#8A2BE2]_]On Error GoTo ErrDel[_[/font]_]该语句,却不管删除那一行总是跳到DataGrid的最后一行。
    
Private Sub Cmd_Del_Click()
Dim mybookmark As Variant
On Error Resume Next
 Adodc2.RecordSource = "select * from 表 where clbm= + RTrim(DataGrid2.Columns(1).Text) + "
 Adodc2.Refresh
 If Adodc2.Recordset.RecordCount > 0 Then
     aa = MsgBox("你确定要删除该记录吗?", vbYesNo, "提示")
    If aa = vbYes Then
     Adodc2.Recordset.Delete
     If Adodc2.Recordset.EOF Then
       Adodc2.Recordset.MoveLast
    [_[font|_|color=#8A2BE2]_]On Error GoTo ErrDel[_[/font]_]
       mybookmark = DataGrid2.Bookmark
     Else
       Adodc2.Recordset.MoveNext
       mybookmark = DataGrid2.Bookmark
     End If
      Adodc2.Refresh
   End If
 End If
    Adodc2.RecordSource = "select c.xh,c.clbm,b.clmc,b.clxh,b.cldw,c.clde,c.clnote,c.clcj from 表 c,cl_bm b where c.clbm=b.clbm and c.clcj= + Combo3.Text + "
      Adodc2.Refresh
      Set DataGrid2.DataSource = Adodc2.Recordset
      DataGrid2.Bookmark = mybookmark
[_[font|_|color=#8A2BE2]_]ErrDel:
      Adodc2.Refresh
      Adodc2.Recordset.MoveLast
      Set DataGrid2.DataSource = Adodc2.Recordset
[_[/font]_]
End Sub
Lemon
学分:0 LV1
2007-11-06
5L
您好!

您没有理解我的意思,还是那个问题不同的记录集用同一个书签肯定会有问题。我那里是将mybookmark定义成窗体级变量,即,在该窗体的任何一个事件过程中都可以调用。另外还有一个重要的原因就是这些记录集都是一样的,即,前面是select * from tb,执行以后也是select * from tb.

您的问题:在前面保存书签值的时候就是1,因为只有一条记录(也可能几条,根据查询条件),您到后面将书签赋值给DataGrid时,该值就是1,因此会指向第一条记录。
首页上一页 1 下一页尾页 5 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照