0

カスタム (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 を追加しました。新しいレコードを取得する前後に呼び出して、スクロールバーを一時的に無効にします。

問題はスクロールバーが再度有効になった後、現在のマウスの状態を追跡しないため、マウスで「下」ボタンを押したままにする (またはスクロールバーの一部をクリックする) と停止することです。新しいレコードが追加された後にスクロールし、もう一度クリックする必要があります。

また、物事を行うのに特にエレガントな方法とは思えません。

これまでに誰かがこれを行ったことがありますか?どのように達成しましたか?

乾杯。

4

2 に答える 2

0

おそらく、結果セットを減らして、<< および >> の種類のページング コントロールを使用できます。Nerd Dinner デモでは、LINQ を使用したエレガントなソリューションを紹介しました。

//
// GET: /Dinners/
//      /Dinners/Page/2

public ActionResult Index(int? page)
{

    const int pageSize = 20;

    var upcomingDinners = dinnerRepository.FindUpcomingDinners();

    var paginatedDinners = upcomingDinners.Skip((page ?? 0) * pageSize)
                                          .Take(pageSize)
                                          .ToList();

    return View(paginatedDinners);
}
于 2009-11-16T15:28:26.790 に答える
0

virtualDataGridView のプロパティを使用するのはどうですか? 例については、「Windows フォーム DataGridView コントロールでのジャスト イン タイム データ読み込みを使用した仮想モードの実装」を参照してください。

于 2011-09-22T12:34:09.227 に答える