对于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
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一下就可以了,这样前后台分开的编程方法会使我们省去了许多出现错误的可能,也简化了逻辑,你只要关心在什么操作中需要显示给用户什么样的列表就可以了。建议我们的窗体代码中不要出现与数据库相关的操作。