本文档介绍如何在 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 行。随着用户滚动,更多数据将按需加载。

支持公式和单元格引用

懒加载同样支持公式。即使某个单元格尚未被渲染,如果它被公式引用,在访问时对应的单元格也会自动加载。

懒加载注意事项

懒加载只执行一次。如果在已加载的工作表中删除并重新加载数据,加载状态不会重置,因此懒加载将不会再次生效。因此,如果需要重新加载数据,应重新创建工作表或采取类似的方法。

这篇文章对您有帮助吗?