PowerTools SPREAD for Windows Forms 10.0J
カスタムシートモデルの作成

カスタムモデルを新しく作成する場合、シートの既定のモデルをテンプレートとして使用できます。たとえば、独自のDataモデルを作成する場合、ISheetDataModelインタフェースを実装するクラスを作成します。そして、シートでこのモデルを使用するには、作成したクラスのインスタンスを、SheetViewクラスのModelsプロパティでSheetView.DocumentModelsオブジェクトを参照し、Dataプロパティに設定します。

最小限、必要なインタフェースは、ISheetDataModelインタフェースだけです。他に機能が不要であれば、オプションインタフェースを実装する必要はありません。

なお、シートの既定の実装であるDefaultSheetDataModelクラスは、様々なオプションインタフェースを実装しています。したがって、独自のDataモデルでいずれかのオプションインタフェースを実装する簡単な方法は、多くの場合、DefaultSheetDataModelクラスのサブクラスを作成することです。

Dataモデルの基本クラスであるBaseSheetDataModelクラスには、Changedイベントが実装されています。

稀に、パフォーマンス上の理由から、独自のDataモデルを新しく作成しなければならない場合もあります。たとえば、100万行10 列の大きな表を作成し、計算値(たとえば加算値または乗算値)を表示する場合について考えます。シートの既定のDataモデルを使用すると、1,000万個のセルの値をすべて計算および格納する必要があり、多くのメモリと処理時間が要求されます。このようなケースを念頭に、次のサンプルコードをご覧ください。

サンプルコード

次のサンプルコードは、100万行10列のシートのすべてのセルに、それぞれの行、および列インデックスの和を数式で設定します。

C#
コードのコピー
Stopwatch sw = new Stopwatch();
sw.Start();//計測開始
int ROWCOUNT = 1000000;
int COLCOUNT = 10;
fpSpread1.Sheets[0].RowCount = ROWCOUNT;
fpSpread1.Sheets[0].ColumnCount = COLCOUNT;
for (int r = 0; r < ROWCOUNT; r++)
{
    for (int c = 0; c < COLCOUNT; c++)
    {
        fpSpread1.Sheets[0].Cells[r, c].Value = r + c;
    }
}
sw.Stop();//計測終了
Console.WriteLine(string.Format("経過時間:{0}", sw.Elapsed));
Visual Basic
コードのコピー
Dim sw As New Stopwatch()
sw.Start() '計測開始
Dim ROWCOUNT As Integer = 1000000
Dim COLCOUNT As Integer = 10
FpSpread1.Sheets(0).RowCount = ROWCOUNT
FpSpread1.Sheets(0).ColumnCount = COLCOUNT
For r As Integer = 0 To ROWCOUNT - 1
    For c As Integer = 0 To COLCOUNT - 1
        FpSpread1.Sheets(0).Cells(r, c).Value = r + c
    Next
Next
sw.Stop() '計測終了
Console.WriteLine(String.Format("経過時間:{0}", sw.Elapsed))

次のサンプルコードは、独自のDataモデルクラスを作成し、セルの値を設定します。セルに数式を設定する上の方法と比較して、処理時間が大幅に短縮されます。

C#
コードのコピー
//独自のDataモデルクラス
class ComputedDataModel : BaseSheetDataModel
{
    public override int RowCount
    {
        get { return 1000000; }
    }
    public override int ColumnCount
    {
        get { return 10; }
    }
    public override object GetValue(int row, int column)
    {
        return row + column;
    }
}
//以下はフォームのコードビハインドに記述
Stopwatch sw = new Stopwatch();
sw.Start();//計測開始
//独自のDataモデルを設定
fpSpread1.Sheets[0].Models.Data = new ComputedDataModel();
sw.Stop();//計測終了
Console.WriteLine(string.Format("経過時間:{0}",sw.Elapsed));
Visual Basic
コードのコピー
'独自のDataモデルクラス
Class ComputedDataModel
    Inherits BaseSheetDataModel
    Public Overrides Property RowCount As Integer
        Get
            Return 1000000
        End Get
        Set(value As Integer)
        End Set
    End Property
    Public Overrides Property ColumnCount As Integer
        Get
            Return 10
        End Get
        Set(value As Integer)
        End Set
    End Property
    Public Overrides Function GetValue(row As Integer, column As Integer) As Object
        Return row + column
    End Function
End Class
'以下はフォームのコードビハインドに記述
Dim sw As New Stopwatch()
sw.Start() '計測開始
'独自のDataモデルを設定
FpSpread1.Sheets(0).Models.Data = New ComputedDataModel()
sw.Stop() '計測終了
Console.WriteLine(String.Format("経過時間:{0}", sw.Elapsed))
関連トピック

 

 


© 2004-2017, GrapeCity inc. All rights reserved.