Подсчитайте, сколько раз произошло событие прокрутки колесика мыши

Прямо сейчас прокрутка MouseWheel изменяет запись, просматриваемую в моем DGV. Отрицательная iDelta перемещает к следующей записи, а положительная iDelta перемещает к предыдущей записи. Каждая запись содержит верхний/нижний колонтитул и фактические данные в файле dgv.

Я пытаюсь оптимизировать скорость, с которой я могу прокручивать записи. Прежде чем я начал возиться с этим, код загружал каждый верхний/нижний колонтитул, а затем загружал весь dgv записи каждый раз, когда обнаруживается событие MouseWheel.

Я пытаюсь изменить его так, чтобы он загружал только верхний/нижний колонтитул, пока пользователь не сделает паузу (скажем, на ~ 500 мс). Это гарантирует, что ненужные dgv не будут загружены и, таким образом, будут потрачены зря время.

Я действительно изо всех сил пытался найти способ подсчета количества прокруток колеса, способ определить, не прокручивал ли пользователь колесико мыши в течение некоторого времени, или способ вызвать прокрутку колесика мыши. подпрограмма, все еще находясь в текущей подпрограмме прокрутки колесика мыши. Я думаю, что любой из них приведет меня к успеху. Вот что у меня есть до сих пор. Очевидно, это не работает так, как я хочу.

