PowerTools SPREAD for Windows Forms 10.0J
Data モデル

Dataモデルは、セルの値や数式、タグやセルノートといったセル内の情報を保持します。他にも、データ連結されたシートのデータソースに関するプロパティなど、セルの内容に関するすべてが含まれます。

コントロールの処理において何らかのカスタマイズを行う場合、その対象となるのは、多くの場合はDataモデルです。Dataモデルは他のどのモデルよりも多くのインタフェースを実装し、多くの機能を備えています。Dataモデルを形成するクラスは以下のとおりです。

基本クラス BaseSheetDataModelクラス
デフォルトクラス DefaultSheetDataModelクラス
インタフェース ISheetDataModelインタフェース

シートのDataモデルを参照するには、SheetViewクラスのModelsプロパティでSheetView.DocumentModelsオブジェクトを参照し、Dataプロパティを使用します。

以下、Dataモデルについて説明します。

既定のデータモデル

Dataモデルは、シートに表示されるセル値を供給するオブジェクトです。 ほとんどの場合、シートの作成時に生成される既定のデータモデルを使用するだけで十分です。

既定のデータモデルは、データソースに連結しても、しなくても(非連結)どちらでも使用できます。非連結モードでは、データモデルはセル値の2次元配列と同様に機能します。連結モードでは、データモデルはデータソースをラップし、必要に応じて、データソースが提供しない機能(セルの数式、非連結の行および列など)を提供します。

次のコードは、シートにデータソースを連結する2つの方法を表しています。

 FpSpread1.Sheets(0).DataSource = MyData.Tables(0)

および、

 Dim model As FarPoint.Win.Spread.Model.DefaultSheetDataModel = New FarPoint.Win.Spread.Model.DefaultSheetDataModel(MyData, strTable)
 FpSpread1.Sheets(0).Models.Data = model

最初のコードは、既存のデータモデルを使用します。シートは、データソースに合わせてサイズが変更されます。2番目のコードでは、データモデルを新規モデルに置き換え、古いモデルを破棄します。どちらのコードも同じ結果となりますが、2番目のコードでは、古いデータモデルがガベージコレクトされます。独自のデータモデルクラスを作成する場合を除き、通常は、データモデルを新しいものに置き換えなくても、既存のデータモデルで十分、処理が可能です。

列の追加と値の設定

データモデルのSetModelDataColumnメソッドがAddColumnメソッドと異なる点は、データモデル内のどの列に、どのデータフィールドを連結するか指定できることです。

モデルに列を追加すると、これらの列はシートに追加されます。データモデルのGetValueおよびSetValueメソッドで指定する行および列は、シートで並べ替えが行われていない限り、シート内の行および列と同じインデックスをもちます。行や列の並び替えはコントロール上での表示に対して実行され、実際のデータモデルを並び替えるわけではありません。そのため、行や列の並び替えを実行した場合は、SheetViewクラスのGetModelRowFromViewRowおよびGetModelColumnFromViewColumnメソッドを使用して、表示上の位置をデータモデルの位置にマッピングする必要があります。

SheetViewクラスのGetValueおよびSetValueメソッドは、常にデータモデル内のデータに対して取得および設定を行います(Modelsプロパティで参照するSheetView.DocumentModelsオブジェクトのDataプロパティでデータモデルを参照し、GetValueおよびSetValueメソッドを使用した場合も同様)。一方、CellクラスのValueプロパティは、シートを保持するSpreadViewオブジェクトでセルが編集中の場合、エディタコントロールの値を返します。この値は、セルの編集モードが終了するまでデータモデルに反映されません。ただし、次のコードを使用することで、この値をデータモデルに手動で反映できます。

 FpSpread1.Sheets(0).SetValue(row, column, FpSpread1.Sheets(0).Cells(row, column).Value)

非連結な列および行

IDataSourceSupportインタフェースを実装しているデータモデルをデータソースに連結すると、データモデルの連結部分は、直接データソースのデータに対して取得および設定を行います。データモデルの連結後、AddColumnsメソッドで列がデータモデルに追加された場合、追加された列に非連結列が含まれる可能性もあります(これらのデータモデルの列に対し、IDataSourceSupportインタフェースのIsColumnBoundメソッドはFalseを返します)。非連結列の値は、データソースではなく、データモデルに保管されます。

データモデルが IUnboundRowSupportインタフェースを実装している場合、非連結の行がデータモデルに含まれる可能性があります。これらの値も、データソース内ではなくデータモデル内に保管されます。これらの行を連結行にするには、IUnboundRowSupportインタフェースのAddRowToDataSourceメソッドを呼び出します。このautoFill引数をTrueに設定すると、この非連結行内の連結列のデータがデータソースの新規のレコードまたは要素に追加され、これによって非連結行が連結行に代わります。ただしこれは、データソース側でこの動作が許可されている場合に限ります。許可されていない場合は例外が発生します。

デフォルトのデータモデルであるDefaultSheetDataModelクラスは、これらのインタフェース以外にも、計算、階層表示、およびシリアル化に関する多くのオプションインタフェースを実装します。

メモリ使用量と処理速度

デフォルトのデータモデルは、セルノート、数式、セルタグ、および値を保持するオブジェクトを作成します。これらのオブジェクトは、データが実際に必要となるまではデータにメモリを割り当てません。したがって、モデルにセルノート、数式、またはセルタグが設定されていない場合は、メモリ使用量は低いままで維持されます。

デフォルトのデータモデル、およびDefaultSheetDataModelクラスから派生させたクラスのGetValueおよびSetValueメソッドを使用してデータを保管する場合、アクセス速度とメモリ使用量のバランスが調整されます。これは、大きなモデル(たとえば 20 億行×20 億列のモデルなど)を高速に作成するための仕様です。

処理する値の数がメモリ不足を引き起こすほどには多くない場合、このモデルに対する値の設定と取得では、適切な処理速度が維持されます。データ数がきわめて大きく、データの情報量がきわめて少ない場合(2/3 以上が空白)、アクセス速度は低下しますが、メモリ使用量も低くなります。

データ数が大きすぎず(行と列の数が 32,000 未満)、情報量も少なくない場合(1/3 以上にデータが存在)、アクセス速度は高速になり、メモリ使用量も多くなります。

フォームにコントロールを配置し、シートの行数および列数を非常に大きな数に設定することで動作を確認できます。これだけでは遅延はまったく発生しません。これは、実際のデータアイテム数に基づいてメモリが割り当てられるためです。しかし、実際にシートに大量のデータを入力してみると、しばらくして遅延が発生します。特に、メモリが不足し、システムがページファイルを使用して仮想メモリのスワップを開始するようになると、遅延は顕著になります。ただし、こうした現象が生じるのは、きわめて大量のデータを入力した場合に限られます。

関連トピック

 

 


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