2016-12-21 7 views
1

У меня есть отчет с большим количеством данных, отформатированных для удобства печати. В среднем от 16 до 24 страниц данных, которые мои пользователи могут просматривать. Я решил сделать окна ReportViewer (импортированные в WPF), и он отлично работает, за исключением одного: я не могу найти, как отключить автоматическое продвижение страницы при прокрутке.Disable ReportViewer Навигация по страницам на колесике мыши

Я просмотрел свойства отчета rdlc и ReportViewer и не вижу никаких свойств. Я не могу найти какую-либо информацию в Интернете. это не функция, которая может быть отключена, или я просто не вижу ее?

ответ

1

ReportViewer выполняет навигацию по экрану колеса мыши, переопределяя метод внутреннего контроля , поэтому мы не можем переопределить его, потому что он является внутренним.

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