概要
データソースとは、データの流れの起点を定義する抽象的なインターフェースです。
データソースは、物理的な配列、アプリケーションでカスタマイズされたクラス、あるいは ReoGrid ワークシートそのものとして実現できます。
データソースのインターフェースを実装することで、データの流れを柔軟に構成でき、さまざまな形でワークシートにデータをインプットすることが可能になります。
また、データソースにフィルターを適用することで、データを加工し、次のインプットへと渡すことも可能です。データソースを活用することで、大規模な帳票システムにも柔軟に対応できます。
インターフェース定義
データソースは IDataSource
インターフェースを通じて定義されます。
データソースはワークシートにデータを提供する入力元としての抽象的なインターフェースであり、データの具体的な種類や型についての制約はありません。
データソースは、IDataRecord
の Enumerator
インターフェースを提供し、複数行のレコードを持つコレクションとして機能します。IDataRecord
は1行分のデータを表します。
public interface IDataSource<out T> : IEnumerable<T> where T : IDataRecord
{
// TODO: add event arguments to determine which data is changed
event EventHandler OnInputDataChanged;
}
データソース変更時の連動
OnInputDataChanged
イベントを実装することで、入力データに変更があった際に、後続の入力元に通知を行うことができ、変更内容がリアルタイムでワークシートに反映されます。
ワークシートへのデータソース設定
Worksheet.AddDataSource
メソッドを使用することで、ワークシートにデータソースを追加できます。
sheet.AddDataSource("A1:G30", dataSource);
ReoGrid は複数のデータソースの追加に対応しています。
カスタムデータソースの実装
IDataSource
インターフェースを実装することで、独自のデータソースを定義できます。
public class MyDataSource : IDataSource<IDataRecord>
{
private object[,] data;
...
}
このように IDataSource
を実装することで、アプリケーション独自のデータ構造や取得方法に合わせたデータソースを定義できます。たとえば、データベースやWeb API、その他の外部システムから取得したデータをそのままワークシートに反映する仕組みを構築することも可能です。
実装例として、IDataRecord
を実装した MyDataRecord
クラスを作成し、必要なデータ項目を保持させることで、任意のデータ構造に対応できます。
public class MyDataRecord : IDataRecord
{
public object[] Values { get; }
public MyDataRecord(params object[] values)
{
Values = values;
}
public object this[int index] => Values[index];
}
これにより、ReoGrid におけるデータ表示や更新処理を、柔軟かつ拡張性のある形で構成できます。
ReoGrid に内蔵されているデータソース
現在、ReoGrid には次の2種類の内蔵データソースが用意されています。
- ArrayDataSource:通常の
object[,]
形式でデータを保持するシンプルなデータソースです。 - 列ベースデータソース:列インデックスではなく列IDでデータを扱う柔軟な形式です。
列ベースデータソース
列ベースデータソースでは、事前に列を定義し、それぞれの列に対応するIDを使ってデータを登録・操作します。ColumnBasedDataSource
クラスを使用して実現します。
// データソースを作成
var ds = new ColumnBasedDataSource();
// 列を定義
ds.Columns.AddRange("id", "tsuka", "kamoku", "baibai", "zengaku", "hiduke", "biko");
// データを格納
for (int r = 0; r < 30; r++)
{
var record = ds.Records.AppendNew();
// ID
record["id"] = 15001;
// 通貨
record["tsuka"] = "USD";
// 科目
record["kamoku"] = "015";
// 売買
record["baibai"] = "売";
// 全額
record["zengaku"] = 105800;
// 日付
record["hiduke"] = new DateTime(2020, 11, 1);
// 備考
record["biko"] = "...";
}
// データソースをワークシートに追加、 A1:G30 は格納先の範囲アドレス
sheet.AddDataSource("A1:G30", ds);