在Access中打开表单时启用控件

时间:2008-11-07 12:05:17

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

我有一个表单,其控件我想启用/禁用,具体取决于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保存了从表中收到的值。但是,它似乎保留了记录源的第一条记录。

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

5 个答案:

答案 0 :(得分:2)

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

您没有提到您正在使用的Access版本,但我不认为任何版本具有组合框的Recordset属性。

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

答案 1 :(得分:1)

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

然后,一旦表格启动并运行,这就好像组合框已经改变一样。

我之前做过类似的事情,但目前我还没有代码在我面前。我一看到它就会在这里发布更详细的内容,但是我认为这就是我的方式。

答案 2 :(得分:1)

在评论中,lamcro观察梳子盒是否有Recordset的问题:

  

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

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

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

  1. 使用事件动态地为您的组合框分配新的Rowsource,或者
  2. 在其他组合框的Rowsource的WHERE子句中使用对要筛选其值的控件的引用。
  3. 假设您有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
    

    (假设你在Autonumber PK上过滤 - 如果数据类型不同,你当然会使用不同的数据类型)

    我倾向于使用动态Rowsource赋值,因为我发现它在不同的Access版本中的问题较少(即,对表单上的控件的引用在所有版本的Access中都没有以相同的方式解析)。 / p>

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

'检查表单属性

上的键预览

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

Debug.print combobox.value

me.filter =“Key =”& combobox.value

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