通过表单事件过程中的函数填充访问文本框

Posted

技术标签:

【中文标题】通过表单事件过程中的函数填充访问文本框【英文标题】:Populate a text box on an access for via a function in the form's event procedure 【发布时间】:2016-08-03 23:04:36 【问题描述】:

我有一个访问数据库,它有一个带有一些文本框和一些复选框的搜索表单。 用户通过输入文本或选中其中一个框来选择要在搜索表单上收集哪些值。单击搜索按钮时,会打开相应的结果表单。

结果表单的数据源是一个查询,它给出了表中与请求的搜索相对应的记录列表。在查询中,我有 2 个 IIf 字段,1 将 2 个复选框组合成一个文本句子,表示在记录中选中的这 2 个框中的一个或两个,另一个组合 3 个复选框。结果表单上有 2 个文本字段,其数据源是 2 个 IIf 查询字段。

结果表单上有第三个(未绑定)文本字段,我还有 9 个剩余的复选框,我需要将它们组合成该字段的一个句子。我已经在结果表单的打开事件中尝试了这个功能(Oth)。该函数似乎有效,因为它在 MsgBox(fOther) 中为每条记录提供了正确的句子,但我无法让 fOther 填充结果表单上的未绑定文本字段。我已经尝试了几种不同的方式,表单的记录集,查询的,表格的。我尝试在模块中放置一个(类似的)函数,并在更新查询中使用该函数来获取表中的字段。我无法填充该(其他)字段。我已经尝试在该(其他)文本字段的查询中构建一个 IIf 字段,这对于 9 个对象和所有可能的组合来说非常令人生畏,我什至不确定它是否可能。有什么建议可以提供吗?

Private Sub Oth()
  Dim strOthr(9) As String
  Dim Tt As Integer
  Dim fOther As String

  Me.Recordset.MoveFirst

  Do While Not Recordset.EOF
    If Me.[o-180] Then
      strOthr(0) = "180"
    End If

    If Me.[o-e] Then
      strOthr(1) = "Education"
    End If

    If Me.[o-rcb-f] Then
      strOthr(2) = "Flag"
    End If

    If Me.[o-rcb-m] Then
      strOthr(3) = "Medal"
    End If

    If Me.[o-rcb-b] Then
      strOthr(4) = "Burial"
    End If

    If Me.[o-ra-hb] Then
      strOthr(5) = "Health Benefits"
    End If

    If Me.[o-ra-t] Then
      strOthr(6) = "Transportation"
    End If

    If Me.[o-ra-hl] Then
      strOthr(7) = "Home Loans"
    End If

    If Me.[o-ra-il] Then
      strOthr(8) = "Income Letter"
    End If

    For Tt = 0 To 8
      If Len(strOthr(Tt)) > 0 Then
        If Len(fOther) > 0 Then
          fOther = fOther & ", " & strOthr(Tt)
        Else
          fOther = fOther & strOthr(Tt)
        End If
      End If
    Next Tt

    Me.Other = fOther

    MsgBox fOther

    For Tt = 0 To 8
      strOthr(Tt) = ""
    Next Tt
    fOther = ""

    Me.Recordset.MoveNext
  Loop
End Sub

【问题讨论】:

为什么不让结果表单成为搜索表单的子表单,而让其他表单成为搜索表单上的未绑定控件? 【参考方案1】:

我不得不重新阅读。因此,如果 Other 是您的结果表单上的一个字段,那么它不应该是

Me.other = fother

但是

Forms!Resultform.form!other = fother

然后对于您的搜索条件,您可能只想构建一个 WHERE 子句,您可以添加到 SQL 字符串中以设置为结果表单记录源,或者使用整个表/查询作为结果表单设置为过滤器属性记录来源

dim strfilter as string    
If me.[a-b-c] then 
    strfilter = strfilter & "[fld] = " & Chr(34) & "txtcriteria" & Chr(34) & " AND "
End If
If me.[b-x-y] then
    'repeat 
End if
'repeat if for each expression
strfilter = left(strfilter, len(strfilter) - 5)
With forms!frmResuls.form
    .filter = strfilter
    .filteron = true 
End With 
'or
forms!frmResults.form.recordsource = "SELECT * from tbl WHERE " & strfilter & ";"

【讨论】:

谢谢先生的回答。当我将该行更改为 Forms!sitV.form!Other = fOther 时,它仍然不会填充(其他)文本字段。此外,在函数中使用该行时,MsgBox 不会出现。为什么你能告诉我?保重 如果 eof 为真,您将永远不会有 msgbox。尝试完全删除 me.recordset.movefirst 和 Do 循环。如果我理解正确,您的搜索表单甚至不应该绑定到表格或有记录集。您只需要运行通过 if 语句建立标准的控件。 搜索结果表单的数据源是查询。其他字段是通过组合每条记录中的 9 个控件中的任何一个来获得的。我会尝试你的建议并让你知道。我可能已经找到了我的解决方案 - 我会将 9 个控件与 3 组每个 IIf 组合 3 个,然后将这 3 个组合成 1 个。我会尝试并让你知道。感谢您的所有帮助。 我的新解决方案有效,3 在查询中合并为 1,1 是结果表单上文本框的数据源。不知道为什么我以前没有想到这一点,我想可能是在发布问题时,灰质被推了一下。无论如何,我当然感谢您的帮助 酷。是的,我知道这是怎么回事。编码愉快。

以上是关于通过表单事件过程中的函数填充访问文本框的主要内容,如果未能解决你的问题,请参考以下文章

如何根据每条记录的连续表单中 ms-access 中的其他值填充文本框上的值

使用组合框中的选择填充文本框中的计算字段

访问 VBA - 使用 VBA 的 SQL 语句使用文本框组合框值在表单上填充列表框 OR

访问表单:在文本框中捕获日期更改

访问表单 VBA ComboBox 点击事件

Excel VBA文本框以填充组合框