В комментарии lamcro наблюдает в отношении вопроса о том, имеет ли ящик для расчески набор записей:
Когда я взломаю формы VB код
и «Добавить часы» контроль CB,
свойство набора записей находится там. Я могу
даже войти и увидеть его
свойства.
Я вижу это, когда устанавливаю список наблюдения, но набор записей в поле со списком недоступен или не может быть изменен с помощью кода. Чтобы отфильтровать поле со списком, вам нужно поработать с его источником строк.
Это можно сделать одним из двух способов:
- используйте событие, чтобы назначить новый источник строк вашим полям со списком на лету, ИЛИ
- используйте ссылку на элемент управления, значение которого вы хотите отфильтровать в предложении WHERE Rowsource других ваших полей со списком.
Скажем, у вас есть cmbComboBox1, и когда вы выбираете значение в нем, вы хотите, чтобы значения, перечисленные в cmbCombBox2, были отфильтрованы в соответствии со значением, выбранным в cmbComboBox1. Для метода 1 вы должны использовать AfterUpdate первого поля со списком, чтобы установить источник строк для второго:
Private Sub cmbComboBox1_AfterUpdate()
Dim strRowsource As String
strRowsource = "SELECT * FROM MyTable"
If Not IsNull(Me!cmbComboBox1) Then
strRowsource = strRowsource & " WHERE MyField = " & Me!cmbComboBox1
End If
Me!cmbComboBox2.Rowsource = strRowsource
End Sub
Чтобы использовать второй метод, вы должны вместо этого определить Rowsource второго поля со списком, основываясь на тестировании значения первого:
SELECT * FROM MyTable
WHERE (MyField=[Forms]![MyForm]![cmbComboBox1]
AND IsNull([Forms]![MyForm]![cmbComboBox1])=False)
OR IsNull([Forms]![MyForm]![cmbComboBox1])=True
Что это делает, так это фильтрует источник строк, если первое поле со списком имеет значение, а не фильтрует его, если равно значению. То есть вы получаете нефильтрованный список, пока не будет выбрано значение для первого поля со списком.
Затем в событии Afterupdate cmbComboBox1 вы запросите второе поле со списком:
Private Sub cmbComboBox1_AfterUpdate()
Me!cmbComboBox2.Requery
End Sub
Вероятно, также неплохо определить параметр, чтобы гарантировать, что ссылка на элемент управления формой будет соответствующим образом разрешена, поэтому ваш Rowsource будет выглядеть так:
PARAMETERS [Forms]![MyForm]![cmbComboBox1] Long;
SELECT * FROM MyTable
WHERE (MyField=[Forms]![MyForm]![cmbComboBox1]
AND IsNull([Forms]![MyForm]![cmbComboBox1])=False)
OR IsNull([Forms]![MyForm]![cmbComboBox1])=True
(при условии, что вы фильтруете на ПК с Autonumber - если тип данных отличается, вы, конечно, будете использовать другой тип данных)
Я бы предпочел использовать динамическое назначение Rowsource просто потому, что я обнаружил, что оно менее проблематично в разных версиях Access (т. Е. Ссылки на элементы управления в формах не разрешаются одинаково во всех версиях Access).