ReoGrid
ReoGrid Version 4をリリースしました。多数の新機能に対応し、機能性・パフォーマンスの両面で大幅に強化されています。新機能の詳細については、こちらをご覧ください。
データソース

概要

データソースとは、データの流れの起点を定義する抽象的なインターフェースです。

データソースは、物理的な配列、アプリケーションでカスタマイズされたクラス、あるいは ReoGrid ワークシートそのものとして実現できます。

データソースのインターフェースを実装することで、データの流れを柔軟に構成でき、さまざまな形でワークシートにデータをインプットすることが可能になります。

また、データソースにフィルターを適用することで、データを加工し、次のインプットへと渡すことも可能です。データソースを活用することで、大規模な帳票システムにも柔軟に対応できます。

インターフェース定義

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

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

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