Paging is only half of the answer.
For example, if you have a recordset that is expensive to produce, but then you only render a page at a time, it may still be too slow. On the other hand, if you have a cheap recordset, then retrieving all the records and throwing away all but one page is not a big deal.
Many people write their queries in such a way that only a page at a time is returned from SQL to .net, and only a page is rendered (like a Repeater that Joe mentioned.) That is typically the most cumbersome and fastest solution.