本文档介绍如何在 ReoGrid 中使用懒加载高效加载大数据集。通过具体的代码示例来说明如何实现懒加载。
步骤 1:初始化工作表
首先,初始化工作表并设置用户界面组件。
public partial class LazyLoadPerformanceDemo : UserControl
{
private Worksheet worksheet;
public LazyLoadPerformanceDemo()
{
InitializeComponent();
}
public static int RECORD_COUNT = 1000000;
public static int COLUMN_COUNT = 12;
List<FlightLog> logs;
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
// Generate data
logs = FlightLogGenerator.GenerateFlightLogs(RECORD_COUNT);
}
}
步骤 2:生成数据
创建一个方法来生成大数据集。本示例中生成飞行日志数据。
public class FlightLogGenerator
{
public static List<FlightLog> GenerateFlightLogs(int numRows = 10000)
{
Random rand = new Random();
DateTime startTime = DateTime.Now;
List<FlightLog> logs = new List<FlightLog>();
string[] weatherOptions = { "Sunny", "Cloudy", "Rain", "Snow" };
for (int i = 0; i < numRows; i++)
{
logs.Add(new FlightLog
{
Timestamp = startTime.AddMilliseconds(200 * i),
Speed = Math.Round(rand.NextDouble() * 180, 2),
Distance = Math.Round(rand.NextDouble() * 1000, 2),
Throttle = rand.Next(0, 101),
EngineBrake = rand.Next(0, 101),
Fuel = Math.Round(rand.NextDouble() * 100, 2),
DoorStatus = rand.Next(0, 2) == 1,
GPSLatitude = Math.Round(35.0 + rand.NextDouble() * 10, 6),
GPSLongitude = Math.Round(135.0 + rand.NextDouble() * 10, 6),
Weather = weatherOptions[rand.Next(weatherOptions.Length)]
});
}
return logs;
}
}
步骤 3:创建数据源
实现一个数据源类,为工作表提供数据。
// Data source
public class FlightLogDataSource : IDataSource<FlightlogDataRecord>
{
public List<FlightLog> Logs { get; private set; }
private FlightlogDataRecord[] initedRecords;
public FlightLogDataSource(List<FlightLog> logs)
{
this.Worksheet = worksheet;
this.Logs = logs;
this.initedRecords = new FlightlogDataRecord[logs.Count];
}
public int RecordCount => Logs.Count;
public int ColumnCount => LazyLoadPerformanceDemo.COLUMN_COUNT;
public bool SuspendDataChangeEvent { get; set; }
public event EventHandler<DataSourceChangedEventArgs> OnInputDataChanged;
// Get data for the specified row
public FlightlogDataRecord GetRecord(int row)
{
FlightlogDataRecord record = initedRecords[row];
if (record == null)
{
record = new FlightlogDataRecord(this, row, Logs[row]);
}
// Return row data
return record;
}
}
// Data record
public class FlightlogDataRecord : IDataRecord
{
private FlightLogDataSource source;
private int row;
public FlightLog LogData { get; private set; }
public FlightlogDataRecord(FlightLogDataSource source, int row, FlightLog logData)
{
this.source = source;
this.row = row;
this.LogData = logData;
}
public object GetData(int columnIndex) {
switch (columnIndex)
{
case 0: return $"No. {row + 1}";
case 1: return LogData.Timestamp;
case 2: return LogData.Speed;
case 3: return LogData.Distance;
case 4: return LogData.Throttle;
case 5: return LogData.EngineBrake;
case 6: return LogData.Fuel;
case 7: return LogData.DoorStatus;
case 8: return LogData.GPSLatitude;
case 9: return LogData.GPSLongitude;
case 10: return LogData.Weather;
case 11: return $"=ROUND({new CellPosition(row, 4).ToAbsoluteAddress()} / {new CellPosition(row, 5).ToAbsoluteAddress()}, 1)";
}
return null;
}
}
步骤 4:使用懒加载加载数据
使用数据源以懒加载模式将数据加载到工作表中,以提高性能。
private void button1_Click(object sender, EventArgs e)
{
// Change the number of worksheet rows
worksheet.SetRows(logs.Count);
// Set the data source in lazy loading mode
worksheet.AddDataSource(
new RangePosition(0, 0, logs.Count, COLUMN_COUNT),
new FlightLogDataSource(logs),
// Enable lazy loading
DataSourceLoadMode.LazyLoading);
}
按照以上步骤,您可以使用数据源和懒加载模式高效地将大数据集加载到 ReoGrid 工作表中。
应用边框和单元格格式
您可以在调用 GetRecord 方法时设置边框和单元格格式。以下示例使用工作表实例来设置边框:
public class FlightLogDataSource : IDataSource<FlightlogDataRecord>
{
public Worksheet Worksheet { get; private set; }
private FlightlogDataRecord[] initedRecords;
...
public FlightLogDataSource(Worksheet worksheet, List<FlightLog> logs)
{
this.Worksheet = worksheet;
this.Logs = logs;
this.initedRecords = new FlightlogDataRecord[logs.Count];
}
...
// Modify the GetRecord method as follows
public FlightlogDataRecord GetRecord(int row)
{
FlightlogDataRecord record = initedRecords[row];
if (record == null)
{
record = new FlightlogDataRecord(this, row, Logs[row]);
initedRecords[row] = record;
// Set row borders when the row is accessed for the first time
Worksheet.SetRangeBorders(row, 0, 1, ColumnCount, BorderPositions.Outside, RangeBorderStyle.BlackSolid);
Worksheet.SetRangeBorders(row, 0, 1, ColumnCount, BorderPositions.InsideVertical, RangeBorderStyle.GrayDotted);
}
// Return row data
return record;
}
...
}
懒加载的原理和注意事项
懒加载是一种高效处理大数据集的技术。当单元格首次被访问时(用于渲染、公式引用、代码查询等),其数据才会从数据集中加载。例如,如果有 100 万行数据,最初只会加载可见的约 30 行。随着用户滚动,更多数据将按需加载。
支持公式和单元格引用
懒加载同样支持公式。即使某个单元格尚未被渲染,如果它被公式引用,在访问时对应的单元格也会自动加载。
懒加载注意事项
懒加载只执行一次。如果在已加载的工作表中删除并重新加载数据,加载状态不会重置,因此懒加载将不会再次生效。因此,如果需要重新加载数据,应重新创建工作表或采取类似的方法。