データソース

概要

データソースは、データフローの起点を定義する抽象インターフェースです。

データソースは、物理的な配列、アプリケーション内のカスタムクラス、またはReoGridワークシート自体として実装できます。

データソースインターフェースを実装することで、データフローを柔軟に構成し、さまざまな方法でワークシートにデータを供給できます。

また、データソースにフィルターを適用して、次の入力に渡す前にデータを処理することもできます。データソースを使用することで、大規模なレポーティングシステムを柔軟に管理できます。

インターフェース定義

データソースは IDataSource インターフェースを通じて定義されます。 ワークシートにデータを提供するための抽象インターフェースとして機能し、データの具体的な型や種類に制限はありません。

データソースは IDataRecordEnumerator インターフェースを提供し、複数行のレコードを含むコレクションとして機能します。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);

ページの内容は役に立ちましたか?