概要
データソースは、データフローの起点を定義する抽象インターフェースです。
データソースは、物理的な配列、アプリケーション内のカスタムクラス、またはReoGridワークシート自体として実装できます。
データソースインターフェースを実装することで、データフローを柔軟に構成し、さまざまな方法でワークシートにデータを供給できます。
また、データソースにフィルターを適用して、次の入力に渡す前にデータを処理することもできます。データソースを使用することで、大規模なレポーティングシステムを柔軟に管理できます。
インターフェース定義
データソースは IDataSource インターフェースを通じて定義されます。
ワークシートにデータを提供するための抽象インターフェースとして機能し、データの具体的な型や種類に制限はありません。
データソースは IDataRecord の Enumerator インターフェースを提供し、複数行のレコードを含むコレクションとして機能します。IDataRecord は1行分のデータを表します。
public interface IDataSource<out T> : IEnumerable<T> where T : IDataRecord
{
event EventHandler<DataSourceChangedEventArgs> OnInputDataChanged;
}
データソース変更時の同期
OnInputDataChanged イベントを実装することで、データが変更されたときに下流の入力に通知し、変更をリアルタイムでワークシートに反映させることができます。
ワークシートへのデータソースの設定
Worksheet.AddDataSource メソッドを使用して、ワークシートにデータソースを追加できます。
sheet.AddDataSource("A1:G30", dataSource);
ReoGridは1つのワークシートに複数のデータソースを追加することをサポートしています。
カスタムデータソースの実装
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 GetData(int columnIndex) => Values[columnIndex];
}
これにより、ReoGridでのデータ表示や更新処理を柔軟かつ拡張可能な方法で構成できます。
ReoGridの組み込みデータソース
ReoGridは現在、以下の2つの組み込みデータソースを提供しています:
- ArrayDataSource: 標準的な
object[,]形式でデータを保持するシンプルなデータソースです。 - 列ベースデータソース: 列インデックスではなく列IDを使用してデータを管理する柔軟な形式です。
列ベースデータソース
列ベースデータソースでは、事前に列を定義し、対応するIDを使用してデータの登録と操作を行います。これは ColumnBasedDataSource クラスを使用して実装されます。
// Create data source
var ds = new ColumnBasedDataSource();
// Define columns
ds.Columns.AddRange("id", "tsuka", "kamoku", "baibai", "zengaku", "hiduke", "biko");
// Store data
for (int r = 0; r < 30; r++)
{
var record = ds.Records.AppendNew();
// ID
record["id"] = 15001;
// Currency
record["tsuka"] = "USD";
// Subject
record["kamoku"] = "015";
// Trade type
record["baibai"] = "Sell";
// Total amount
record["zengaku"] = 105800;
// Date
record["hiduke"] = new DateTime(2020, 11, 1);
// Remarks
record["biko"] = "...";
}
// Add data source to worksheet; A1:G30 is the target range address
sheet.AddDataSource("A1:G30", ds);