Private Sub SplitContainer1_MouseWheel(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles SplitContainer1.MouseWheel

    Dim iDelta As Integer = e.Delta

    ' Limit the times the stopwatch restarts to every 500ms interval
    If numberOfScrolls = 0 Then
        mouseScrollStopWatch.Start()
    End If

    Select Case iButton
        Case 1, 2
            ' If iDelta is negative move to 'next' record
            If iDelta < 0 Then   

                ' If 500 ms has passed since the 'first' scroll event
                If mouseScrollStopWatch.ElapsedMilliseconds > 500 Then

                    ' Loads the header and footer of the 'next' record  
                    BindPartNumMoveNext() 

                    ' Update the dgv  
                    updateDGV()      

                   ' Reset the stopwatch            
                    mouseScrollStopWatch.Reset()

                   ' Reset number of Scrolls
                    numberOfScrolls = 0                                 

               ' If 500ms has not passed since the 'first' scroll event
                Else

                    ' Loads header and footer                           
                    BindPartNumMoveNext()  

                    ' sets number of scrolls to anything but 0     
                    numberOfScrolls = 1                                 
                End If

            ' If iDelta is positive move to 'previous' record
            Else           

                ' If 500 ms has passed since the 'first' scroll event                         
                If mouseScrollStopWatch.ElapsedMilliseconds > 500 Then 

                    ' Loads the header and footer of the 'previous' record
                    BindPartNumMovePrevious()    

                    ' Update the dgv
                    updateDGV()                  

                    ' Reset the stopwatch
                    mouseScrollStopWatch.Reset()                        

                    ' Reset number of Scrolls
                    numberOfScrolls = 0    

                ' If 500ms has not passed since the 'first' scroll event
                Else                          

                    ' Loads header and footer  
                    BindPartNumMovePrevious()           

                    ' sets number of scrolls to anything but 0
                    numberOfScrolls = 1                                 
                End If
            End If

        ' These cases can be ignored for now
        Case 3, 4                                                       
            If iDelta < 0 Then
                BindRefDesMoveNext()
            Else
                BindRefDesMovePrevious()
            End If
    End Select

End Sub

В этой версии моих попыток проблема заключается в том, что dgv никогда не загружается, если 500 мс не прошло для этой конкретной прокрутки колесика мыши (т. Е. Если последнее событие WheelScroll происходит, когда mouseScrollStopWatch.ElapsedMilliseconds ‹ 500, то dgv никогда не загружается.)

Любые советы о том, как я могу получить больше данных с колеса мыши? Конечная цель — просто увеличить скорость, с которой я могу перемещаться по записям, поэтому я открыт для других решений, которые не вращаются вокруг тех, которые я описал здесь.

Я пытался быть конкретным, но, возможно, я был близок к этому, чтобы понять, что я не включаю важную информацию. Если нет, дайте мне знать, и я включу его.


person Chris Searcy    schedule 08.05.2015    source источник
comment
Не так относится к вашему вопросу, но обычно комментарии пишут над кодом, а не сбоку. Так намного легче читать.   -  person Eminem    schedule 08.05.2015
comment
Отметил @Eminem. Обычно я так и делаю, но Visual Studio форматирует комментарии не так, как мне нравится. Например, если я попытаюсь поместить комментарии над оператором «Еще», Visual Studios выровняет комментарий с кодом предыдущего оператора «Если», что сделает его смещенным. Visual Studio не позволяет мне форматировать комментарии, но теперь я понимаю, что могу редактировать их здесь.   -  person Chris Searcy    schedule 08.05.2015
comment
Ты прав. Я тоже нахожу это раздражающим. Но вам действительно следует прочитать этот блог о комментариях. Я не пытаюсь придираться или быть дерзким, но такие комментарии, как Reset number of Scrolls и другие, действительно не нужны.   -  person Eminem    schedule 08.05.2015
comment
Я пытался избежать ненужного туда и обратно, будучи тщательным. Который явно терпит неудачу. Еще раз, я не так обычно пишу свой код. Мой стиль кодирования на самом деле находится на другом конце спектра недостаточного количества комментариев.   -  person Chris Searcy    schedule 08.05.2015
comment
Если у вас возникли проблемы с большим объемом данных в DGV, вам может быть интересно использовать виртуальный режим: Пошаговое руководство. Реализация виртуального режима в элементе управления Windows Forms DataGridView.   -  person Andrew Morton    schedule 08.05.2015
comment
комментарии пишутся над кодом, а не сбоку. Извините, но это полная чушь.   -  person The Blue Dog    schedule 08.05.2015
comment
Я думаю, вам нужно подняться на уровень выше и написать о том, что вы делаете, что привело вас к этому посту. Навигация по DGV с помощью прокрутки обычно не представляет проблемы.   -  person rheitzman    schedule 08.05.2015
comment
@rheitzman Вы правы в том, что навигация с помощью прокрутки не проблема. Мой код будет нормально перемещаться по записям. Об этом позаботятся функции BindPartNumMoveNext() и updateDGV(). Я оставил код этих функций, так как он уже работает и не относится к рассматриваемой проблеме. Мне нужен способ загрузки верхнего/нижнего колонтитула при каждой прокрутке мыши, а когда пользователь закончит прокрутку (однако это может быть определено), затем загрузите DGV соответствующей записи.   -  person Chris Searcy    schedule 08.05.2015


Ответы (1)


Я думаю, что все, что вам нужно сделать, это использовать таймер, чтобы гарантировать, что updateDGV() вызывается, когда прокрутка останавливается на 500 мс. Я просто использовал текстовое поле в качестве темы для прокрутки и другое текстовое поле, чтобы указать, что происходит:

Public Class Form1

    Dim scrollTimer As Timer
    Const SCROLLWAIT As Integer = 500

    Dim iButton As Integer = 1

    Private Sub SetupScrollTimer()
        scrollTimer = New Timer
        scrollTimer.Interval = SCROLLWAIT
        AddHandler scrollTimer.Tick, AddressOf FinalScroll
    End Sub

    Private Sub FinalScroll(sender As Object, e As EventArgs)
        TextBox1.AppendText("updateDGV()" & vbCrLf)
        scrollTimer.Stop()
    End Sub

    Private Sub TextBox2_MouseWheel(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox2.MouseWheel
        scrollTimer.Start()
        Dim iDelta As Integer = e.Delta

        If iDelta < 0 Then
            TextBox1.AppendText("BindPartNumMoveNext()" & vbCrLf)
        Else
            TextBox1.AppendText("BindPartNumMovePrevious()" & vbCrLf)
        End If

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        SetupScrollTimer()

    End Sub

End Class

Windows.Forms.Timer.Start() предназначен для сброса таймера на ноль, но все еще есть ложные вызовы updateDGV(). Если это проблема, вам нужно будет скорректировать код (проблема оставлена ​​в качестве упражнения для читателя).

person Andrew Morton    schedule 08.05.2015
comment
Спасибо @Andrew!! Это именно то, что я искал. Очень признателен!! - person Chris Searcy; 11.05.2015
comment
@ChrisSearcy Не за что :) У меня есть небольшое подозрение, что вам лучше использовать System.Timers.Timer, чтобы избежать ложных вызовов, которые я обнаружил, хотя это может не быть проблемой для вашего пользовательского интерфейса - это может даже лучше, чтобы пользователь видел случайные дополнительные обновления. Однако принцип использования таймера вместо секундомера остается. - person Andrew Morton; 12.05.2015