The asp.net datagrid suppports built-in paging or custom paging. Built-in paging is easy to use, but it requires the datasource to support ICollection, such as a datatable. Note, a datareader does not support ICollecton and thus cannot be used with built-in paging. The problem with a large recordset is that it takes lots of memory to load the recordset into a object that support ICollection. We can page through large recordsets using custom paging. There are fundamentally two ways. The first way is a client-side technique. It uses a firehose recordset and skip through the recordset and then only use the records of interest. The skipped records will go to the client-side but this may not be a big problem if the connectivity between the web server and database server is good. The second method is to use a server-side technique so that the record will never go the the client side. This technique requires additional server resources.
This article contains a comprehensive survey.
This site contains a large number of datagrid related links.