我的MS Access (MSO 365 x64 v2004)表单有问题。在表单的详细信息部分,我有一个启用了多项选择的列表框。表单有一个页脚("frmOptions"),默认情况下是隐藏的。当在列表框中选择了多个项目并取消隐藏页脚(frmOptions.visible=true)时,由于某种原因,所有选择都会被清除。仅当将页脚的可见性设置为true时才会发生这种情况。隐藏窗体页脚似乎对列表框选择没有任何影响。当然,我可以编写一个函数,再次恢复选择,但这应该不是必需的。列表框没有Beforeupdate/Afterupdate例程。隐藏/取消隐藏页脚的代码如下:
Private Sub btn_options_Click()
If Me.frmOptions.Visible Then
Me.frmOptions.Visible = False
Else
Me.frmOptions.Visible = True
End If
End Sub在这段代码中有没有我必须考虑的东西,也许是列表框或窗体页脚的设置,以防止列表框中不需要的取消选择?
感谢您的帮助!
艺术。
发布于 2020-09-30 00:10:02
感谢您的回复!太糟糕了,这可能是故意的。我现在基于表单代码和新函数中的以下更改解决了这个问题。对代码的任何改进都是非常受欢迎的)
更改了表单代码中的过程:
Private Sub btn_options_Click()
Dim varSelItems() As Variant
varSelItems = ListBoxItems(Me, "customer_contact_cat") 'Save the listbox selections
Me.frmOptions.Visible = Not Me.frmOptions.Visible
Call ListBoxItems(Me, "customer_contact_cat", varSelItems) 'Restore the listbox Selections
End Sub在模块中添加了功能,以便可以在其他形式中重用:
Public Function ListBoxItems(frmName As Form, strLbName As String, Optional varSelItems As Variant) As Variant
Dim lngA As Long
Dim lngB As Long
Dim ctl As Control
Dim varItem As Variant
Dim varItems() As Variant
Set ctl = frmName.Controls(strLbName)
If Not IsArray(varSelItems) Then
ReDim varItems(ctl.ItemsSelected.Count)
lngA = 0
For Each varItem In ctl.ItemsSelected
varItems(lngA) = ctl.ItemData(varItem)
lngA = lngA + 1
Next varItem
ListBoxItems = varItems()
Else
For lngA = 0 To UBound(varSelItems) - 1
For lngB = 0 To ctl.ListCount - 1
If ctl.ItemData(lngB) = varSelItems(lngA) Then
ctl.Selected(lngB) = True
End If
Next lngB
Next lngA
End If
End Function发布于 2020-09-29 20:09:45
首先,你的代码可以简化为:
Private Sub btn_options_Click()
Me.frmOptions.Visible = Not Me.frmOptions.Visible
End Sub接下来,我可以重现这段代码,但不知道为什么。会试着找出一个解释。
很可能,这是出于某种原因而设计的,在不久的将来不会改变,也许永远不会改变。因此,您也可以开始编写重新选择列表框项目的程序。
发布于 2020-09-29 20:34:47
我也可以重现这种行为,我也认为你必须接受这一点。
解决方法是调整页脚的大小,而不是隐藏它。
在窗体中添加一个类变量mFooterHeight,并在其中存储打开窗体时的页脚高度。
Private mFrmOptionsInitialHeight As Long
Private Sub Form_Open(Cancel As Integer)
mFrmOptionsInitialHeight = Me.frmOptions.Height
End Sub然后,您可以使用以下代码行来切换页脚的大小:
Me.frmOptions.Height = IIf(Me.frmOptions.Height = 0, mFrmOptionsInitialHeight, 0)https://stackoverflow.com/questions/64119085
复制相似问题