Включение элементов управления в момент открытия формы в Access - PullRequest
0 голосов
/ 07 ноября 2008

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

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

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

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


Обновление

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

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

Ответы [ 5 ]

2 голосов
/ 07 ноября 2008

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

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

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

1 голос
/ 08 ноября 2008

В комментарии lamcro наблюдает в отношении вопроса о том, имеет ли ящик для расчески набор записей:

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

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

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

  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 - если тип данных отличается, вы, конечно, будете использовать другой тип данных)

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

1 голос
/ 07 ноября 2008

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

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

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

0 голосов
/ 07 ноября 2008

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

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

Debug.print combobox.value

me.filter = "Key =" & combobox.value

'Потенциальный me.reload или me.refresh в зависимости от версии доступа MS

0 голосов
/ 07 ноября 2008

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

EDIT Я до сих пор не понимаю, что вы хотите сделать. Возникают ли у вас проблемы с изменением элементов управления при выборе параметра, как указано в вашем комментарии, или у вас возникают проблемы с установкой значения комбо при открытии формы? Вы хотите изменить RowSource комбо, возможно, как подразумевается в вашем исходном сообщении?

...