FlexGrid for WinForms
データの仮想化
データ > データの仮想化

データの仮想化とは、データを一度にすべてロードするのではなく、リモート ソースから段階的にロードするプロセスを指します。 つまり、仮想モードでは、ユーザーがグリッドをスクロールすると、オンデマンドでデータが一定のサイズ単位でロードされます。この機能は、膨大な量のデータを処理する際に非常に役立ち、短時間で効率的にデータをロードできます。

データ仮想化には、ページネーションとカーソルという 2 つの広く採用されているアプローチがあります。 ページネーション アプローチでは、データのどの部分が要求されるかを指定するために、制限とオフセットのパラメーターがリモート ソースに送信されます。このアプローチでは、利用可能なアイテムの合計量が返されるため、クライアントは残りのアイテムを取得する方法を知ることができます。 一方、カーソル アプローチでは、ページを順番に取得するために、最初は null であるトークンが最初に送信されます。この場合、受信したページには次のページへのトークンが含まれています。

FlexGrid はデータの仮想化をサポートし、大規模なデータ セットをリアルタイムでロードしながら優れたパフォーマンスを発揮します。 FlexGrid コントロールに仮想モードを実装するには、データグリッドまたはリスト コントロールのデータ仮想化を提供する C1DataCollection ライブラリを使用します。

C1DataCollection 名前空間は、C1VirtualDataCollection と C1CursorDataCollection を提供して、ページネーションとカーソル アプローチをそれぞれ実装します。 どちらのクラスにも、コレクションに入力するアイテムを返すために実装する必要がある抽象 GetPageAsync() メソッドがあります。基本クラスは、データをキャッシュするだけでなく、一連のパラメーターに従ってページの要求をディスパッチし、同時に要求されるページが多すぎるのを防ぎます。 このトピックでは、C1VirtualDataCollection クラスを使用したデータ仮想化とその実装について説明します。

データ仮想化の実装

まず、C1VirtualDataCollection インターフェイスを実装して、データに従って GetPageAsync メソッドをオーバーライドします。 C1VirtualDataCollection の GetPageAsync メソッドは、ページ内の項目と次のページへのトークンを返します。このメソッドは、pageIndex、startingIndex、count、sortDescriptions、filterExpression、および cancel Token をパラメーターとして使用します。 パラメータ pageIndex は要求ページのインデックスを示し、 startingIndex は返されるアイテムが挿入されるインデックスを示し、 count は返されるアイテムの数を示します。 GetPageAsync メソッドは、アイテムの総数 (TotalCount) と、インデックス (startingIndex) から始まる要求されたアイテム数 (count) のリストを返します。

public class VirtualModeCollectionView : C1VirtualDataCollection<Customer>
{
    public int TotalCount { get; set; } = 1_000;

    protected override async Task<Tuple<int, IReadOnlyList<Customer>>> GetPageAsync(int pageIndex, int startingIndex, int count, IReadOnlyList<SortDescription> sortDescriptions = null, FilterExpression filterExpression = null, CancellationToken cancellationToken = default(CancellationToken))
    {
        await Task.Delay(500, cancellationToken);//Simulates network traffic.
        return new Tuple<int, IReadOnlyList<Customer>>(TotalCount, Enumerable.Range(startingIndex, count).Select(i => new Customer(i)).ToList());
    }
}
Public Class VirtualModeCollectionView
    Inherits C1VirtualDataCollection(Of Customer)

    Public Property TotalCount As Integer = 1_000

    Protected Overrides Async Function GetPageAsync(ByVal pageIndex As Integer, ByVal startingIndex As Integer, ByVal count As Integer, ByVal Optional sortDescriptions As IReadOnlyList(Of SortDescription) = Nothing, ByVal Optional filterExpression As FilterExpression = Nothing, ByVal Optional cancellationToken As CancellationToken = Nothing) As Task(Of Tuple(Of Integer, IReadOnlyList(Of Customer)))
        Await Task.Delay(500, cancellationToken)
        Return New Tuple(Of Integer, IReadOnlyList(Of Customer))(TotalCount, Enumerable.Range(startingIndex, count).[Select](Function(i) New Customer(i)).ToList())
    End Function


End Class            

データ仮想化を FlexGrid に適用する

FlexGrid にデータ仮想化を適用し、それに仮想データ コレクションを設定するには、VirtualModeCollectionView のインスタンスを渡す C1DataCollectionBindingList のオブジェクトを作成し、それをグリッドの DataSource プロパティに割り当てます。

private void Form1_Load(object sender, EventArgs e)
{
    var collectionView = new VirtualModeCollectionView();
    c1FlexGrid1.DataSource = new C1DataCollectionBindingList(collectionView);
    c1FlexGrid1.Visible = true;
}
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim collectionView As New VirtualModeCollectionView
    Dim data = New C1DataCollectionBindingList(collectionView)
    C1FlexGrid1.DataSource = New C1DataCollectionBindingList(collectionView)
    C1FlexGrid1.Visible = True
End Sub