【问题标题】:Enabling controls at moment of opening a form in Access在 Access 中打开表单时启用控件
【发布时间】:2010-09-21 06:35:45
【问题描述】:

我有一个表单,我想根据 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 保存了从表中收到的值。但是,它似乎保存了来自记录源的第一条记录。

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

【问题讨论】:

  • 您在帖子中说“组合框记录集”时是指“Rowsource”吗?记录集和行源根本不是一回事。

标签: ms-access forms combobox recordset access-control


【解决方案1】:

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

当我闯入表单时 VB 代码 和“添加监视” CB 控件, 记录集属性在那里。我能 甚至进入并看到它是自己的 特性。

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

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

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

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

(假设您正在过滤自动编号 PK ——如果数据类型不同,您当然会使用不同的数据类型)

我倾向于使用动态 Rowsource 分配,只是因为我发现它在不同的 Access 版本中问题较少(即,对表单控件的引用在所有版本的 Access 中的解析方式不同)。

【讨论】:

    【解决方案2】:

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

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

    Debug.print combobox.value

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我有一个绑定的 CB 更新表中的字段,但我希望根据从 CB 列表中选择的选项修改表单的其余控件。
      • 注意:ComboBox 控件确实有一个记录集属性(我现在正在它的 VB 帮助文件中阅读它)。记录集保存 CB 的列表。
      • 恐怕我必须争辩。你能引用 VBA(不是 VB)帮助文件中的部分吗?组合框有一个可以引用记录集的 RowSource 属性,但没有记录集属性。您可以使用智能感知或对象浏览器看到这一点。
      • 不知道是不是VBA帮助文件。当我闯入表单 VB 代码并“添加监视”CB 控件时,记录集属性就在那里。我什至可以进入并查看它自己的属性。我输入它提供给我的帮助文件。
      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多