如何在 MS Access 中重新绘制和调整子报表控件的大小 VBA
How to repaint and resize a subreport control in MS Access VBA
我有一份名为 rptClientCareAll 的 parent 报告。它由 3 个子报表控件组成。用户可以选择隐藏其中一个子报表的详细信息(如果相关,这是用于隐藏子报表详细信息的代码:me.detail.visible = false
)。
问题 #1:当我独立于 parent 报表打开子报表时(有时报表将显示为独立报表,有时显示为子报表,所以我需要它在这两种情况下都能工作),详细信息被隐藏,但报告不是 "repainted"--因此,报告看起来一团糟,因为页脚现在显示在 header 的正下方,但详细信息不是 "erased"从屏幕上。我如何 "repaint" 报告以便删除详细信息?可以重新绘制表格,但我似乎无法重新绘制报表。
问题 #2:当我打开 parent 报表然后选择隐藏子报表的详细信息时,详细信息被正确隐藏并且 "erased"(与上面的问题 #1 不同;很奇怪! ), 但是,子报表的大小并没有缩小,因此,隐藏详细信息的全部要点都丢失了,因为 parent 报表上有这么大的空白 space ,其中使用了子报表的详细信息出现。隐藏详细信息时如何使子报表缩小?我已尝试将所有报表(parent 和子报表)详细信息部分的 Can Grow 和 Can Shrink 属性设置为 Yes,但这没有帮助。
注意:我在 acReportView 中显示报告,而不是 acViewPreview。似乎这可能会对触发的事件产生影响?
所以,基本上问题 #1(报表是独立打开的,不是作为子报表)在用户选择隐藏细节后通过简单的 Me.Requery 解决了部分。
问题 #2 显然无法在不关闭并重新加载报告的情况下解决,这在我的案例中说起来容易做起来难。
针对我的情况,我添加了代码来执行以下操作:
- 当用户点击将子报表的详细信息切换为hidden/visible时,(a) 设置一个全局变量标志(布尔类型)以指示详细信息部分现在是隐藏(false)还是可见(true),(b) 设置不同的全局变量以指示需要重新打开报表,以及 (c) 关闭报表。
- 在我的例子中,在父报表的关闭事件中,我不得不在关闭报表时打开一个表单,因为我需要该表单来重新打开报表(如果用于重新打开报表的全局变量被设置为 True)一旦它被关闭,因为我无法找到一种方法来关闭并重新打开报告本身。在表单中,我设置了一个计时器事件,在 333 毫秒 (TimerInterval = 333) 后触发,它会重新打开报表并关闭表单本身。 (当我试图在表单的打开事件中重新打开报表时,报表永远不会真正打开,所以我添加了计时器来延迟足够长的时间,让报表在尝试重新打开之前完全关闭。)(当然,如果重新打开报表的全局变量为False,则窗体直接关闭。)
- 在详细部分在hidden/visible之间切换的子报表中,在Open事件中,使用Me.Detail.Visible = {globalvariableflag}并将重新加载报表的全局变量设置为False(自报表现已重新加载)。
它很笨拙,但这是我能找到的根据需要隐藏和缩小细节部分的唯一方法。
在 ON LOAD 事件中使用以下代码:
Private Sub Form_Load()
Dim C As Control
For Each C In Me.Form
If TypeOf C Is TextBox Then
If IsNull(C) Or C = "" Or C = 0 Or C = "0" Then
C.Visible = False
C.Height = 0
Else
C.Visible = True
End If
End If
Next C
Me.Requery
End Sub
我有一份名为 rptClientCareAll 的 parent 报告。它由 3 个子报表控件组成。用户可以选择隐藏其中一个子报表的详细信息(如果相关,这是用于隐藏子报表详细信息的代码:me.detail.visible = false
)。
问题 #1:当我独立于 parent 报表打开子报表时(有时报表将显示为独立报表,有时显示为子报表,所以我需要它在这两种情况下都能工作),详细信息被隐藏,但报告不是 "repainted"--因此,报告看起来一团糟,因为页脚现在显示在 header 的正下方,但详细信息不是 "erased"从屏幕上。我如何 "repaint" 报告以便删除详细信息?可以重新绘制表格,但我似乎无法重新绘制报表。
问题 #2:当我打开 parent 报表然后选择隐藏子报表的详细信息时,详细信息被正确隐藏并且 "erased"(与上面的问题 #1 不同;很奇怪! ), 但是,子报表的大小并没有缩小,因此,隐藏详细信息的全部要点都丢失了,因为 parent 报表上有这么大的空白 space ,其中使用了子报表的详细信息出现。隐藏详细信息时如何使子报表缩小?我已尝试将所有报表(parent 和子报表)详细信息部分的 Can Grow 和 Can Shrink 属性设置为 Yes,但这没有帮助。
注意:我在 acReportView 中显示报告,而不是 acViewPreview。似乎这可能会对触发的事件产生影响?
所以,基本上问题 #1(报表是独立打开的,不是作为子报表)在用户选择隐藏细节后通过简单的 Me.Requery 解决了部分。
问题 #2 显然无法在不关闭并重新加载报告的情况下解决,这在我的案例中说起来容易做起来难。
针对我的情况,我添加了代码来执行以下操作:
- 当用户点击将子报表的详细信息切换为hidden/visible时,(a) 设置一个全局变量标志(布尔类型)以指示详细信息部分现在是隐藏(false)还是可见(true),(b) 设置不同的全局变量以指示需要重新打开报表,以及 (c) 关闭报表。
- 在我的例子中,在父报表的关闭事件中,我不得不在关闭报表时打开一个表单,因为我需要该表单来重新打开报表(如果用于重新打开报表的全局变量被设置为 True)一旦它被关闭,因为我无法找到一种方法来关闭并重新打开报告本身。在表单中,我设置了一个计时器事件,在 333 毫秒 (TimerInterval = 333) 后触发,它会重新打开报表并关闭表单本身。 (当我试图在表单的打开事件中重新打开报表时,报表永远不会真正打开,所以我添加了计时器来延迟足够长的时间,让报表在尝试重新打开之前完全关闭。)(当然,如果重新打开报表的全局变量为False,则窗体直接关闭。)
- 在详细部分在hidden/visible之间切换的子报表中,在Open事件中,使用Me.Detail.Visible = {globalvariableflag}并将重新加载报表的全局变量设置为False(自报表现已重新加载)。
它很笨拙,但这是我能找到的根据需要隐藏和缩小细节部分的唯一方法。
在 ON LOAD 事件中使用以下代码:
Private Sub Form_Load()
Dim C As Control
For Each C In Me.Form
If TypeOf C Is TextBox Then
If IsNull(C) Or C = "" Or C = 0 Or C = "0" Then
C.Visible = False
C.Height = 0
Else
C.Visible = True
End If
End If
Next C
Me.Requery
End Sub