【问题标题】:Disable ReportViewer Page Navigation On Mouse Wheel在鼠标滚轮上禁用 ReportViewer 页面导航
【发布时间】:2017-05-07 05:32:45
【问题描述】:

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

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

【问题讨论】:

    标签: c# wpf winforms rdlc reportviewer


    【解决方案1】:

    ReportViewer通过覆盖名为ReportPanel的内部控件的OnMouseWheel方法在鼠标滚轮上进行页面导航,所以我们不能覆盖它,因为它是内部的。

    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);
                    }
                };
            });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      相关资源
      最近更新 更多