代码之家  ›  专栏  ›  技术社区  ›  lamcro

在Access中打开窗体时启用控件

  •  0
  • lamcro  · 技术社区  · 16 年前

    我有一个窗体,我希望根据组合框控件中的值启用/禁用该窗体的控件。与表单中所有其他控件一样,此组合框控件链接到表。在组合框的change事件中,我放置了启用/禁用其他控件的代码。

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

    我注意到的一件事是,组合框中的记录集控件通常不会更改为组合框的value属性中显示的值。

    我试着用
    combobox.recordset.filter = "Key = " & combobox.value
    但我明白了
    Operation is not supported for this type of object.


    更新

    我想我的问题应该在如何访问combobox.recordset中的值上做得更多。我的印象是combobox.recordset保存了从表中接收到的值。但是,它似乎保存了来自记录源的第一条记录。

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

    5 回复  |  直到 11 年前
        1
  •  2
  •   Fionnuala    16 年前

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

    您没有提到正在使用的访问版本,但我认为任何版本都没有组合框的记录集属性。

    是否要将组合框设置为特定值?

        2
  •  1
  •   Jimoc    16 年前

    一种方法是将combobox.change()放在form.current()方法中。

    然后,当窗体启动并运行时,此操作将视为组合框已更改。

    我以前也做过类似的事情,但是我现在没有代码在我面前。一旦我看到它,我会把它贴在这里更详细,但从我的头上,我相信这是我做的方式。

        3
  •  1
  •   sth    11 年前

    在评论中,lamcro注意到梳齿盒是否有记录集的问题:

    当我进入窗体vb代码时 和“添加监视”CB控件, 记录集属性在其中。我可以 甚至进去看看它是自己的 性质。

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

    这可以通过以下两种方式之一实现:

    1. 使用事件动态地将新的行源分配给组合框,或
    2. 在其他组合框的rowsource的where子句中,使用对要筛选其值的控件的引用。

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

    要使用第二种方法,您可以定义第二个组合框的行源,以基于测试第一个组合框的值:

    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
    

    为了确保对表单控件的引用得到适当的解析,最好定义一个参数,因此您的行源应该是:

    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分配,这仅仅是因为我发现在不同的访问版本中它的问题较少(即,在所有的访问版本中,对窗体上控件的引用并不是以相同的方式解决的)。

        4
  •  0
  •   Fionnuala    16 年前

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

    编辑 我还不清楚你想做什么。根据您的注释,在选择选项时修改控件是否有问题,或者在窗体打开时设置组合的值是否有问题?是否要更改组合的行源,可能如原始文章所暗示的那样?

        5
  •  0
  •   JibberSki    16 年前

    '检查窗体属性上的密钥预览

    'debug here for combobox.value(ctrl+g表示调试窗口)

    debug.print组合框.value

    me.filter=“key=”&组合框.value

    '潜在的me.reload或me.refresh,具体取决于MS Access版本