在父级为表单的子报表中滚动

Posted

技术标签:

【中文标题】在父级为表单的子报表中滚动【英文标题】:Scrolling in subreports where parent is a form 【发布时间】:2017-06-13 22:05:15 【问题描述】:

我在表单上的子报表/表单控件中的报表中滚动时遇到问题。我可以通过单击并拖动滚动条来滚动,但我想使用鼠标滚轮。

我认为这个functionality was removed 是在 2007 年到 2010 年过渡期间本地发生的事情。 (我知道链接说它适用于子表单,但我很确定它也适用于基于我读过的所有其他内容的子报表)。

我像这样修改了他们的解决方法代码

Private Sub Report_MouseWheel(ByVal Page As Boolean, ByVal Count As Long)
    Dim r As Long
    If Not Me.Dirty Then
        Do While r < Abs(Count)
            If (Count < 0) And (Me.CurrentRecord >= 1) Then
                DoCmd.GoToRecord , , acPrevious, 1
            ElseIf (Count > 0) then 'And (Me.CurrentRecord < Me.Count) Then 'This said Me.RecordSet.RecordCount but that was wrong. Also looking at the count here seems to just mess things up actually. 
                DoCmd.GoToRecord , , acNext, 1
           End If
           r = r + 1
        Loop
    End If
End Sub

但是当控件具有焦点时,这根本不起作用。显示“2016 年 6 月”的文本框是下图中的焦点。

当只有报表部分有焦点/没有控件有焦点时,它确实工作得很好。 IE。当您单击报告宽度的右侧时。我不确定这个状态到底是什么。

我不知道如何设置该部分以使焦点远离其他所有可聚焦控件。

编辑:

您可以通过以下步骤重现我正在尝试修复的场景(这是 Access 2010,但它应该适用于 Access 2013。我不能说 2016)

在新数据库中创建一些测试表

根据该数据制作基本报告

创建一个新表单并将该基本报表添加为Subform/Subreport 对象

当您在表单视图中运行打开表单时,将焦点放在子报表中并使用鼠标滚轮没有任何反应。框架不滚动,CurrentRecord 也不改变。

【问题讨论】:

我不确定这是否适用于子报表,但这里有一个部分列表,以防您以前没有看过它:msdn.microsoft.com/en-us/library/office/ff192668.aspx。也许您可以访问子报表Forms.frmName....Form.sfrmName... 之类的子报表; Reports.rptName...Report.srptName。 Hth. 如果有解决方案我会很感兴趣 - 我有同样的问题并且有类似的解决方法,只有当表单不是控件具有焦点时才有效。我想知道在单击任何控件时将焦点设置到子容器是否有效? 这就是我的想法。我没有马上想到我上面的评论仍然涉及点击和设置焦点。也许不是想要的,但可能会奏效。我怀疑只是悬停和滚动是可能的。 我在 access 2010 上试过这个,但无法重新制作。无论列或行是否具有焦点,它都会滚动/导航每条记录。 @wazz 我在表单中使用子报表(对象类型,但我的报表本身没有子报表)。它确实有所不同,因为报表中的子报表可以正常工作。我的文件是一个 accdb。 【参考方案1】:

要防止子报表上的控件获得焦点,您可以将它们全部设置为Enabled = No。这应该将重点放在这些部分上。

FWIW,我试图重现这一点,但对我来说,未绑定表单上的子报表(在报表视图中)永远不会用鼠标滚轮滚动。无论焦点在哪里。

编辑 有了Report_MouseWheel 代码,它就可以工作了。我将Me.Recordset.RecordCount替换为测试表中的记录数,用于测试目的。

一般来说,我觉得这是一件很奇怪的事情(将子报表放在表单上)。

编辑 2 啊,我明白了,分组。好的。

我尝试在详细信息部分上方放置一个透明按钮,以防止禁用的控件不可点击,但这不起作用。

【讨论】:

这更好,因为不应该关注的东西不能拥有它。这确实意味着尽管有人试图将焦点放在子报表中以滚动它,但除非他们在控件之间单击,否则无法做到这一点。也许没关系。 原因是我有太多数据无法一次显示所有内容,我需要分组。子表单不能像报表那样进行分组,报表本身也不能像表单那样进行动态过滤。因此,我在表格中有一份报告。关于您尝试复制,这是正确的。这就是为什么我在 MouseWheel 事件中有该代码的原因。但是,如果在DoCmd.GoToRecord , , acNext, 1/acPrevious 期间焦点位于文本框(或其他可聚焦控件)中,则会发生各种奇怪的事情。特别是因为报表中的 CurrentRecord 与分组级别相关。 我觉得如果我有策略地隔开一些东西,这样用户就可以点击大多数地方,这是一个很好的解决方案。不完美,但肯定比以前更好。【参考方案2】:

我发现一个可行的解决方法是首先将报表封装在另一个(空)报表中,然后将嵌套报表作为子报表添加到表单中。这种方式滚动似乎保持不变。

这种方法的一个问题是加载时间会受到影响。我发现它尤其会减慢包含大量查询或大量数据的报告。

如果这个滚动问题可以由 MS 解决,生活会轻松很多。

如果有人知道更好的方法,我会全力以赴!

【讨论】:

以上是关于在父级为表单的子报表中滚动的主要内容,如果未能解决你的问题,请参考以下文章

仅在 Safari 中 - 位置:固定子级在父级为位置时被切断:固定且溢出:隐藏

GLSurfaceView 父级为 null,即使它嵌套在 LinearLayout 中

在 VBA Access 中动态填充其他子表单的子表单

Django 表单验证:在父表单中获取子表单数据

子表单可以在父表单之外吗?

升级到 Qt 5.15 后,ListView 委托中的父级为空