对于rst_btophr1.Move MSHFlexGrid2.Row - 2, adBookFirst这一句
当表answer中有31条记录时需-2,才能正常操作;而当表answer中有30条记录时需-1,才能正常操作。第一条记录操作也正常。
-2时从第2条记录以后操作都正常,但-2时的第一条记录无法操作,出错报告:“EOF、BOF其中之一为真...”。如果用书签功能,则对第一条记录的操作却成了对第二条的响应,而第一条记录无动于衷,奇怪。Private Sub MSHFlexGrid2_DblClick()
 MsgBox MSHFlexGrid2.TextMatrix(MSHFlexGrid2.Row, MSHFlexGrid2.Col), vbOKOnly, "阅读"    Dim cn As New ADODB.Connection
   Dim cmd As New ADODB.Command
   cn.CursorLocation = adUseClient 
   Dim rst_btophr1 As New ADODB.Recordset
   cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\btophr.mdb"
   Set cmd.ActiveConnection = cn
   cmd.CommandText = "select * from answer;"
   rst_btophr1.Open cmd, , adOpenKeyset, adLockOptimistic
   
   rst_btophr1.Move MSHFlexGrid2.Row - 2, adBookFirst 
   If rst_btophr1.Fields(MSHFlexGrid2.Col - 1).Name = "解答内容" Then 
        If rst_btophr1.Fields("备注1").Value = "未读" Then
            rst_btophr1.Fields("备注1").Value = "已读"
            rst_btophr1.Update
            cn.Close
            Call MainForm.showDBInfo '在MSHFlexGrid控件中显示数据库现有内容
        End If
   End If
End Sub
下面是用书签功能的代码:
Private Sub MSHFlexGrid2_DblClick()
 MsgBox MSHFlexGrid2.TextMatrix(MSHFlexGrid2.Row, MSHFlexGrid2.Col), vbOKOnly, "阅读"    Dim cn As New ADODB.Connection
   Dim cmd As New ADODB.Command
   cn.CursorLocation = adUseClient 
   Dim rst_btophr1 As New ADODB.Recordset
   cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\btophr.mdb"
   Set cmd.ActiveConnection = cn
   cmd.CommandText = "select * from answer;"
   rst_btophr1.Open cmd, , adOpenKeyset, adLockOptimistic 
   rst_btophr1.MoveFirst
   varBook = rst_btophr1.Book
   rst_btophr1.Move MSHFlexGrid2.Row - 2, adBookFirst    If rst_btophr1.BOF Then rst_btophr1.Book = varBook 
   If rst_btophr1.EOF Then rst_btophr1.Book = varBook 
    
   If rst_btophr1.Fields(MSHFlexGrid2.Col - 1).Name = "解答内容" Then 
        If rst_btophr1.Fields("备注1").Value = "未读" Then
            rst_btophr1.Fields("备注1").Value = "已读"
            rst_btophr1.Update
            cn.Close
            Call MainForm.showDBInfo '在MSHFlexGrid控件中显示数据库现有内容
        End If
   End IfEnd Sub

解决方案 »

  1.   

    Private Function fillData(ByVal Flex As MSHFlexGrid, ByVal strSql As String) As String
        
        Dim rs As New ADODB.Recordset
        
        On Error GoTo errMark
            
            rs.CursorLocation = 3
            Call rs.Open(strSql, gConn, 1, 3)
            If rs.RecordCount > 0 Then
                Set Flex.DataSource = rs
                Set Flex.DataSource = Nothing
                cmdSingleUnlock.Enabled = True
                cmdAllUnlock.Enabled = True
            Else
                Flex.Clear
                cmdSingleUnlock.Enabled = False
                cmdAllUnlock.Enabled = False
            End If
            
            rs.Close
            Set rs = Nothing
            
            fillData = ""
            
        Exit Function
    errMark:
        fillData = Err.Description
    End Functionmshflexgrid功能很强大,你完全可以在前台代码中进行于数据库无关的状态设置操作,你也可以利用colwidth=0这样的设置隐藏掉主键列或用来标记这条纪录状态的列,当需要更新数据库时拼一个sql语句execute一下就可以了,这样前后台分开的编程方法会使我们省去了许多出现错误的可能,也简化了逻辑,你只要关心在什么操作中需要显示给用户什么样的列表就可以了。建议我们的窗体代码中不要出现与数据库相关的操作。