0

我有一个表单,我想根据 ComboBox 控件中的值启用/禁用其控件。与表单中的所有其他控件一样,此 ComboBox 控件链接到表。在 ComboBox 的 Change 事件中,我放置了启用/禁用其他控件的代码。

我遇到的问题是,当我打开表单时,控件未启用/禁用。我必须重新选择 ComboBox 值以启用或禁用所有其他控件。

我注意到的一件事是 ComboBox 内的 RecordSet 控件通常不会更改为 ComboBox 的 value 属性中显示的值。

我尝试使用
combobox.recordset.filter = "Key = " & combobox.value
但出现错误
Operation is not supported for this type of object.


更新

我认为我的问题必须在如何访问combobox.recordset 中的值方面做得更多。我的印象是 combobox.recordset 保存了从表中收到的值。但是,它似乎拥有来自记录源的第一条记录。

我猜我需要通过使用另一个记录集对象来搜索我需要的那些值。

4

5 回答 5

2

大多数访问控制事件不是由对控件的编程更改触发的。您可能希望调用代码以从表单的加载事件中启用控件。

您没有提及您正在使用的 Access 版本,但我不相信任何版本都具有组合框的 Recordset 属性。

您是否希望将组合框设置为特定值?

于 2008-11-07T12:13:01.023 回答
1

在评论中,lamcro 观察了梳状框是否具有 Recordset 的问题:

当我进入表单 VB 代码并“添加观察”CB 控件时,记录集属性就在那里。我什至可以进入并查看它自己的属性。

我在设置监视列表时看到了它,但是组合框的记录集无法通过代码访问或更改。为了过滤组合框,您需要使用它的 Rowsource。

这可以通过以下两种方式之一来完成:

  1. 使用事件为您的组合框动态分配新的行源,或者
  2. 使用对要在其他组合框的 Rowsource 的 WHERE 子句中过滤其值的控件的引用。

假设您有 cmbComboBox1,当您在其中选择一个值时,您希望根据 cmbComboBox1 中选择的值过滤 cmbComboBox2 中列出的值。对于方法 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

如果第一个组合框有值,则过滤行源,如果有值,则不过滤它。也就是说,您将获得一个未经过滤的列表,直到为第一个组合框选择了一个值。

然后,在 cmbComboBox1 的 Afterupdate 事件中,您将重新查询第二个组合框:

  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 中的解析方式不同)。

于 2008-11-08T03:18:41.600 回答
1

在这里尝试做的一种方法是将 combobox.change() 放在 form.current() 方法中。

然后,一旦表单启动并运行,这将就像组合框已更改一样。

我以前做过类似的事情,但目前我面前没有代码。一旦我看到它,我会在这里更详细地发布它,但我相信这是我做的方式。

于 2008-11-07T12:09:29.423 回答
0

'在表单属性上检查您的密钥预览

'在这里调试combobox.value (Ctrl+G 调试窗口)

调试.打印组合框.值

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

'潜在的 me.reload 或 me.refresh 取决于 ms 访问版本

于 2008-11-07T17:43:57.423 回答
0

你能解释一下你有什么类型的组合框以及你想做什么吗?例如,您是否有一个未绑定的组合框,用于查找表单的记录,或者您是否有一个绑定的组合框,用于更新表中的字段?这是由 RowSource 和 ControlSource 属性控制的,Comboboxes 没有记录集属性。当您打开表单时,未绑定的组合框不会有值,当您从一个记录移动到另一个记录时,该值也不会改变,但是使用当前事件分配一个值很容易。

编辑我仍然不清楚你想做什么。根据您的评论,在选择选项时修改控件时是否遇到问题,或者在打开表单时设置组合值时遇到问题?您是否想更改组合的 RowSource,也许正如您的原始帖子所暗示的那样?

于 2008-11-07T13:48:14.140 回答