カスタム (CSLA) リスト オブジェクトからデータを読み取る DataGridView があります。データセットには 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 を追加しました。新しいレコードを取得する前後に呼び出して、スクロールバーを一時的に無効にします。
問題は、スクロールバーが再度有効になった後、現在のマウスの状態を追跡しないため、マウスで「下」ボタンを押したままにする (またはスクロールバーの一部をクリックする) と停止することです。新しいレコードが追加された後にスクロールし、もう一度クリックする必要があります。
また、物事を行うのに特にエレガントな方法とは思えません。
これまでに誰かがこれを行ったことがありますか?どのように達成しましたか?
乾杯。