SubSonic, ObjectDataSource, Paging, and you!

SubSonic is such a time saver. Fresh out of the box it gives you so much goodness that it makes you wonder how you developed without it. However one feature I find lacking is that it doesn't have a paging method from the get go. However it's easy enough to implement paging with SubSonic.

The trick is you have to created two methods to get the paging to work. The drawback to using the ObjectDataSource for paging is that the GridView doesn't take an output parameter as the record count. So what do you do to take advantage of the SubSonic goodness? First create the select method and the select count in the controller class.

   1:  [DataObjectMethod( DataObjectMethodType.Select, false )]
   2:  public MyCollection FetchAllPaged(int start, int pageLength)
   3:  {
   4:      int startIndex;
   5:      if(start ==0)
   6:      {
   7:          startIndex = 1;
   8:      }
   9:      else
  10:      {
  11:          startIndex = start / pageLength + 1;
  12:      }
  13:      MyCollection coll = new MyCollection();
  14:      Query qry = new Query( My.Schema );
  15:      qry.PageSize = pageLength;
  16:      qry.PageIndex = startIndex;
  17:      coll.LoadAndCloseReader( qry.ExecuteReader() );
  18:      return coll;
  19:  }
  20:  public int FetchAllCount()
  21:  {
  22:      Query qry = new Query( My.Schema );
  23:      return qry.GetCount( My.Columns.MyId );
  24:  }
The trick to remember is that the ObjectDataSource passes passes in the count of the items but the paging method exposed by SubSonic expects the actual page number. This means that if your PageSize is 10 changing to the second page the start is 20, but SubSonic expects 2.
   1:  <asp:GridView ID="TheGrid" runat="server" 
   2:      AllowPaging="True" 
   3:      DataSourceID="MyDataSource"
   4:      PageSize="10" />
   5:  <asp:ObjectDataSource ID="MyDataSource" runat="server" 
   6:      SelectMethod="FetchAllPaged" 
   7:      TypeName="MyController" 
   8:      SelectCountMethod="FetchAllCount"
   9:      StartRowIndexParameterName="start" 
  10:      MaximumRowsParameterName="pageLength" 
  11:      EnablePaging="True" 
  12:  />

3 Comments

  • In my testing, setting the startIndex to 1 at the minimum skips the first page of results and makes the last page empty. Instead, I set startIndex like so:

    int startIndex = start / pageSize;

    This correctly showed the first and last pages.

  • Just thought I'd say hello to the Kev.

  • Excellent code snippets. I'm using SubSonic with MySQL and the paging isn't working quite right (not sure if it's just not implemented yet). Anyway, this post made it instantly apparent how I can roll my own, so I did. Nice one Kev!

Comments have been disabled for this content.