У меня есть более простой способ, чем Джиллиган. Кажется, много работы, но на самом деле это не так. Мое решение требует наличия моей непрерывной формы в виде таблицы данных подчиненной формы. В моей подчиненной форме у меня есть два комбинированных списка поиска, среди прочих, называемых «Оборудование» и «Производитель». Оба просто держат длинную целую клавишу в источнике данных. Производитель должен быть отфильтрован по тому, что выбрано в Оборудование. Единственный раз, когда я фильтрую Manufacturer.RowSource, находится в событии Manufacturer_GotFocus.
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
В Manufacturer_LostFocus я также сбрасываю Manufacturer.RowSource для всех производителей. Это необходимо сделать, поскольку при первом щелчке в подчиненной форме события GotFocus запускаются для всех элементов управления, включая «Производитель», даже если вы не обновляете никакие поля.
Private Sub Manufacturer_LostFocus ()
Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
End Sub
В событии Enter производителя вы должны проверить, выбрано ли оборудование, если не установлено фокус на оборудовании.
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
Вам также необходимо запросить комбинированный список «Производитель» в событии Form_Current (т.е. Me.Manufacturer.Requery), и вам следует установить для свойства Cycle этой подчиненной формы значение «Текущая запись».
Кажется, достаточно просто, но вы еще не закончили. Вы также должны сбросить Manufacturer.RowSource для всех производителей в событии SubForm_Exit в родительской форме, если пользователь переходит к списку производителей, но не делает выбор и щелкает где-то в родительской форме. Пример кода (в родительской форме):
Private Sub sFrmEquip_Exit (Отмена как целое число)
Me.sFrmEquip.Controls("Manufacturer").RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
End Sub
Есть еще одна часть этого, которая не чиста. Когда вы щелкаете по «Изготовителю» и имеете несколько строк в сетке таблицы данных, поле «Производитель» становится пустым в других строках (данные под полями со списками остаются без изменений), пока вы меняете «Изготовителя» в текущей строке. Как только вы удалите это поле, появится текст в других полях производителя.