我正在尝试根据父级中的条件抑制某些子表单。
设计将在序列中包含任何子形式,这些子形式将被抑制以从序列中完全删除。
我通过将所有相关子表单放入表格布局并将它们设置为隐藏且高度为 0 来部分完成此操作。这很有效。
但是,子表单未正确呈现,无论是保留的子表单还是返回后未受抑制的子表单均未正确呈现。
我尝试了很多解决方案,包括重新绘制、刷新、专门重新查询子表单(父表单重新查询有效,但它需要重新加载特定记录,并且据我所知,返回时无法保留滚动位置),
DoEvents
,等等...
我不知道还能尝试什么,或者这是否可能。
这是按下按钮以切换状态时执行的代码(以及大量注释,显示了我尝试解决此问题的大部分历史记录)。
Private Sub Command1593_Click()
Dim isVisible As Boolean
isVisible = Not Me!Label1558.Visible
'DoEvents
SuppressControl _
Me!frmQA_NCR_FollowupSent _
, isVisible _
, 2.937 _
, 0.376
'DoEvents
SuppressControl _
Me!Label1558 _
, isVisible _
, 0.556 _
, 0.053
'DoEvents
'Me!frmQA_NCR_FollowupSent.Requery
'DoCmd.Requery "frmQA_NCR_FollowupSent"
'Forms!frmQA_NCR.Recordset.Requery
'Me.Repaint
'DoCmd.RepaintObject acForm, "frmQA_NCR"
'DoEvents
'DoEvents
'DoCmd.RepaintObject acForm, "frmQA_NCR"
'DoEvents
'Me.ScrollBars
'Me.Requery
'Me.Recalc
'Me.Refresh
'Me.Repaint
'DoEvents
End Sub
Private Sub SuppressControl( _
oControl _
, isVisible As Boolean _
, dHeight As Double _
, dPadding As Double _
)
'MsgBox IIf(isVisible, "Visible", "Hidden") + " (" + oControl.Name + ")"
oControl.Visible = isVisible
oControl.Height = IIf(isVisible, dHeight * dTwipsPerCm, 0)
oControl.BottomPadding = IIf(isVisible, dPadding * dTwipsPerCm, 0)
End Sub
这里有一些屏幕截图,描述了初始状态、折叠状态和未折叠状态(如果没有有效地重新查询主窗体的东西,就不可能返回到初始状态)。
初始状态: 折叠状态: ^ 单击此处的灰色框会聚焦可见的子表单,并且似乎是其真实位置,尽管在最初的位置进行了渲染(请注意第二个标签的新位置,即预期的位置)
编辑
所以我注意到第三张图片的一些情况:那里的灰色框对应于第一张图片。我猜对了,如果我抑制并立即取消抑制要抑制的子表单not,它会让它们在正确的位置重新渲染。这是一个肮脏的解决方案,但它确实有效:
' subform(s) suppressed
SuppressControl _
Me!Label1558 _
, isVisible _
, 0.556 _
, 0.053
SuppressControl _
Me!frmQA_NCR_FollowupSent _
, isVisible _
, 2.937 _
, 0.376
' subform(s) kept
SuppressControl _
Me!Child1559 _
, False _
, 2.937 _
, 0.376
SuppressControl _
Me!Child1559 _
, True _
, 2.937 _
, 0.376
我正在编辑而不是回答,以防有人知道更深思熟虑和更少间接的解决方案。
Docmd show form layout
Docmd show form normal