我在动态分配 OnMouseMove 事件时遇到问题。
在一份报告中,我有数百个按钮,我为其分配了一个 OnClick 事件。此事件通过在调用中使用条件 WHERE 打开另一个报表。我通过提取 Button 的名称(包括其编号)、提取该编号并将其作为函数的参数提供给它来做到这一点。
这运作良好,正确的报告打开。我认为,没有检查,这个论点是正确的。
它的工作原理如下:
在报告的初始化函数中,我有
For Each ctl In Me.Controls
If ctl.ControlType = acCommandButton Then
nSekNr = ParseNumber(ctl.Name, 6)
ctl.OnClick = "=MapButtonClick('" & sBtnName & "', '" & nSekNr & "')"
[...]
ParseNumber 函数只包括
ParseNumber = Right(ctlName, (Len(ctlName) - z))
然后,我的点击功能如下
Public Function MapButtonClick(ByVal sBtnName As String, ByVal nSekNr As Byte)
DoCmd.Minimize
DoCmd.Close acReport, "repSektion"
DoCmd.OpenReport "repSektion", acViewPreview, , "[SekID] = " & nSekNr
End Function
当我单击每个按钮时,这可以工作并打开正确的报告。(是的,我知道不需要一个参数,这只是我尝试的其他东西的结转)
现在:我想使用标签和 OnMouseMove 在报告中显示按钮的编号,以便用户在单击按钮之前可以看到部分 ID。
麻烦的是,当我复制我的函数时,Access 似乎没有将 nSekNr 变量作为参数发送。我通过使用新功能来做到这一点
Public Function MapButtonShowID(sBtnName As String, nSekNr As Integer)
Me.sekshow.Visible = True
Me.sekshow.Caption = "Sektion: " & sSekNr
End Function
其中 sekshow 是一个空标签。我像这样在点击事件的初始化下方调用它
For Each ctl In Me.Controls
If ctl.ControlType = acCommandButton Then
nSekNr = ParseNumber(ctl.Name, 6)
ctl.OnClick = "=MapButtonClick('" & sBtnName & "', '" & nSekNr & "')"
ctl.OnMouseMove = "=MapButtonShowId('" & sBtnName & "', '" & nSekNr & "')"
[...]
这给了我一个空的“Sektion:”,没有报告上的数字。
现在开始奇怪的事情:我通过添加一个 MsbBox 来检查 nSekNr 是否正确地赋予了任一函数。我的意思是,如果点击事件有效,那是因为给出了正确的 nSekNr。结果这两个函数都没有接收到变量——它是空的!
但是为什么我的点击事件会起作用呢?有问题的报告实际上没有任何内部过滤,它只是显示一些数据的基本报告。
我搞不清楚了。
手动分配事件几乎不是一种选择,因为有很多。
也许有一种方法可以正确地做到这一点,并弄清楚为什么即使参数为空,点击事件仍然有效?