概述
数据源是一个抽象接口,用于定义数据流的来源。
数据源可以实现为物理数组、应用程序中的自定义类,甚至可以是 ReoGrid 工作表本身。
通过实现数据源接口,您可以灵活地配置数据流,并以多种方式向工作表提供数据。
您还可以对数据源应用筛选器,在将数据传递到下一个输入之前对其进行处理。使用数据源可以灵活地管理大型报表系统。
接口定义
数据源通过 IDataSource 接口定义。
它作为向工作表提供数据的抽象接口,对数据的具体类型或种类没有限制。
数据源提供 IDataRecord 的 Enumerator 接口,并充当包含多行记录的集合。IDataRecord 表示单行数据。
public interface IDataSource<out T> : IEnumerable<T> where T : IDataRecord
{
event EventHandler<DataSourceChangedEventArgs> 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 GetData(int columnIndex) => Values[columnIndex];
}
这使您能够以灵活且可扩展的方式在 ReoGrid 中配置数据显示和更新处理。
ReoGrid 内置数据源
ReoGrid 目前提供以下两种内置数据源:
- ArrayDataSource:一种简单的数据源,以标准
object[,]格式保存数据。 - 基于列的数据源:一种灵活的格式,使用列 ID 而不是列索引来管理数据。
基于列的数据源 :nri
在基于列的数据源中,您需要预先定义列,并使用对应的 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;
// 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"] = "...";
}
// 将数据源添加到工作表;A1:G30 为目标范围地址
sheet.AddDataSource("A1:G30", ds);