Custom row source for combo box in continuous form in Access

后端 未结 13 2152
北恋
北恋 2020-12-06 01:34

I have searched around, and it seems that this is a limitation in MS Access, so I\'m wondering what creative solutions other have found to this puzzle.

If you have a

相关标签:
13条回答
  • 2020-12-06 02:18

    We also encounter this a lot in our applicatins. What we have found to be a good solution: Just show all rows in the comboboxes. Then, as soon as the user enters the compobox in a specific row, adjust the rowsource (with the filter for that row). When the combobox loses the focus, you can re-set the rowsource to display everything.

    0 讨论(0)
  • 2020-12-06 02:18

    What if you turn off the "Limit To List" option, and do some validation before update to confirm that what the user might have typed in matches something in the list that you presented them?

    0 讨论(0)
  • 2020-12-06 02:19

    Better...

    Set you combo box Control Source to a column on the query where the values from your combo box will be stored.

    0 讨论(0)
  • 2020-12-06 02:23

    I have a simpler way to go than Gilligan. It seems like a lot of work but it really isn't. My solution requires having my continuous form as a subform datasheet. On my subform I have two lookup comboboxes, among other fields, called Equipment and Manufacturer. Both simply hold a Long Integer key in the data source. Manufacturer needs to be filtered by what is selected in Equipment. The only time I filter Manufacturer.RowSource is in the Manufacturer_GotFocus event.

    Private Sub Manufacturer_GotFocus()

    If Nz(Me.Equipment, 0) > 0 Then
        Me.Manufacturer.RowSource = GetMfrSQL()  '- gets filtered query based on Equipment
    Else
        Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
    End If
    

    End Sub

    In Manufacturer_LostFocus I reset Manufacturer.RowSource to all Manufacturers as well. You need to do this because when you first click in the subform, GotFocus events fire for all controls, including Manufacturer, even though you are not actually updating any fields.

    Private Sub Manufacturer_LostFocus()

    Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
    

    End Sub

    In the Enter event of Manufacturer you have to check if Equipment has been selected, if not set focus to Equipment.

    Private Sub Manufacturer_Enter()

    If Nz(Me.EquipmentID, 0) = 0 Then
        '-- Must select Equipment first, before selecting Manufacturer
        Me.Equipment.SetFocus
    End If
    

    End Sub

    You also need to requery the Manufacturer combobox in Form_Current event (i.e. Me.Manufacturer.Requery), and you should set the Cycle property of this subform to "Current Record".

    Seems simple enough, but you're not done yet. You also have to reset Manufacturer.RowSource to all Manufacturers in the SubForm_Exit event in the parent form in case the user goes to the Manufacturer combobox but does not make a selection and clicks somewhere on the parent form. Code sample (in parent form):

    Private Sub sFrmEquip_Exit(Cancel As Integer)

    Me.sFrmEquip.Controls("Manufacturer").RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
    

    End Sub

    There is still one piece of this that is not clean. When you click on Manufacturer and have multiple rows in the datasheet grid, Manufacturer field will go blank in other rows (the data underneath the comboboxes is still intact) while you're changing the Manufacturer in the current row. Once you move off this field the text in the other Manufacturer fields will reappear.

    0 讨论(0)
  • 2020-12-06 02:26

    I've just done similar. My solution was to use a fixed row source bound to a query. The query's WHERE clauses reference the form's control i.e. Client=Forms!frmMain!ClientTextBox. This alone will fill the combo boxes with the first row's data. The trick then is to set an 'On Enter' event which simply does a re-query on the combo box e.g. ComboBox1.Requery, this will re-query that combo box alone and will only drag in the data related to that record row.

    Hope that works for you too!

    0 讨论(0)
  • 2020-12-06 02:30

    This seems to work well. CBOsfrmTouchpoint8 is a combobox shortened to just the dropdown square. CBOsfrmTouchpoint14 is a textbox that makes up the rest of the space. Never say never:

      Private Sub CBOsfrmTouchpoint8_Enter()  
    
      If Me.CBOsfrmTouchpoint8.Tag = "Yes" Then  
      CBOsfrmTouchpoint14.SetFocus  
      Me.CBOsfrmTouchpoint8.Tag = "No"  
      Exit Sub  
      End If  
    
      Me.CBOsfrmTouchpoint8.Tag = "No"  
      Me.CBOsfrmTouchpoint8.RowSource = "XXX"  
      Me.CBOsfrmTouchpoint8.Requery  
      Me.CBOsfrmTouchpoint8.SetFocus  
      End Sub 
    
      Private Sub CBOsfrmTouchpoint8_GotFocus()  
      Me.CBOsfrmTouchpoint14.Width = 0  
      Me.CBOsfrmTouchpoint8.Width = 3420  
      Me.CBOsfrmTouchpoint8.Left = 8580  
      Me.CBOsfrmTouchpoint8.Dropdown  
      End Sub
    
      Private Sub CBOsfrmTouchpoint8_LostFocus()  
      Me.CBOsfrmTouchpoint8.RowSource = "XXX"  
      Me.CBOsfrmTouchpoint8.Requery  
      End Sub 
    
      Private Sub CBOsfrmTouchpoint8_Exit(Cancel As Integer)  
      Me.CBOsfrmTouchpoint14.Width = 3180  
      Me.CBOsfrmTouchpoint8.Width = 240  
      Me.CBOsfrmTouchpoint8.Left = 11760  
      Me.CBOsfrmTouchpoint8.Tag = "Yes"  
      End Sub
    
    0 讨论(0)
提交回复
热议问题