Включение элементов управления в момент открытия формы в Access

У меня есть форма, элементы управления которой я хочу включить/отключить в зависимости от значений в элементе управления ComboBox. Этот элемент управления ComboBox, как и все другие элементы управления в форме, связан с таблицей. Внутри события ComboBox Change я поместил код, который включает/отключает другие элементы управления.

У меня проблема в том, что когда я открываю форму, элементы управления не включаются/отключаются. Мне нужно повторно выбрать значение ComboBox, чтобы включить или отключить все остальные элементы управления.

Одна вещь, которую я заметил, заключается в том, что элемент управления RecordSet внутри ComboBox часто не изменяется на значение, отображаемое в свойстве value ComboBox.

Я пытался использовать
combobox.recordset.filter = "Key = " & combobox.value
, но получаю сообщение об ошибке
Operation is not supported for this type of object.


Обновлять

Я думаю, что моя проблема заключается в том, как я получаю доступ к значениям в combobox.recordset. У меня сложилось впечатление, что combobox.recordset содержит значение, полученное из таблицы. Но, похоже, он содержит первую запись из источника записей.

Я предполагаю, что мне нужно будет искать те значения, которые мне нужны, используя другой объект набора записей.


person lamcro    schedule 07.11.2008    source источник
comment
Вы имеете в виду Rowsource, когда говорите набор записей со списком в своем посте? Набор записей и источник строк — это совсем не одно и то же.   -  person David-W-Fenton    schedule 08.11.2008


Ответы (5)


Большинство событий управления доступом не инициируются программными изменениями элемента управления. Вы можете вызвать код, чтобы включить элементы управления из события загрузки формы.

Вы не указываете версию Access, которую используете, но я не верю, что какая-либо версия имеет свойство Recordset для полей со списком.

Вы хотели установить для поля со списком определенное значение?

person Fionnuala    schedule 07.11.2008

Один из способов сделать то, что вы здесь пытаетесь, — поместить combobox.change() внутрь метода form.current().

Это будет действовать так, как если бы поле со списком было изменено, как только форма будет запущена и запущена.

Я делал что-то подобное раньше, но в данный момент передо мной нет кода. Как только я посмотрю на это, я опубликую это здесь более подробно, но с головы до ног я считаю, что это было так, как я это сделал.

person Jimoc    schedule 07.11.2008

В комментарии lamcro замечает относительно вопроса о том, есть ли в гребенке набор записей:

Когда я взламываю код VB форм и «Добавляю часы» в элемент управления CB, свойство набора записей находится там. Я даже могу войти и увидеть его собственные свойства.

Я вижу это, когда устанавливаю список наблюдения, но набор записей поля со списком недоступен или не может быть изменен с помощью кода. Чтобы отфильтровать поле со списком, вам нужно работать с его Rowsource.

Это может быть выполнено одним из двух способов:

  1. используйте событие, чтобы назначить новый источник строк вашим полям со списком на лету, ИЛИ
  2. используйте ссылку на элемент управления, значение которого вы хотите отфильтровать, в предложении 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 PK - если тип данных другой, вы, конечно, будете использовать другой тип данных)

Я бы предпочел использовать динамическое назначение Rowsource просто потому, что я обнаружил, что оно менее проблематично в разных версиях Access (т. е. ссылки на элементы управления в формах не разрешаются одинаково во всех версиях Access).

person David-W-Fenton    schedule 08.11.2008

Можете ли вы объяснить, какой тип выпадающего списка у вас есть и что вы хотите сделать, пожалуйста? Например, есть ли у вас несвязанное поле со списком, которое используется для поиска записей для вашей формы, или у вас есть связанное поле со списком, которое используется для обновления полей в таблице? Это контролируется свойствами RowSource и ControlSource, поля со списком не имеют свойства набора записей. Несвязанное поле со списком не будет иметь значения при открытии формы, и значение не изменится при переходе от записи к записи, но достаточно просто присвоить значение, используя текущее событие.

РЕДАКТИРОВАТЬ Я до сих пор не понимаю, что вы хотите сделать. У вас возникли проблемы с изменением элементов управления при выборе параметра в соответствии с вашим комментарием или у вас возникли проблемы с установкой значения комбинации при открытии формы? Возможно, вы хотите изменить RowSource комбо, как это подразумевается в вашем исходном сообщении?

person Fionnuala    schedule 07.11.2008
comment
У меня есть связанный CB, который обновляет поле в таблице, но я хочу, чтобы остальная часть элемента управления формы изменялась в зависимости от параметра, выбранного из списка CB. - person lamcro; 07.11.2008
comment
ПРИМЕЧАНИЕ. Элементы управления ComboBox имеют свойство набора записей (я читаю его прямо сейчас в файле справки VB). Набор записей содержит список CB. - person lamcro; 07.11.2008
comment
Боюсь, я должен возразить. Можете ли вы процитировать раздел из файла справки VBA (не VB)? Поле со списком имеет свойство RowSource, которое может ссылаться на набор записей, но не имеет свойства набора записей. Вы можете увидеть это с помощью intellisense или обозревателя объектов. - person Fionnuala; 07.11.2008
comment
Я не знаю, является ли это файлом справки VBA. Когда я взламываю код VB форм и добавляю контроль CB, свойство набора записей находится там. Я даже могу войти и увидеть его собственные свойства. Я вхожу в файл справки, который он мне представляет. - person lamcro; 07.11.2008

'Проверьте предварительный просмотр ключа в свойствах формы

'Отладка здесь для combobox.value (Ctrl+G для окна отладки)

Debug.print combobox.value

me.filter = "Ключ = " & combobox.value

'Возможно me.reload или me.refresh в зависимости от версии MS Access

person JibberSki    schedule 07.11.2008