Here is the sample that shows one way to page data into a virtual grid.. In QueryCellInfo, it checks for the data availability and if needed, loads the data as you scroll over.
It simulates having a 1,000,000-row datasource that is loaded in pages of at most 200 rows.
It does this using a virtual grid. At the beginning of QueryCellInfo, there is a call to a DataSource method that ensures the requested row is available. If it is not, the DataSource loads a 200-count range of records with the requested record in the middle. In this sample, loading new data creates a new 200 row datatable using code.
In a real application this table would come from some kind of database query to retrieve a batch of records containing the requested one. In the sample, all this happens very quickly. In a real application, accessing the database will likely be an expensive operation, so bigger page sizes may make sense. Or, you could try to use multiple threads to ''preload'' anticipated batches on different threads so they would be available when needed. Of course, this adds complexity to the coding to make sure the threads are interacting properly. But the basic idea would still be the same. At the start of QueryCellInfo, you somehow have to make sure the requested data is available. If it is not, then you have to get it.
Exactly how you would handle the paging with your SAS db, I do not know.