您提出这么好的问题是CSDN的福气,也是大家的福气,尽管没人回答得了,但您总不至于不结贴吧?既然一个回答的都没有,您就无法结贴了。我帮你UP吧,你只要在结贴的时候给我所有的分。万一碰上高人能回答了您的问题,那时候给我一半就可以了。

解决方案 »

  1.   

    1.Private Sub Form_Load()中的 “Set BookCLS = New Book”多余

    Public Sub ReBind()
    Dim oText As Variant
    Set BookCLS = New Book
    重复,但这不是主要的2.在
    Public Sub ReBind()
    Dim oText As Variant
    Set BookCLS = New Book
    For Each oText In Me.Text1
        oText.DataMember = "Book"
        Set oText.DataSource = BookCLS
    Next
    End Sub
    中你只设置了每一个textbox的datasource and datamember,但没设置datafield
      

  2.   

    窗口要初始化之后才能对其进行控制操作
    你不应该在类里,而应该在form 的 delaration里写那些函数
    类里应该写一些api操作,还有一些函数
      

  3.   

    源代码中缺少了WithEvents以及事件的响应,我的这段代码运行无误。
    窗体代码为:
    Option Explicit
    Private WithEvents PrimaryCLS As clsBook
    Dim mbChangedByCode As Boolean
    Dim mvBookMark As Variant
    Dim mbEditFlag As Boolean
    Dim mbAddNewFlag As Boolean
    Dim mbDataChanged As BooleanPrivate Sub Form_Load()
      Set PrimaryCLS = New clsBook  Dim oText As TextBox
      'Bind the text boxes to the data provider
      For Each oText In Me.txtFields
        oText.DataMember = "Primary"
        Set oText.DataSource = PrimaryCLS
      Next
    End SubPrivate Sub Form_Resize()
      On Error Resume Next
      lblStatus.Width = Me.Width - 1500
      cmdNext.Left = lblStatus.Width + 700
      cmdLast.Left = cmdNext.Left + 340
    End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
      If mbEditFlag Or mbAddNewFlag Then Exit Sub  Select Case KeyCode
        Case vbKeyEscape
          cmdClose_Click
        Case vbKeyEnd
          cmdLast_Click
        Case vbKeyHome
          cmdFirst_Click
        Case vbKeyUp, vbKeyPageUp
          If Shift = vbCtrlMask Then
            cmdFirst_Click
          Else
            cmdPrevious_Click
          End If
        Case vbKeyDown, vbKeyPageDown
          If Shift = vbCtrlMask Then
            cmdLast_Click
          Else
            cmdNext_Click
          End If
      End Select
    End SubPrivate Sub Form_Unload(Cancel As Integer)
      Screen.MousePointer = vbDefault
    End SubPrivate Sub PrimaryCLS_MoveComplete()
      'This will display the current record position for this recordset
      lblStatus.Caption = "Record: " & CStr(PrimaryCLS.AbsolutePosition)
    End SubPrivate Sub cmdAdd_Click()
      On Error GoTo AddErr
      PrimaryCLS.AddNew
      lblStatus.Caption = "Add record"
      mbAddNewFlag = True
      SetButtons False  Exit Sub
    AddErr:
      MsgBox Err.Description
    End SubPrivate Sub cmdDelete_Click()
      On Error GoTo DeleteErr
      PrimaryCLS.Delete
      Exit Sub
    DeleteErr:
      MsgBox Err.Description
    End SubPrivate Sub cmdRefresh_Click()
      'This is only needed for multi user apps
      On Error GoTo RefreshErr
      PrimaryCLS.Requery
      Exit Sub
    RefreshErr:
      MsgBox Err.Description
    End SubPrivate Sub cmdEdit_Click()
      On Error GoTo EditErr  lblStatus.Caption = "Edit record"
      mbEditFlag = True
      SetButtons False
      Exit SubEditErr:
      MsgBox Err.Description
    End Sub
    Private Sub cmdCancel_Click()
      On Error Resume Next  PrimaryCLS.Cancel
      SetButtons True
    End SubPrivate Sub cmdUpdate_Click()
      On Error GoTo UpdateErr  PrimaryCLS.Update
      SetButtons True
      Exit Sub
    UpdateErr:
      MsgBox Err.Description
    End SubPrivate Sub cmdClose_Click()
      Unload Me
    End SubPrivate Sub cmdFirst_Click()
      On Error GoTo GoFirstError  PrimaryCLS.MoveFirst
      mbDataChanged = False  Exit SubGoFirstError:
      MsgBox Err.Description
    End SubPrivate Sub cmdLast_Click()
      On Error GoTo GoLastError  PrimaryCLS.MoveLast
      mbDataChanged = False  Exit SubGoLastError:
      MsgBox Err.Description
    End SubPrivate Sub cmdNext_Click()
      On Error GoTo GoNextError  PrimaryCLS.MoveNext
      Exit Sub
    GoNextError:
      MsgBox Err.Description
    End SubPrivate Sub cmdPrevious_Click()
      On Error GoTo GoPrevError  PrimaryCLS.MovePrevious
      Exit SubGoPrevError:
      MsgBox Err.Description
    End SubPrivate Sub SetButtons(bVal As Boolean)
      cmdAdd.Visible = bVal
      cmdUpdate.Visible = Not bVal
      cmdCancel.Visible = Not bVal
      cmdDelete.Visible = bVal
      cmdClose.Visible = bVal
      cmdRefresh.Visible = bVal
      cmdNext.Enabled = bVal
      cmdFirst.Enabled = bVal
      cmdLast.Enabled = bVal
      cmdPrevious.Enabled = bVal
    End Sub类模块为:
    Option ExplicitDim WithEvents adoPrimaryRS As Recordset
    Private DoingRequery As Boolean
    Public Event MoveComplete()Private Sub Class_Initialize()
      Dim db As Connection
      Set db = New Connection
      db.CursorLocation = adUseClient
      db.Open "PROVIDER=MSDASQL;driver={SQL Server};server=asd;uid=sa;pwd=sa;database=rental;"  Set adoPrimaryRS = New Recordset
      adoPrimaryRS.Open "select BookId,Description,Price,Rental,TotalCopies,AvailableCopies from Book", db, adOpenStatic, adLockOptimistic  DataMembers.Add "Primary"
    End SubPrivate Sub Class_GetDataMember(DataMember As String, Data As Object)
      Select Case DataMember
      Case "Primary"
        Set Data = adoPrimaryRS
      End Select
    End SubPrivate Sub adoPrimaryRS_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
      RaiseEvent MoveComplete
    End SubPrivate Sub adoPrimaryRS_WillChangeRecord(ByVal adReason As ADODB.EventReasonEnum, ByVal cRecords As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
      'This is where you put validation code
      'This event gets called when the following actions occur
      Dim bCancel As Boolean
      Select Case adReason
      Case adRsnAddNew
      Case adRsnClose
      Case adRsnDelete
      Case adRsnFirstChange
      Case adRsnMove
      Case adRsnRequery
      Case adRsnResynch
      Case adRsnUndoAddNew
      Case adRsnUndoDelete
      Case adRsnUndoUpdate
      Case adRsnUpdate
      End Select  If bCancel Then adStatus = adStatusCancel
    End SubPublic Property Get EditingRecord() As Boolean
      EditingRecord = (adoPrimaryRS.EditMode <> adEditNone)
    End PropertyPublic Property Get AbsolutePosition() As Long
      AbsolutePosition = adoPrimaryRS.AbsolutePosition
    End PropertyPublic Sub AddNew()
      adoPrimaryRS.AddNew
    End SubPublic Sub Delete()
      adoPrimaryRS.Delete
        MoveNext
    End SubPublic Sub Requery()
      adoPrimaryRS.Requery
      DataMemberChanged "Primary"
    End SubPublic Sub Update()
      With adoPrimaryRS
        .UpdateBatch adAffectAll
        If .EditMode = adEditAdd Then
          MoveLast
        End If
      End With
    End SubPublic Sub Cancel()
      With adoPrimaryRS
        .CancelUpdate
        If .EditMode = adEditAdd Then
          MoveFirst
        End If
      End With
    End SubPublic Sub MoveFirst()
      adoPrimaryRS.MoveFirst
    End SubPublic Sub MoveLast()
      adoPrimaryRS.MoveLast
    End SubPublic Sub MoveNext()
      If Not adoPrimaryRS.EOF Then adoPrimaryRS.MoveNext
      If adoPrimaryRS.EOF And adoPrimaryRS.RecordCount > 0 Then
        Beep
        'moved off the end so go back
        adoPrimaryRS.MoveLast
      End If
    End SubPublic Sub MovePrevious()
      If Not adoPrimaryRS.BOF Then adoPrimaryRS.MovePrevious
      If adoPrimaryRS.BOF And adoPrimaryRS.RecordCount > 0 Then
        Beep
        'moved off the end so go back
        adoPrimaryRS.MoveFirst
      End If
    End Sub