У меня есть DataGridView, который читает данные из пользовательского (CSLA) объекта списка. Набор данных может содержать 100 000 записей, и, очевидно, я не хочу показывать их все сразу, потому что, например, для загрузки потребуется целая вечность.
Думаю, было бы неплохо, если бы я мог прочитать первые (например) 20 записей и сделать это при прокрутке до конца списка, он читает следующие 20 и добавляет их в DataGridView.
Я экспериментировал с различными способами сделать это, в основном используя собственный класс, унаследованный от DataGridView для захвата событий прокрутки, и вызывая событие, которое добавляет новые записи. Я включу код ниже:
Public Class TestDGV
Inherits DataGridView
Public Sub New()
AddHandler Me.VerticalScrollBar.ValueChanged, AddressOf vsScrollEvent
AddHandler Me.RowsAdded, AddressOf vsRowsAddedEvent
End Sub
Private Sub vsScrollEvent(ByVal sender As Object, _
ByVal e As EventArgs)
With DirectCast(sender, ScrollBar)
If .Value >= (.Maximum - .LargeChange) Then
RaiseEvent ScrollToEnd()
End If
End With
End Sub
Private Sub vsRowsAddedEvent(ByVal sender As Object, ByVal e As EventArgs)
ScrollbarOn()
End Sub
Public Event ScrollToEnd()
Public Sub ScrollbarOff()
Me.VerticalScrollBar.Enabled = False
End Sub
Public Sub ScrollbarOn()
Me.VerticalScrollBar.Enabled = True
End Sub
End Class
Хотя это (вроде) работает, оно может содержать ошибки. Самая большая проблема заключалась в том, что если бы вы использовали мышь для прокрутки DataGrid, он застрял бы в цикле при обработке события ValueChanged полосы прокрутки после добавления данных. Вот почему я добавил ScrollbarOff и ScrollbarOn - я вызываю их до и после получения новых записей, что временно отключает полосу прокрутки.
Проблема с в том, что заключается в том, что после повторного включения полосы прокрутки она не отслеживает текущее состояние мыши, поэтому, если вы удерживаете кнопку «Вниз» с помощью мыши (или нажмите на часть полосы прокрутки) она прекратит прокрутку после добавления новых записей, и вам придется щелкнуть ее еще раз.
Кроме того, это не кажется особенно элегантным способом ведения дел.
Кто-нибудь когда-либо делал это раньше, и как вы этого добились?
Приветствие.