在鼠标滚轮上禁用ReportViewer页面导航

时间:2016-12-21 17:41:09

标签: c# wpf winforms rdlc reportviewer

我有一份报告,其中有大量数据格式化为打印机友好。平均而言,我的用户可以翻阅16到24页的数据。我决定制作一个Windows窗体ReportViewer(导入到WPF中)并且除了一件事之外它工作得非常好:我找不到如何在滚动时禁用自动页面推进。

我查看了我的rdlc报告属性和ReportViewer两者,但没有看到任何属性。我无法在网上找到任何信息。这不是一个可以被禁用的功能,还是我没有看到它?

1 个答案:

答案 0 :(得分:1)

OnMouseWheel通过覆盖名为ReportPanel的内部控件的ReportViewer方法来执行鼠标滚轮上的页面导航,因此我们无法覆盖它,因为它是内部的。

PageNavigation控件有一个Click事件,我们可以使用它来取消导航。但是我们应该通过工具栏按钮或鼠标滚轮来区分事件。为此,我们在代码中处理DisableWheelNavigation(reportViewer1); 工具栏按钮事件(并删除默认事件处理程序)并设置一个标志,稍后将使用该标志来确定工具栏引发的导航事件。

我编写了一个方法,它封装了逻辑并使得禁用滚轮导航变得容易。要做到这一点,以这种方式调用方法就足够了:

public void DisableWheelNavigation(ReportViewer r) {
    bool fromToolbar = false;
    r.PageNavigation += (obj, ea) => {
        if (fromToolbar) fromToolbar = false;
        else ea.Cancel = true;
    };
    var buttons = new string[] { "firstPage", "previousPage", "nextPage", "lastPage" };
    var toolstrip = r.Controls.Find("toolStrip1", true).OfType<ToolStrip>().First();
    toolstrip.Items.OfType<ToolStripButton>()
        .Where(button => buttons.Contains(button.Name)).ToList().ForEach(item => {
            var clickEvent = item.GetType().GetEvent("Click");
            var removeMethod = clickEvent.GetRemoveMethod();
            var d = Delegate.CreateDelegate(clickEvent.EventHandlerType,
                toolstrip.Parent, "OnPageNavButtonClick");
            removeMethod.Invoke(item, new object[] { d });
            item.Click += (obj, ev) => {
                var onPageNavigation = toolstrip.Parent.GetType()
                    .GetMethod("OnPageNavigation",
                BindingFlags.NonPublic | BindingFlags.Instance);
                Action<int> OnPageNavigation = i => {
                    fromToolbar = true;
                    onPageNavigation.Invoke(toolstrip.Parent, new object[] { i });
                };
                if (item.Name == "firstPage") OnPageNavigation(1);
                else if (item.Name == "previousPage") OnPageNavigation(r.CurrentPage - 1);
                else if (item.Name == "nextPage") OnPageNavigation(r.CurrentPage + 1);
                else if (item.Name == "lastPage") {
                    PageCountMode mode;
                    int totalPages = r.GetTotalPages(out mode);
                    if (mode != PageCountMode.Actual) OnPageNavigation(0x7fffffff);
                    else OnPageNavigation(totalPages);
                }
            };
        });
}

以下是该方法的实现:

ExplicitWait