PowerTools SPREAD for Windows Forms 8.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)) |