【问题标题】:Access 2010 VBA ControlSource Loop访问 2010 VBA 控制源循环
【发布时间】:2015-07-27 11:07:26
【问题描述】:

我在表单上有多个字段,在将数据输入到该字段之前,这些字段没有关联的值。在这一点上,这些控件具有 #Name? 值。我要做的就是使用循环隐藏字段,而不是编写 If 语句。这是使用单个 If 语句隐藏所述字段的代码。

If Not Me.txtField.ControlSource = "#Name?" Then
   Me.txtField.ColumnHidden = True
End If

我似乎无法弄清楚如何隐藏具有#Name 的多个控件?旗帜。任何帮助将不胜感激。

Dim ctl As Control
Dim ctlError As String

ctlError = "#Name?"

 For Each ctl In Me.Controls
     If Not ctl.ItemsSelected(txtField) = ctlError Then
          ctl.ColumnHidden = True
     End If
 Next ctl

编辑: 在主窗体上有一个带有交叉表查询的子窗体。但问题是查询的结果是从组合框中填充的。因此,我将查询中尚不可用的字段添加到子表单并以#Name 结尾?附上一张截图,以更好地说明问题。

我有 90% 的机会在这个过程中做错了,所以现在这是一个学习过程。

【问题讨论】:

  • .ColumnHidden 属性仅适用于数据表表单中的列。

标签: ms-access


【解决方案1】:

如果您描述了代码引发的特定错误,则更容易解决这个问题。这个答案假设有问题的控件是一个 TextBox。

“#姓名?”表示控件的 ControlSource 引用了不在表单的 RecordSource 中的字段。例如,如果您的查询有两个字段(例如 ID 和 BirthDate),并且您的表单有三个控件,ControlSource 分别为“ID”、“BirthDate”和“BirthCountry”,那么 RecordSource 为“BirthCountry”的控件将显示“#Name?”。但是,它的值不是“#Name?”。相反,调用 Value 属性会引发错误 2424(带有相当无用的消息“您输入的表达式具有 Microsoft Office Access 找不到的字段、控件或属性名称”)。

我知道检查字符串“#Name”的唯一方法?是通过控件的Text属性,只有当控件有焦点时才可用,所以帮助不大。如果您检索 ControlSource 属性的值,您将获得“BirthCountry”(当然)。因此,您可以对照表单的 RecordsetClone 字段检查表单上的所有 ControlSource(请添加错误处理):

For Each ctl In Controls
    If Not RecordSourceContains(ctl.ControlSource) Then
        ctl.Visible = False
    End If
Next

Function RecordSourceContains(strFieldName as String) As Boolean
    Dim fld As Field
    For Each fld In RecordsetClone.Fields
        If fld.Name = strFieldName Then
            RecordSourceContains = True
            Exit For
        End If
    Next
End Function

您可能还想做一些其他的簿记工作。例如,您想检查表达式控制源(以“=”开头),因为它们不在 RecordSource 中。您还需要处理错误 438(对象不支持此属性或方法)或检查每个控件的类型以确保它具有 ControlSource 属性。

【讨论】:

  • 我没有产生任何错误,我只是试图隐藏交叉表查询尚未生成的子表单上的任何控件。并且在出现新值的情况下,它不再隐藏表单上不相关的控件。希望这是有道理的。
  • 好的,但是您在原帖中的 IF 语句有问题。它说“如果 ControlSource 不是 '#Name?'然后隐藏控件”。 ControlSource 永远不会是“#Name?”,因此控件将始终被隐藏。有意义吗?
【解决方案2】:

在表单的设计视图中,控件源的字段表示什么?它应该是空白的,这意味着表单是未绑定的。如果不是,则说明#Name。

更多信息:http://www.databasedev.co.uk/unbound-forms-add-data.html

【讨论】:

  • 它不是未绑定的,我现在将其设置为未绑定我只是想让 For Each 循环通过每个控件并在文本框中没有输入值时隐藏该控件。
【解决方案3】:

这是我用来处理该问题的代码:

Sub setControl
    ''  You can use this in your loop
    Call FieldEnable(subFrm, "boxQty", booSellSet)
End Sub

''----------------

Private Sub FieldEnable(subFrm As Access.Form, strCtlName As String, _
                                booEnableMe As Boolean)
On Error GoTo errHandler
    subFrm(strCtlName).Enabled = booEnableMe
    subFrm(strCtlName).Visible = booEnableMe

errExit:
    Exit Sub
errHandler:
    If Err.Number = 2164 Or Err.Number = 2165 Then ''control has the focus
        Resume Next
    Else
        DoCmd.Hourglass False
        Screen.Application.Echo True
        MsgBox "Problem with control named " & strCtlName
        Resume errExit

    End If

End Sub

我必须调整表单上的许多字段,所以这是非常可重用的。我可能会“打开”或“关闭”它们;这可以解决任何一个问题。如果您有任何问题,请告诉我。

归结为这种隐藏字段的方法:

    Control.Enabled = False
    Control.Visible = False

【讨论】:

  • 真的有必要禁用隐藏字段吗?
【解决方案4】:

从表中删除字段黑色。 然后再次制作表格中的黑色字段。

【讨论】:

    猜你喜欢
    • 2014-03-11
    • 2011-04-24
    • 2015-09-29
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多