BindingCollection Object, DataMembers Collection Example

The example uses a class module as a data source. When code to set the DataSource and DataMember properties of two Binding objects executes, the class module's Initialize event occurs; two ADO recordsets are created in that event, and the names of the recordsets are added to the DataMembers collection. The GetDataMember event and its arguments are used to return data to the data consumer.

To try the example, on the Project menu, click References, and set a reference to Microsoft Data Binding Collection and Microsoft ActiveX Data Objects. On the Project menu, click Add Class Module. Change the name of the class to MyDataClass, and set the DataSourceBehavior property to vbDataSource. Then draw two TextBox controls on a form. Paste the code into the Form object's code module.

Option Explicit
' Declare the object variables, one for a Class module named MyDataClass, 
' and two more for each BindingCollection object one for each 
' recordset).

Private clsData As New MyDataClass               ' Class module
Private bndColProducts As New BindingCollection  ' Bindings Collection
Private bndColSuppliers As New BindingCollection ' Bindings Collection

Private Sub Form_Load()
   ' Set DataSource and DataMember properties for each Bindings 
   ' collection object. 
   With bndColProducts   
      .DataMember = "Products"
      Set .DataSource = clsData
      .Add Text1, "Text", "ProductName" ' Bind to a TextBox.
   End With
    
   With bndColSuppliers
      .DataMember = "Suppliers"
      Set .DataSource = clsData
      .Add Text2, "Text", "CompanyName" ' Bind to a TextBox.
   End With

   ' Change the Caption of Command1
   Command1.Caption = "MoveNext"

End Sub

Private Sub Command1_Click()
   clsData.MoveNext
End Sub

Paste the code below into the MyDataClass module. The DataSourceBehavior property must be set to vbDataSource in order to see the GetDataMember event. Run the project.

Option Explicit
' Declare object variables for ADO Recordset and Connection objects.
Private WithEvents rsProducts As ADODB.Recordset
Private WithEvents rsSuppliers As ADODB.Recordset
Private cnNwind As ADODB.Connection

Private Sub Class_Initialize()
   ' Add strings to the DataMembers collection.
   With DataMembers
      .Add "Products"
      .Add "Suppliers"
   End With

   ' Set Recordset objects.
   Set rsProducts = New ADODB.Recordset
   Set rsSuppliers = New ADODB.Recordset
   Set cnNwind = New ADODB.Connection

   ' Set the Connection object parameters.   
   With cnNwind
      ' The Nwind.mdb that comes with Visual Basic must be installed on
      ' the computer or the code will fail. Otherwise alter the path to
      ' find the file on the computer.
      .Provider = "Microsoft.Jet.OLEDB.3.51"
      .Open "C:\Program Files\DevStudio\VB\Nwind.mdb"
   End With
   
   ' Open the recordset objects. 
   rsSuppliers.Open "SELECT * FROM Suppliers", cnNwind, _
   adOpenStatic, adLockOptimistic
   rsProducts.Open "SELECT * FROM Products", cnNwind, _
   adOpenStatic, adLockOptimistic

End Sub

' The GetDataMember occurs when the DataSource property of a data
' consumer is set. In this case, the Bindings collection object is 
' the consumer.
Private Sub Class_GetDataMember(DataMember As String, Data As Object)
   Select Case DataMember
   Case "Products"
      Set Data = rsProducts
   Case "Suppliers"
      Set Data = rsSuppliers
   Case ""
      ' Provide a default record source when no Data Member is specified.
      Set Data = rsProducts
   End Select
   
End Sub

Public Function MoveNext()
   If rsProducts.EOF Then
      rsProducts.MoveFirst
   Else
      rsProducts.MoveNext
   End If
End Function

Private Sub rsProducts_MoveComplete(ByVal adReason As _
ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As _
ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
   ' Keep the two recordsets in sync. The first textbox displays
   ' the supplier of the product. If the SupplierID for both
   ' recordsets are equivalent, no change needed. Otherwise,
   ' move to first record and test for SupplierID. This example
   ' is for demonstration only as the method is not the most
   ' efficient.

   If rsSuppliers("SupplierID").Value = _
   pRecordset("SupplierID").Value Then Exit Sub

   rsSuppliers.MoveFirst
   Do While Not rsSuppliers.EOF
      If rsSuppliers("SupplierID").Value = _
      pRecordset("SupplierID").Value Then
         Exit Sub
      Else
         rsSuppliers.MoveNext
      End If
   Loop
End Sub