<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Sanjeetosphere : Custom Paging</title><link>http://blogs.msdn.com/sanjeets/archive/tags/Custom+Paging/default.aspx</link><description>Tags: Custom Paging</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>How To: Create an efficient data driven page with Business Objects, GridView, Custom paging, and AJAX</title><link>http://blogs.msdn.com/sanjeets/archive/2007/06/02/how-to-create-an-efficient-data-driven-page-with-business-objects-gridview-custom-paging-and-ajax.aspx</link><pubDate>Sat, 02 Jun 2007 15:53:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3043681</guid><dc:creator>Sanjeet</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/sanjeets/comments/3043681.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sanjeets/commentrss.aspx?PostID=3043681</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sanjeets/rsscomments.aspx?PostID=3043681</wfw:comment><description>&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;&lt;u&gt;&lt;strong&gt;Preface:&lt;/strong&gt;&lt;/u&gt;&lt;/font&gt;&lt;/p&gt; &lt;div&gt;&lt;font face="Segoe UI" size="2"&gt;I have seen a large number of cases where the customer complaint of performance and scalability issues &lt;br&gt;when they create/manage a data-aware application. That’s when I decided that I should come up with &lt;br&gt;something that is concise, efficient, and easy to implement for developers. &lt;br&gt;Here, is what I created a couple of days ago. &lt;/font&gt;&lt;/div&gt; &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;GridView is awesome, and if you combine it with Sql Server 2005, DetailsView and FormView &lt;br&gt;you have a formidable force to build a rich data aware page. You can achieve almost everything &lt;br&gt;that you may require on a page without even writing a single line of code in your ASPX, &lt;br&gt;even Custom paging (it requires you to write some views in TSQL).&lt;/font&gt;  &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;&lt;strong&gt;&lt;u&gt;Requirement Analysis:&lt;/u&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;font face="Segoe UI" size="2"&gt;A simple page for that has to fetch a large amount of data (more than 10K rows) from a remote database.&lt;/font&gt;  &lt;li&gt;&lt;font face="Segoe UI" size="2"&gt;I need paging and&amp;nbsp;sorting support with CRUD on the page&lt;/font&gt;  &lt;li&gt;&lt;font face="Segoe UI" size="2"&gt;I need a way to customize the GridView control&lt;/font&gt;  &lt;li&gt;&lt;font face="Segoe UI" size="2"&gt;I need to use a 3-tier structure where I have Data Access Layer, Business Access Layer, and the Presentation Layer.&lt;/font&gt;  &lt;li&gt;&lt;font face="Segoe UI" size="2"&gt;Everybody is talking and using AJAX, so I need that also. I like the word &lt;em&gt;"Partial-Rendering"&lt;/em&gt; ;)&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;&lt;u&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/u&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;You need Visual Studio 2005, Sql Server 2005, and ASP.net AJAX 1.0&lt;/font&gt;  &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;&lt;u&gt;&lt;strong&gt;Architecture:&lt;/strong&gt;&lt;/u&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;&lt;strong&gt;&lt;u&gt;The DAL:&lt;/u&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;It is implemented using a Dataset. This is a strongly typed dataset, and contains all the required Stored procedures and queries.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sanjeets/WindowsLiveWriter/UsingBusinessObjectsandlargeda.0GridView_2127/xsd2.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="480" src="http://blogs.msdn.com/blogfiles/sanjeets/WindowsLiveWriter/UsingBusinessObjectsandlargeda.0GridView_2127/xsd_thumb.jpg" width="578" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;We will concentrate on the class "Entity" only.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;The following is the implementation of the BAL.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sanjeets/WindowsLiveWriter/UsingBusinessObjectsandlargeda.0GridView_2127/cd12.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="467" src="http://blogs.msdn.com/blogfiles/sanjeets/WindowsLiveWriter/UsingBusinessObjectsandlargeda.0GridView_2127/cd_thumb8.jpg" width="640" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;The presentation layer has only 1 page for now. I hope this is what we need now. It looks like the following:&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sanjeets/WindowsLiveWriter/UsingBusinessObjectsandlargeda.0GridView_2127/UI6.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="509" src="http://blogs.msdn.com/blogfiles/sanjeets/WindowsLiveWriter/UsingBusinessObjectsandlargeda.0GridView_2127/UI_thumb2.jpg" width="800" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;As we can see, we have highly &lt;/font&gt;&lt;font face="Segoe UI" size="2"&gt;Customized the datagrid. Lets dive deeper into the functionality.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;&lt;strong&gt;&lt;u&gt;The BAL:&lt;/u&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;The following code snippet contains Insert, Edit, and Delete functions required to do usual stuff. Its self explanatory.&lt;/font&gt;&lt;/p&gt; &lt;div class="csharpcode-wrapper" style="width: 46.49%; height: 200px"&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// This is the Insert function for the class. &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// It takes all the columns as arguments and uses a DatabaseDirect mode to update the database directly.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="EntityID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="UserID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="Title"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="Description"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Insert(&lt;span class="kwrd"&gt;int&lt;/span&gt; EntityID, &lt;span class="kwrd"&gt;string&lt;/span&gt; UserID, &lt;span class="kwrd"&gt;string&lt;/span&gt; Title, &lt;span class="kwrd"&gt;string&lt;/span&gt; Description)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; rowsAffected = 0;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        ManageabilityDSTableAdapters.EntityTableAdapter ad = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManageabilityDSTableAdapters.EntityTableAdapter();&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//Update the DB directly&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//Insert function is defined in the DataSet&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        rowsAffected = ad.Insert(UserID, Title, Description);&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//throw all the error that are catched here&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; rowsAffected;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// This is the Edit function for the class. &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// It takes all the columns as arguments and uses a DatabaseDirect mode to update the database directly.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="EntityID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="UserID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="Title"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="Description"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Edit(&lt;span class="kwrd"&gt;int&lt;/span&gt; EntityID, &lt;span class="kwrd"&gt;string&lt;/span&gt; UserID, &lt;span class="kwrd"&gt;string&lt;/span&gt; Title, &lt;span class="kwrd"&gt;string&lt;/span&gt; Description)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; rowsAffected = 0;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        ManageabilityDSTableAdapters.EntityTableAdapter ad = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManageabilityDSTableAdapters.EntityTableAdapter();&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//Update function is defined in the DataSet&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        rowsAffected = ad.Update(UserID, Title, Description, EntityID, EntityID);&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//throw all the error that are catched here&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; rowsAffected;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// This is the Delete function for the class. &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// It takes all the columns as arguments and uses a DatabaseDirect mode to update the database directly.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="EntityID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Delete(&lt;span class="kwrd"&gt;int&lt;/span&gt; EntityID)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; rowsAffected = 0;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        ManageabilityDSTableAdapters.EntityTableAdapter ad = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManageabilityDSTableAdapters.EntityTableAdapter();&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//Delete function is defined in the DataSet&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        rowsAffected = ad.Delete(EntityID);&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//throw all the error that are catched here or apply&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; rowsAffected;&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode-wrapper, .csharpcode-wrapper pre {
  background-color: #f4f4f4;
  border: solid 1px gray;
  cursor: text;
  font-family: consolas, 'Courier New', courier, monospace;
  font-size: 8pt;
  line-height: 12pt;
  margin: 20px 0px 10px 0px;
  max-height: 200px;
  overflow: auto;
  padding: 4px 4px 4px 4px;
  width: 97.5%;
}
.csharpcode-wrapper pre {
  border-style: none;
  margin: 0px 0px 0px 0px;
  overflow: visible;
  padding: 0px 0px 0px 0px;
}
.csharpcode, .csharpcode pre, .csharpcode .alt {
  background-color: #f4f4f4;
  border-style: none;
  color: black;
  font-family: consolas, 'Courier New', courier, monospace;
  font-size: 8pt;
  line-height: 12pt;
  overflow: visible;
  padding: 0px 0px 0px 0px;
  width: 100%;
}
.csharpcode pre {
  margin: 0em;
}
.csharpcode .alt {
  background-color: white;
}
.csharpcode .asp {
  background-color: #ffff00;
}
.csharpcode .attr {
  color: #ff0000;
}
.csharpcode .html {
  color: #800000;
}
.csharpcode .kwrd {
  color: #0000ff;
}
.csharpcode .lnum {
  color: #606060;
}
.csharpcode .op {
  color: #0000c0;
}
.csharpcode .preproc {
  color: #cc6633;
}
.csharpcode .rem {
  color: #008000;
}
.csharpcode .str {
  color: #006080;
}
&lt;/style&gt;
&lt;/div&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;Now the Select functions. These functions are the key to our demo. We will explain each of them at a later part in this post.&lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode-wrapper" style="width: 46.59%; height: 177px"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// This function selects all the records filtered by UserID&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="UserID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ManageabilityDS.EntityDataTable Select(&lt;span class="kwrd"&gt;string&lt;/span&gt; UserID)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        ManageabilityDSTableAdapters.EntityTableAdapter ad = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManageabilityDSTableAdapters.EntityTableAdapter();&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//GetEntitiesByUser function is defined in the DataSet&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; ad.GetEntitiesByUser(UserID);&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// This function selects all the records filtered by UserID and EntityID&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="UserID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="EntityID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ManageabilityDS.EntityDataTable Select(&lt;span class="kwrd"&gt;string&lt;/span&gt; UserID, &lt;span class="kwrd"&gt;int&lt;/span&gt; EntityID)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        ManageabilityDSTableAdapters.EntityTableAdapter ad = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManageabilityDSTableAdapters.EntityTableAdapter();&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//GetEntityByUserAndEntityID function is defined in the DataSet&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; ad.GetEntityByUserAndEntityID(UserID, EntityID);&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;}   &lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// This function gets the maximum rows from the table after its sequenced using Row_number&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="UserID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;long&lt;/span&gt; GetMaxNumberOfRows(&lt;span class="kwrd"&gt;string&lt;/span&gt; UserID)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;long&lt;/span&gt; num = 0;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        ManageabilityDSTableAdapters.EntityTableAdapter ad = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManageabilityDSTableAdapters.EntityTableAdapter();&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//GetNumberOfRows function is defined in the DataSet&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        num = (&lt;span class="kwrd"&gt;long&lt;/span&gt;)ad.GetNumberOfRows(UserID);&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; num;&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// This function return a strongly type list containing paged data&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// A benefit of using Generic here is to minimize the size of the object&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="UserID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="StartRowIndex"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="MaximumRows"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;Entity&amp;gt; Select(&lt;span class="kwrd"&gt;string&lt;/span&gt; UserID, &lt;span class="kwrd"&gt;int&lt;/span&gt; StartRowIndex, &lt;span class="kwrd"&gt;int&lt;/span&gt; MaximumRows)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    ManageabilityDS.EntityDataTable tbl = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;    List&amp;lt;Entity&amp;gt; t = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Entity&amp;gt;(); &lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        ManageabilityDSTableAdapters.EntityTableAdapter ad = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManageabilityDSTableAdapters.EntityTableAdapter();&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//GetPagedEntityByUser function is defined in the DataSet&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        tbl = ad.GetPagedEntityByUser(StartRowIndex, MaximumRows, UserID);&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//fill the strongly typed List with data&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ManageabilityDS.EntityRow row &lt;span class="kwrd"&gt;in&lt;/span&gt; tbl.Rows)&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;            Entity en = &lt;span class="kwrd"&gt;new&lt;/span&gt; Entity();&lt;/pre&gt;&lt;pre&gt;            en.EntityID = row.EntityID;&lt;/pre&gt;&lt;pre class="alt"&gt;            en.UserId = row.UserID;&lt;/pre&gt;&lt;pre&gt;            en.Title = row.Title;&lt;/pre&gt;&lt;pre class="alt"&gt;            en.Description = row.Description;&lt;/pre&gt;&lt;pre&gt;            t.Add(en);&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; t;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// This function return a strongly type list containing paged and sorted data&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="UserID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="StartRowIndex"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="MaximumRows"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="ColumnToOrder"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="OrderDirection"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;Entity&amp;gt; Select(&lt;span class="kwrd"&gt;string&lt;/span&gt; UserID, &lt;span class="kwrd"&gt;int&lt;/span&gt; StartRowIndex, &lt;span class="kwrd"&gt;int&lt;/span&gt; MaximumRows, &lt;span class="kwrd"&gt;string&lt;/span&gt; ColumnToOrder, &lt;span class="kwrd"&gt;string&lt;/span&gt; OrderDirection)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    ManageabilityDS.EntityDataTable tbl = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;    List&amp;lt;Entity&amp;gt; t = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Entity&amp;gt;();&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        ManageabilityDSTableAdapters.EntityTableAdapter ad = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManageabilityDSTableAdapters.EntityTableAdapter();&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//GetPagedEntityByUserOrdered function is defined in the DataSet&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        tbl = ad.GetPagedEntityByUserOrdered(StartRowIndex, MaximumRows, UserID, ColumnToOrder, OrderDirection);&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//fill the strongly typed List with data&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ManageabilityDS.EntityRow row &lt;span class="kwrd"&gt;in&lt;/span&gt; tbl.Rows)&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;            Entity en = &lt;span class="kwrd"&gt;new&lt;/span&gt; Entity();&lt;/pre&gt;&lt;pre&gt;            en.EntityID = row.EntityID;&lt;/pre&gt;&lt;pre class="alt"&gt;            en.UserId = row.UserID;&lt;/pre&gt;&lt;pre&gt;            en.Title = row.Title;&lt;/pre&gt;&lt;pre class="alt"&gt;            en.Description = row.Description;&lt;/pre&gt;&lt;pre&gt;            t.Add(en);&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; t;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode-wrapper, .csharpcode-wrapper pre {
  background-color: #f4f4f4;
  border: solid 1px gray;
  cursor: text;
  font-family: consolas, 'Courier New', courier, monospace;
  font-size: 8pt;
  line-height: 12pt;
  margin: 20px 0px 10px 0px;
  max-height: 200px;
  overflow: auto;
  padding: 4px 4px 4px 4px;
  width: 97.5%;
}
.csharpcode-wrapper pre {
  border-style: none;
  margin: 0px 0px 0px 0px;
  overflow: visible;
  padding: 0px 0px 0px 0px;
}
.csharpcode, .csharpcode pre, .csharpcode .alt {
  background-color: #f4f4f4;
  border-style: none;
  color: black;
  font-family: consolas, 'Courier New', courier, monospace;
  font-size: 8pt;
  line-height: 12pt;
  overflow: visible;
  padding: 0px 0px 0px 0px;
  width: 100%;
}
.csharpcode pre {
  margin: 0em;
}
.csharpcode .alt {
  background-color: white;
}
.csharpcode .asp {
  background-color: #ffff00;
}
.csharpcode .attr {
  color: #ff0000;
}
.csharpcode .html {
  color: #800000;
}
.csharpcode .kwrd {
  color: #0000ff;
}
.csharpcode .lnum {
  color: #606060;
}
.csharpcode .op {
  color: #0000c0;
}
.csharpcode .preproc {
  color: #cc6633;
}
.csharpcode .rem {
  color: #008000;
}
.csharpcode .str {
  color: #006080;
}
&lt;/style&gt;
&lt;/div&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;&lt;u&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/u&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;&lt;u&gt;&lt;strong&gt;The Presentation Layer:&lt;/strong&gt;&lt;/u&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;The datag&lt;/font&gt;&lt;font face="Segoe UI" size="2"&gt;rid looks like following in code:&lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode-wrapper" style="width: 47%; height: 190px"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&amp;lt;asp:GridView ID=&lt;span class="str"&gt;"MainGrid"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; EnableViewState=&lt;span class="str"&gt;"true"&lt;/span&gt; AutoGenerateColumns=&lt;span class="str"&gt;"False"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    CellPadding=&lt;span class="str"&gt;"4"&lt;/span&gt; ForeColor=&lt;span class="str"&gt;"#333333"&lt;/span&gt; Width=&lt;span class="str"&gt;"100%"&lt;/span&gt; PageSize=&lt;span class="str"&gt;"2"&lt;/span&gt; DataKeyNames=&lt;span class="str"&gt;"EntityID"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    EmptyDataText=&lt;span class="str"&gt;"No data available"&lt;/span&gt; OnRowDeleting=&lt;span class="str"&gt;"MainGrid_RowDeleting"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;FooterStyle BackColor=&lt;span class="str"&gt;"#507CD1"&lt;/span&gt; Font-Bold=&lt;span class="str"&gt;"True"&lt;/span&gt; ForeColor=&lt;span class="str"&gt;"White"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &amp;lt;RowStyle BackColor=&lt;span class="str"&gt;"#EFF3FB"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;EditRowStyle BackColor=&lt;span class="str"&gt;"#2461BF"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &amp;lt;SelectedRowStyle BackColor=&lt;span class="str"&gt;"#D1DDF1"&lt;/span&gt; Font-Bold=&lt;span class="str"&gt;"True"&lt;/span&gt; ForeColor=&lt;span class="str"&gt;"#333333"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;HeaderStyle Font-Bold=&lt;span class="str"&gt;"True"&lt;/span&gt; HorizontalAlign=&lt;span class="str"&gt;"Left"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &amp;lt;AlternatingRowStyle BackColor=&lt;span class="str"&gt;"White"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;Columns&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &amp;lt;asp:TemplateField HeaderText=&lt;span class="str"&gt;"Details"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre&gt;            &amp;lt;HeaderStyle Font-Bold=&lt;span class="str"&gt;"True"&lt;/span&gt; Width=&lt;span class="str"&gt;"80%"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &amp;lt;ItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre&gt;                &amp;lt;table width=&lt;span class="str"&gt;"100%"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                    &amp;lt;tr&amp;gt;&lt;/pre&gt;&lt;pre&gt;                        &amp;lt;td width=&lt;span class="str"&gt;"15%"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                            &amp;lt;span&amp;gt;&amp;lt;b&amp;gt;ID:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;/pre&gt;&lt;pre&gt;                        &amp;lt;/td&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                        &amp;lt;td&amp;gt;&lt;/pre&gt;&lt;pre&gt;                            &amp;lt;asp:Label ID=&lt;span class="str"&gt;"EntityIDLabel"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; Text=&lt;span class="str"&gt;'&amp;lt;%#Bind("EntityID")%&amp;gt;'&lt;/span&gt;&amp;gt;&amp;lt;/asp:Label&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                        &amp;lt;/td&amp;gt;&lt;/pre&gt;&lt;pre&gt;                    &amp;lt;/tr&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                    &amp;lt;tr&amp;gt;&lt;/pre&gt;&lt;pre&gt;                        &amp;lt;td bgcolor=&lt;span class="str"&gt;"silver"&lt;/span&gt; colspan=&lt;span class="str"&gt;"2"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                        &amp;lt;/td&amp;gt;&lt;/pre&gt;&lt;pre&gt;                    &amp;lt;/tr&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                    &amp;lt;tr&amp;gt;&lt;/pre&gt;&lt;pre&gt;                        &amp;lt;td&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                            &amp;lt;span&amp;gt;&amp;lt;b&amp;gt;Title:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;/pre&gt;&lt;pre&gt;                        &amp;lt;/td&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                        &amp;lt;td&amp;gt;&lt;/pre&gt;&lt;pre&gt;                            &amp;lt;asp:Label ID=&lt;span class="str"&gt;"TitleLabel"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; Text=&lt;span class="str"&gt;'&amp;lt;%#Bind("Title")%&amp;gt;'&lt;/span&gt;&amp;gt;&amp;lt;/asp:Label&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                        &amp;lt;/td&amp;gt;&lt;/pre&gt;&lt;pre&gt;                    &amp;lt;/tr&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                    &amp;lt;tr&amp;gt;&lt;/pre&gt;&lt;pre&gt;                        &amp;lt;td bgcolor=&lt;span class="str"&gt;"silver"&lt;/span&gt; colspan=&lt;span class="str"&gt;"2"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                        &amp;lt;/td&amp;gt;&lt;/pre&gt;&lt;pre&gt;                    &amp;lt;/tr&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                    &amp;lt;tr&amp;gt;&lt;/pre&gt;&lt;pre&gt;                        &amp;lt;td&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                            &amp;lt;span&amp;gt;&amp;lt;b&amp;gt;Description:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;/pre&gt;&lt;pre&gt;                        &amp;lt;/td&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                        &amp;lt;td&amp;gt;&lt;/pre&gt;&lt;pre&gt;                            &amp;lt;asp:Label ID=&lt;span class="str"&gt;"DescriptionLabel"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; Font-Italic=&lt;span class="str"&gt;"true"&lt;/span&gt; Text=&lt;span class="str"&gt;'&amp;lt;%#Bind("Description")%&amp;gt;'&lt;/span&gt;&amp;gt;&amp;lt;/asp:Label&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                        &amp;lt;/td&amp;gt;&lt;/pre&gt;&lt;pre&gt;                    &amp;lt;/tr&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                &amp;lt;/table&amp;gt;&lt;/pre&gt;&lt;pre&gt;            &amp;lt;/ItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &amp;lt;/asp:TemplateField&amp;gt;&lt;/pre&gt;&lt;pre&gt;        &amp;lt;asp:TemplateField HeaderText=&lt;span class="str"&gt;"Options"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &amp;lt;ItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre&gt;                &amp;lt;table width=&lt;span class="str"&gt;"100%"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                    &amp;lt;tr&amp;gt;&lt;/pre&gt;&lt;pre&gt;                        &amp;lt;td valign=&lt;span class="str"&gt;"top"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                            &amp;lt;asp:LinkButton ID=&lt;span class="str"&gt;"Select"&lt;/span&gt; CommandName=&lt;span class="str"&gt;"Select"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; Text=&lt;span class="str"&gt;"Select"&lt;/span&gt;&amp;gt;&amp;lt;/asp:LinkButton&amp;gt;&lt;/pre&gt;&lt;pre&gt;                        &amp;lt;/td&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                    &amp;lt;/tr&amp;gt;&lt;/pre&gt;&lt;pre&gt;                    &amp;lt;tr&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                        &amp;lt;td valign=&lt;span class="str"&gt;"top"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre&gt;                            &amp;lt;asp:LinkButton ID=&lt;span class="str"&gt;"Delete"&lt;/span&gt; CommandName=&lt;span class="str"&gt;"Delete"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; Text=&lt;span class="str"&gt;"Delete"&lt;/span&gt; OnClientClick=&lt;span class="str"&gt;"return confirm('Are you sure you want to delete this record?');"&lt;/span&gt;&amp;gt;&amp;lt;/asp:LinkButton&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                        &amp;lt;/td&amp;gt;&lt;/pre&gt;&lt;pre&gt;                    &amp;lt;/tr&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                &amp;lt;/table&amp;gt;&lt;/pre&gt;&lt;pre&gt;            &amp;lt;/ItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &amp;lt;HeaderStyle Font-Bold=&lt;span class="str"&gt;"False"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre&gt;        &amp;lt;/asp:TemplateField&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &amp;lt;/Columns&amp;gt;&lt;/pre&gt;&lt;pre&gt;&amp;lt;/asp:GridView&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode-wrapper, .csharpcode-wrapper pre {
  background-color: #f4f4f4;
  border: solid 1px gray;
  cursor: text;
  font-family: consolas, 'Courier New', courier, monospace;
  font-size: 8pt;
  line-height: 12pt;
  margin: 20px 0px 10px 0px;
  max-height: 200px;
  overflow: auto;
  padding: 4px 4px 4px 4px;
  width: 97.5%;
}
.csharpcode-wrapper pre {
  border-style: none;
  margin: 0px 0px 0px 0px;
  overflow: visible;
  padding: 0px 0px 0px 0px;
}
.csharpcode, .csharpcode pre, .csharpcode .alt {
  background-color: #f4f4f4;
  border-style: none;
  color: black;
  font-family: consolas, 'Courier New', courier, monospace;
  font-size: 8pt;
  line-height: 12pt;
  overflow: visible;
  padding: 0px 0px 0px 0px;
  width: 100%;
}
.csharpcode pre {
  margin: 0em;
}
.csharpcode .alt {
  background-color: white;
}
.csharpcode .asp {
  background-color: #ffff00;
}
.csharpcode .attr {
  color: #ff0000;
}
.csharpcode .html {
  color: #800000;
}
.csharpcode .kwrd {
  color: #0000ff;
}
.csharpcode .lnum {
  color: #606060;
}
.csharpcode .op {
  color: #0000c0;
}
.csharpcode .preproc {
  color: #cc6633;
}
.csharpcode .rem {
  color: #008000;
}
.csharpcode .str {
  color: #006080;
}
&lt;/style&gt;
&lt;/div&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;We have made extensive use of template columns to give it a different look. &lt;br&gt;To bind the data we simply used: &lt;em&gt;Text='&amp;lt;%#Bind("Column_Name")%&amp;gt;'&lt;/em&gt; e.g.&lt;br&gt;&lt;em&gt;Text = '&amp;lt;%#Bind("Title")%&amp;gt;'&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;Notice that the paging is disabled. DataKeyNames is set to the Primary Key,&lt;/font&gt;&lt;font face="Segoe UI" size="2"&gt;&lt;br&gt;and we have defined OnRowDeleting event for deleting a record.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;Remember those days, when we used to code OnItemDatBound event in &lt;br&gt;ASP.Net 1.1 to bind the Delete button attribute with an OnClick event. Now, &lt;br&gt;its as easy as assigning &lt;em&gt;OnClientClick = [required javascript]&lt;/em&gt; e.g.&lt;br&gt;&lt;em&gt;OnClientClick = "return confirm(Are you sure?)"&lt;/em&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;The DetailsView looks like the following in code:&lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode-wrapper" style="width: 46.9%; height: 170px"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&amp;lt;asp:DetailsView ID=&lt;span class="str"&gt;"EntityDetailsView"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; AutoGenerateRows=&lt;span class="str"&gt;"False"&lt;/span&gt; DataKeyNames=&lt;span class="str"&gt;"EntityID"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    DataSourceID=&lt;span class="str"&gt;"odsDetailView"&lt;/span&gt; Height=&lt;span class="str"&gt;"50px"&lt;/span&gt; Width=&lt;span class="str"&gt;"100%"&lt;/span&gt; OnItemInserted=&lt;span class="str"&gt;"EntityDetailsView_ItemInserted"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    OnItemUpdated=&lt;span class="str"&gt;"EntityDetailsView_ItemUpdated"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;Fields&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &amp;lt;asp:BoundField DataField=&lt;span class="str"&gt;"EntityID"&lt;/span&gt; HeaderText=&lt;span class="str"&gt;"ID:"&lt;/span&gt; InsertVisible=&lt;span class="str"&gt;"False"&lt;/span&gt; ReadOnly=&lt;span class="str"&gt;"True"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            SortExpression=&lt;span class="str"&gt;"EntityID"&lt;/span&gt; HeaderStyle-Width=&lt;span class="str"&gt;"15%"&lt;/span&gt; HeaderStyle-Font-Bold=&lt;span class="str"&gt;"true"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &amp;lt;asp:BoundField DataField=&lt;span class="str"&gt;"UserID"&lt;/span&gt; HeaderText=&lt;span class="str"&gt;"UserID"&lt;/span&gt; SortExpression=&lt;span class="str"&gt;"UserID"&lt;/span&gt; Visible=&lt;span class="str"&gt;"False"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre&gt;        &amp;lt;asp:TemplateField HeaderText=&lt;span class="str"&gt;"Title:"&lt;/span&gt; HeaderStyle-VerticalAlign=&lt;span class="str"&gt;"Top"&lt;/span&gt; SortExpression=&lt;span class="str"&gt;"Title"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            HeaderStyle-Font-Bold=&lt;span class="str"&gt;"true"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre&gt;            &amp;lt;EditItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                &amp;lt;asp:TextBox ID=&lt;span class="str"&gt;"TextBox1"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; Text=&lt;span class="str"&gt;'&amp;lt;%# Bind("Title") %&amp;gt;'&lt;/span&gt; CssClass=&lt;span class="str"&gt;"textbox"&lt;/span&gt;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;/pre&gt;&lt;pre&gt;            &amp;lt;/EditItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &amp;lt;InsertItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre&gt;                &amp;lt;asp:TextBox ID=&lt;span class="str"&gt;"TextBox1"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; Text=&lt;span class="str"&gt;'&amp;lt;%# Bind("Title") %&amp;gt;'&lt;/span&gt; CssClass=&lt;span class="str"&gt;"textbox"&lt;/span&gt;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &amp;lt;/InsertItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre&gt;            &amp;lt;ItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                &amp;lt;asp:Label ID=&lt;span class="str"&gt;"Label1"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; Text=&lt;span class="str"&gt;'&amp;lt;%# Bind("Title") %&amp;gt;'&lt;/span&gt;&amp;gt;&amp;lt;/asp:Label&amp;gt;&lt;/pre&gt;&lt;pre&gt;            &amp;lt;/ItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &amp;lt;/asp:TemplateField&amp;gt;&lt;/pre&gt;&lt;pre&gt;        &amp;lt;asp:TemplateField HeaderText=&lt;span class="str"&gt;"Description:"&lt;/span&gt; HeaderStyle-VerticalAlign=&lt;span class="str"&gt;"Top"&lt;/span&gt; SortExpression=&lt;span class="str"&gt;"Description"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            HeaderStyle-Font-Bold=&lt;span class="str"&gt;"true"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre&gt;            &amp;lt;EditItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                &amp;lt;asp:TextBox ID=&lt;span class="str"&gt;"TextBox2"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; Text=&lt;span class="str"&gt;'&amp;lt;%# Bind("Description") %&amp;gt;'&lt;/span&gt; CssClass=&lt;span class="str"&gt;"textarea"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;                    TextMode=&lt;span class="str"&gt;"MultiLine"&lt;/span&gt; Rows=&lt;span class="str"&gt;"5"&lt;/span&gt; Width=&lt;span class="str"&gt;"80%"&lt;/span&gt;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &amp;lt;/EditItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre&gt;            &amp;lt;InsertItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                &amp;lt;asp:TextBox ID=&lt;span class="str"&gt;"TextBox2"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; Text=&lt;span class="str"&gt;'&amp;lt;%# Bind("Description") %&amp;gt;'&lt;/span&gt; CssClass=&lt;span class="str"&gt;"textarea"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;                    TextMode=&lt;span class="str"&gt;"MultiLine"&lt;/span&gt; Rows=&lt;span class="str"&gt;"5"&lt;/span&gt; Width=&lt;span class="str"&gt;"80%"&lt;/span&gt;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &amp;lt;/InsertItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre&gt;            &amp;lt;ItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                &amp;lt;asp:Label ID=&lt;span class="str"&gt;"Label2"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; Text=&lt;span class="str"&gt;'&amp;lt;%# Bind("Description") %&amp;gt;'&lt;/span&gt;&amp;gt;&amp;lt;/asp:Label&amp;gt;&lt;/pre&gt;&lt;pre&gt;            &amp;lt;/ItemTemplate&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &amp;lt;/asp:TemplateField&amp;gt;&lt;/pre&gt;&lt;pre&gt;        &amp;lt;asp:CommandField ShowEditButton=&lt;span class="str"&gt;"True"&lt;/span&gt; ShowInsertButton=&lt;span class="str"&gt;"True"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &amp;lt;/Fields&amp;gt;&lt;/pre&gt;&lt;pre&gt;&amp;lt;/asp:DetailsView&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode-wrapper, .csharpcode-wrapper pre {
  background-color: #f4f4f4;
  border: solid 1px gray;
  cursor: text;
  font-family: consolas, 'Courier New', courier, monospace;
  font-size: 8pt;
  line-height: 12pt;
  margin: 20px 0px 10px 0px;
  max-height: 200px;
  overflow: auto;
  padding: 4px 4px 4px 4px;
  width: 97.5%;
}
.csharpcode-wrapper pre {
  border-style: none;
  margin: 0px 0px 0px 0px;
  overflow: visible;
  padding: 0px 0px 0px 0px;
}
.csharpcode, .csharpcode pre, .csharpcode .alt {
  background-color: #f4f4f4;
  border-style: none;
  color: black;
  font-family: consolas, 'Courier New', courier, monospace;
  font-size: 8pt;
  line-height: 12pt;
  overflow: visible;
  padding: 0px 0px 0px 0px;
  width: 100%;
}
.csharpcode pre {
  margin: 0em;
}
.csharpcode .alt {
  background-color: white;
}
.csharpcode .asp {
  background-color: #ffff00;
}
.csharpcode .attr {
  color: #ff0000;
}
.csharpcode .html {
  color: #800000;
}
.csharpcode .kwrd {
  color: #0000ff;
}
.csharpcode .lnum {
  color: #606060;
}
.csharpcode .op {
  color: #0000c0;
}
.csharpcode .preproc {
  color: #cc6633;
}
.csharpcode .rem {
  color: #008000;
}
.csharpcode .str {
  color: #006080;
}
&lt;/style&gt;
&lt;/div&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;Check out the following: &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;We have set &lt;em&gt;DataKeyField&lt;/em&gt; to the Primary Key and set the datasource ID to &lt;br&gt;an &lt;em&gt;ObjectDataSource&lt;/em&gt; called &lt;em&gt;"odsDetailView"&lt;/em&gt;. It fetches all the data via the&lt;br&gt;Business layer and it doesn't need to go to the DAL. &lt;/font&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;The ObjectDataSource truely helps us to build a 3-tier application. &lt;br&gt;Earlier, in this model the UI layer used to bind directly to the Data layer. &lt;br&gt;This actually used to break the tier, and caused scalability and &lt;br&gt;maintenance hassles. &lt;/font&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;We have &lt;em&gt;OnItemInserted&lt;/em&gt; and &lt;em&gt;OnItemUpdated&lt;/em&gt; events handled to refresh the&lt;br&gt;GridView whenever an update is made using the DetailsView. &lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode-wrapper" style="width: 47.37%; height: 79px"&gt;&lt;pre class="csharpcode"&gt;&amp;lt;asp:DetailsView ID=&lt;span class="str"&gt;"EntityDetailsView"&lt;/span&gt; runat=&lt;span class="str"&gt;"server"&lt;/span&gt; AutoGenerateRows=&lt;span class="str"&gt;"False"&lt;/span&gt; DataKeyNames=&lt;span class="str"&gt;"EntityID"&lt;/span&gt;    
 DataSourceID=&lt;span class="str"&gt;"odsDetailView"&lt;/span&gt; Height=&lt;span class="str"&gt;"50px"&lt;/span&gt; Width=&lt;span class="str"&gt;"100%"&lt;/span&gt; OnItemInserted=&lt;span class="str"&gt;"EntityDetailsView_ItemInserted"&lt;/span&gt;    
 OnItemUpdated=&lt;span class="str"&gt;"EntityDetailsView_ItemUpdated"&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;So, whenever you click on the Select button in a row inside the GridView,&lt;br&gt;the &lt;em&gt;ObjectDataSource&lt;/em&gt; retrieves the &lt;em&gt;PrimaryKey&lt;/em&gt; from the &lt;em&gt;SelectedValue&lt;/em&gt; property&lt;br&gt;of the GridView. See the definition of the ASP &lt;em&gt;ControlParameter&lt;/em&gt; below.&lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode-wrapper" style="width: 47.54%; height: 138px"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&amp;lt;SelectParameters&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;asp:SessionParameter DefaultValue=&lt;span class="str"&gt;"fareast\sanjeets"&lt;/span&gt; Name=&lt;span class="str"&gt;"UserID"&lt;/span&gt; SessionField=&lt;span class="str"&gt;"UserID"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        Type=&lt;span class="str"&gt;"String"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;asp:ControlParameter ControlID=&lt;span class="str"&gt;"MainGrid"&lt;/span&gt; Name=&lt;span class="str"&gt;"EntityID"&lt;/span&gt; PropertyName=&lt;span class="str"&gt;"SelectedValue"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        Type=&lt;span class="str"&gt;"Int32"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre&gt;&amp;lt;/SelectParameters&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;So far, we have discussed how the controls interact with each other to give you&lt;br&gt;you a nice clutter free UI for simple operations like Insert, Update, and Delete.&lt;br&gt;Now, lets move on the bigger picture. &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;I have entered about 50K rows in the Entities table. &lt;/font&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;Fair enough, I need paging now. Talking about normal paging would be painful, &lt;br&gt;so thats ruled out (I hope you understand what does the normal paging will &lt;br&gt;do, it will bring all 50K rows and show you 10 rows... it hurts). &lt;/font&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;GridView alongwith ObjectDataSource brings to CustomPaging, so all you have to do,&lt;br&gt;is to use the magic of Row_Number in Sql Server 2005 to bring sequential rows.&lt;br&gt;But, thats again almost codeless. So, you have lesser control over it? I hope you&lt;br&gt;still remember scalability? right?&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;Refer to&amp;nbsp;&lt;a href="http://weblogs.asp.net/scottgu/archive/2006/01/01/434314.aspx"&gt;Paging through lots of data efficiently (and in an Ajax way) with ASP.NET 2.0&lt;/a&gt;&lt;/font&gt;&lt;font face="Segoe UI" size="2"&gt; for more &lt;br&gt;information about how to almost codelessly implement custom paging.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;Lets take a look into the 2 Stored Procedures:&lt;br&gt;The first one as the name suggests Selects Paged rows by a given condition.&lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode-wrapper" style="width: 47.47%; height: 143px"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;Procedure&lt;/span&gt; [dbo].[SelectPagedEntityByUser]&lt;/pre&gt;&lt;pre&gt;    @StartRowIndex &lt;span class="kwrd"&gt;int&lt;/span&gt;,&lt;/pre&gt;&lt;pre class="alt"&gt;    @MaximumRows &lt;span class="kwrd"&gt;int&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;    @UserID &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(50)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;AS&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;Select&lt;/span&gt; EntityID, UserID, Title, [Description]&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;From&lt;/span&gt; AllEntities&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;Where&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    SrNum &lt;span class="kwrd"&gt;Between&lt;/span&gt; @StartRowIndex &lt;span class="kwrd"&gt;AND&lt;/span&gt; (@StartRowIndex+@MaximumRows)-1&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;AND&lt;/span&gt; UserID = @UserID&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;It uses the following view:&lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode-wrapper" style="width: 47.48%; height: 101px"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;View&lt;/span&gt; [dbo].[AllEntities]&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;AS&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;Select&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    EntityID, UserID, Title, [Description], &lt;/pre&gt;&lt;pre class="alt"&gt;    Row_Number() &lt;span class="kwrd"&gt;Over&lt;/span&gt;(&lt;span class="kwrd"&gt;Order&lt;/span&gt; &lt;span class="kwrd"&gt;By&lt;/span&gt; EntityID) &lt;span class="kwrd"&gt;as&lt;/span&gt; SrNum&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;From&lt;/span&gt; Entity&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;The second one, as the name suggests Selects Paged rows by a given condition with a sort&lt;br&gt;condition:&lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode-wrapper" style="width: 47.76%; height: 276px"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;Procedure&lt;/span&gt; [dbo].[SelectPagedEntityByUserOrdered]&lt;/pre&gt;&lt;pre&gt;    @StartRowIndex &lt;span class="kwrd"&gt;int&lt;/span&gt;,&lt;/pre&gt;&lt;pre class="alt"&gt;    @MaximumRows &lt;span class="kwrd"&gt;int&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;    @UserID &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(50),&lt;/pre&gt;&lt;pre class="alt"&gt;    @ColumnToOrder &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(50),&lt;/pre&gt;&lt;pre&gt;    @OrderDirection &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(10)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;AS&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; @ColumnToOrder &lt;span class="kwrd"&gt;like&lt;/span&gt; &lt;span class="str"&gt;'%ID'&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; @OrderDirection = &lt;span class="str"&gt;'asc'&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;Select&lt;/span&gt; EntityID, UserID, Title, [Description]&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;From&lt;/span&gt; (&lt;/pre&gt;&lt;pre&gt;                        &lt;span class="kwrd"&gt;Select&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;                            EntityID, UserID, Title, [Description], &lt;/pre&gt;&lt;pre&gt;                            Row_Number() &lt;span class="kwrd"&gt;Over&lt;/span&gt;(&lt;span class="kwrd"&gt;Order&lt;/span&gt; &lt;span class="kwrd"&gt;By&lt;/span&gt; EntityID) &lt;span class="kwrd"&gt;as&lt;/span&gt; SrNum&lt;/pre&gt;&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;From&lt;/span&gt; Entity&lt;/pre&gt;&lt;pre&gt;                    ) &lt;span class="kwrd"&gt;as&lt;/span&gt; temp&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;Where&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;                SrNum &lt;span class="kwrd"&gt;Between&lt;/span&gt; @StartRowIndex &lt;span class="kwrd"&gt;AND&lt;/span&gt; (@StartRowIndex+@MaximumRows)-1&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;AND&lt;/span&gt; UserID = @UserID&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;Select&lt;/span&gt; EntityID, UserID, Title, [Description]&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;From&lt;/span&gt; (&lt;/pre&gt;&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;Select&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;                            EntityID, UserID, Title, [Description], &lt;/pre&gt;&lt;pre class="alt"&gt;                            Row_Number() &lt;span class="kwrd"&gt;Over&lt;/span&gt;(&lt;span class="kwrd"&gt;Order&lt;/span&gt; &lt;span class="kwrd"&gt;By&lt;/span&gt; EntityID &lt;span class="kwrd"&gt;DESC&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; SrNum&lt;/pre&gt;&lt;pre&gt;                        &lt;span class="kwrd"&gt;From&lt;/span&gt; Entity&lt;/pre&gt;&lt;pre class="alt"&gt;                    ) &lt;span class="kwrd"&gt;as&lt;/span&gt; temp&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;Where&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;                SrNum &lt;span class="kwrd"&gt;Between&lt;/span&gt; @StartRowIndex &lt;span class="kwrd"&gt;AND&lt;/span&gt; (@StartRowIndex+@MaximumRows)-1&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;AND&lt;/span&gt; UserID = @UserID&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; @ColumnToOrder = &lt;span class="str"&gt;'title'&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; @OrderDirection = &lt;span class="str"&gt;'asc'&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;Select&lt;/span&gt; EntityID, UserID, Title, [Description]&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;From&lt;/span&gt; (&lt;/pre&gt;&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;Select&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;                            EntityID, UserID, Title, [Description], &lt;/pre&gt;&lt;pre class="alt"&gt;                            Row_Number() &lt;span class="kwrd"&gt;Over&lt;/span&gt;(&lt;span class="kwrd"&gt;Order&lt;/span&gt; &lt;span class="kwrd"&gt;By&lt;/span&gt; Title) &lt;span class="kwrd"&gt;as&lt;/span&gt; SrNum&lt;/pre&gt;&lt;pre&gt;                        &lt;span class="kwrd"&gt;From&lt;/span&gt; Entity&lt;/pre&gt;&lt;pre class="alt"&gt;                    ) &lt;span class="kwrd"&gt;as&lt;/span&gt; temp&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;Where&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;                SrNum &lt;span class="kwrd"&gt;Between&lt;/span&gt; @StartRowIndex &lt;span class="kwrd"&gt;AND&lt;/span&gt; (@StartRowIndex+@MaximumRows)-1&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;AND&lt;/span&gt; UserID = @UserID&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;Select&lt;/span&gt; EntityID, UserID, Title, [Description]&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;From&lt;/span&gt; (&lt;/pre&gt;&lt;pre&gt;                        &lt;span class="kwrd"&gt;Select&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;                            EntityID, UserID, Title, [Description], &lt;/pre&gt;&lt;pre&gt;                            Row_Number() &lt;span class="kwrd"&gt;Over&lt;/span&gt;(&lt;span class="kwrd"&gt;Order&lt;/span&gt; &lt;span class="kwrd"&gt;By&lt;/span&gt; Title &lt;span class="kwrd"&gt;DESC&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; SrNum&lt;/pre&gt;&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;From&lt;/span&gt; Entity&lt;/pre&gt;&lt;pre&gt;                    ) &lt;span class="kwrd"&gt;as&lt;/span&gt; temp&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;Where&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;                SrNum &lt;span class="kwrd"&gt;Between&lt;/span&gt; @StartRowIndex &lt;span class="kwrd"&gt;AND&lt;/span&gt; (@StartRowIndex+@MaximumRows)-1&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;AND&lt;/span&gt; UserID = @UserID&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; @ColumnToOrder &lt;span class="kwrd"&gt;like&lt;/span&gt; &lt;span class="str"&gt;'desc%'&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; @OrderDirection = &lt;span class="str"&gt;'asc'&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;Select&lt;/span&gt; EntityID, UserID, Title, [Description]&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;From&lt;/span&gt; (&lt;/pre&gt;&lt;pre&gt;                        &lt;span class="kwrd"&gt;Select&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;                            EntityID, UserID, Title, [Description], &lt;/pre&gt;&lt;pre&gt;                            Row_Number() &lt;span class="kwrd"&gt;Over&lt;/span&gt;(&lt;span class="kwrd"&gt;Order&lt;/span&gt; &lt;span class="kwrd"&gt;By&lt;/span&gt; [Description]) &lt;span class="kwrd"&gt;as&lt;/span&gt; SrNum&lt;/pre&gt;&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;From&lt;/span&gt; Entity&lt;/pre&gt;&lt;pre&gt;                    ) &lt;span class="kwrd"&gt;as&lt;/span&gt; temp&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;Where&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;                SrNum &lt;span class="kwrd"&gt;Between&lt;/span&gt; @StartRowIndex &lt;span class="kwrd"&gt;AND&lt;/span&gt; (@StartRowIndex+@MaximumRows)-1&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;AND&lt;/span&gt; UserID = @UserID&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;else&lt;/span&gt;        &lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;Select&lt;/span&gt; EntityID, UserID, Title, [Description]&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;From&lt;/span&gt; (&lt;/pre&gt;&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;Select&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;                            EntityID, UserID, Title, [Description], &lt;/pre&gt;&lt;pre class="alt"&gt;                            Row_Number() &lt;span class="kwrd"&gt;Over&lt;/span&gt;(&lt;span class="kwrd"&gt;Order&lt;/span&gt; &lt;span class="kwrd"&gt;By&lt;/span&gt; [Description] &lt;span class="kwrd"&gt;DESC&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; SrNum&lt;/pre&gt;&lt;pre&gt;                        &lt;span class="kwrd"&gt;From&lt;/span&gt; Entity&lt;/pre&gt;&lt;pre class="alt"&gt;                    ) &lt;span class="kwrd"&gt;as&lt;/span&gt; temp&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;Where&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;                SrNum &lt;span class="kwrd"&gt;Between&lt;/span&gt; @StartRowIndex &lt;span class="kwrd"&gt;AND&lt;/span&gt; (@StartRowIndex+@MaximumRows)-1&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;AND&lt;/span&gt; UserID = @UserID&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;end&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;Their corresponding functions in the BL looks like the following:&lt;br&gt;Notice the use of Generics.&lt;br&gt;For the unsorted:&lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode-wrapper" style="width: 48.03%; height: 224px"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// This function return a strongly type list containing paged data&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// A benefit of using Generic here is to minimize the size of the object&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="UserID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="StartRowIndex"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="MaximumRows"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;Entity&amp;gt; Select(&lt;span class="kwrd"&gt;string&lt;/span&gt; UserID, &lt;span class="kwrd"&gt;int&lt;/span&gt; StartRowIndex, &lt;span class="kwrd"&gt;int&lt;/span&gt; MaximumRows)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    ManageabilityDS.EntityDataTable tbl = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;    List&amp;lt;Entity&amp;gt; t = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Entity&amp;gt;(); &lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        ManageabilityDSTableAdapters.EntityTableAdapter ad = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManageabilityDSTableAdapters.EntityTableAdapter();&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//GetPagedEntityByUser function is defined in the DataSet&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        tbl = ad.GetPagedEntityByUser(StartRowIndex, MaximumRows, UserID);&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//fill the strongly typed List with data&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ManageabilityDS.EntityRow row &lt;span class="kwrd"&gt;in&lt;/span&gt; tbl.Rows)&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;            Entity en = &lt;span class="kwrd"&gt;new&lt;/span&gt; Entity();&lt;/pre&gt;&lt;pre&gt;            en.EntityID = row.EntityID;&lt;/pre&gt;&lt;pre class="alt"&gt;            en.UserId = row.UserID;&lt;/pre&gt;&lt;pre&gt;            en.Title = row.Title;&lt;/pre&gt;&lt;pre class="alt"&gt;            en.Description = row.Description;&lt;/pre&gt;&lt;pre&gt;            t.Add(en);&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; t;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;For the sorted:&lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode-wrapper" style="width: 48.29%; height: 208px"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// This function return a strongly type list containing paged and sorted data&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="UserID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="StartRowIndex"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="MaximumRows"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="ColumnToOrder"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="OrderDirection"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;Entity&amp;gt; Select(&lt;span class="kwrd"&gt;string&lt;/span&gt; UserID, &lt;span class="kwrd"&gt;int&lt;/span&gt; StartRowIndex, &lt;span class="kwrd"&gt;int&lt;/span&gt; MaximumRows, &lt;span class="kwrd"&gt;string&lt;/span&gt; ColumnToOrder, &lt;span class="kwrd"&gt;string&lt;/span&gt; OrderDirection)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    ManageabilityDS.EntityDataTable tbl = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;    List&amp;lt;Entity&amp;gt; t = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Entity&amp;gt;();&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        ManageabilityDSTableAdapters.EntityTableAdapter ad = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManageabilityDSTableAdapters.EntityTableAdapter();&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//GetPagedEntityByUserOrdered function is defined in the DataSet&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        tbl = ad.GetPagedEntityByUserOrdered(StartRowIndex, MaximumRows, UserID, ColumnToOrder, OrderDirection);&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//fill the strongly typed List with data&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ManageabilityDS.EntityRow row &lt;span class="kwrd"&gt;in&lt;/span&gt; tbl.Rows)&lt;/pre&gt;&lt;pre class="alt"&gt;        {&lt;/pre&gt;&lt;pre&gt;            Entity en = &lt;span class="kwrd"&gt;new&lt;/span&gt; Entity();&lt;/pre&gt;&lt;pre class="alt"&gt;            en.EntityID = row.EntityID;&lt;/pre&gt;&lt;pre&gt;            en.UserId = row.UserID;&lt;/pre&gt;&lt;pre class="alt"&gt;            en.Title = row.Title;&lt;/pre&gt;&lt;pre&gt;            en.Description = row.Description;&lt;/pre&gt;&lt;pre class="alt"&gt;            t.Add(en);&lt;/pre&gt;&lt;pre&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; t;&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;Let's get back to the Presentation Layer. Here, as part of customization we have the&lt;br&gt;GridView inside a table which is sitting inside an asp:UpdatePanel... AJAX effect!!!&lt;br&gt;Simple, sweet and effective. &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;We had to create the PageLinks for navigation. The ellipsis and all other links are created&lt;br&gt;on the fly and provides smooth and fast navigation at any point.&lt;br&gt;When you click on the link, only PageSize number of rows are fetched from the database,&lt;br&gt;so practically it doesn't matter if you have 50K or 500K records!!! &lt;/font&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;Lets see how the Links are created:&lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode-wrapper" style="width: 48.6%; height: 175px"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// This sub creates all the links on the page&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CreateButtons()&lt;/pre&gt;&lt;pre class="alt"&gt;{       &lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; totalRecords = &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(RecordCountHdn.Value);&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; pageSize = &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(PageSizeHdn.Value);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//calculate the total number of links to be created&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; totalPages = totalRecords % pageSize == 0 ? totalRecords / pageSize : (totalRecords / pageSize) + 1;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="rem"&gt;//this is for the ellipsis, keeps a track of the previous bunch of links&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; x = &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(ViewState[&lt;span class="str"&gt;"PageLinkLastBunchCount"&lt;/span&gt;].ToString());&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//its the counter that checks whether all the links are created&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; p = MAX_PAGE_LINKS * (x + 1);&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;/pre&gt;&lt;pre&gt;    &lt;span class="rem"&gt;//The ellipsis linkbutton&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    LinkButton ellipsis = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;////To AJAXify the linkbuttons you need to have triggers&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    AsyncPostBackTrigger t = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="rem"&gt;//clear any previous links in the placeholder&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    PageLinksPH.Controls.Clear();&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (p &amp;lt; totalPages)&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//if you are on the first bunch of links&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (x == 0)&lt;/pre&gt;&lt;pre class="alt"&gt;        {                &lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = MAX_PAGE_LINKS * x; i &amp;lt; p; i++)&lt;/pre&gt;&lt;pre class="alt"&gt;            {&lt;/pre&gt;&lt;pre&gt;                LinkButton l = &lt;span class="kwrd"&gt;new&lt;/span&gt; LinkButton();&lt;/pre&gt;&lt;pre class="alt"&gt;                l.ID = &lt;span class="str"&gt;"pagelink"&lt;/span&gt;+i;&lt;/pre&gt;&lt;pre&gt;                l.Text = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}"&lt;/span&gt;, i + 1);&lt;/pre&gt;&lt;pre class="alt"&gt;                l.ToolTip = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}+..."&lt;/span&gt;, (i * pageSize) + 1);&lt;/pre&gt;&lt;pre&gt;                l.CommandArgument = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}"&lt;/span&gt;, (i * pageSize) + 1);&lt;/pre&gt;&lt;pre class="alt"&gt;                l.CssClass = &lt;span class="str"&gt;"pagelink"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;                &lt;span class="rem"&gt;//add event handler to each linkbutton&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                l.Click += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(l_Click);&lt;/pre&gt;&lt;pre&gt;                PageLinksPH.Controls.Add(l);&lt;/pre&gt;&lt;pre class="alt"&gt;                t = &lt;span class="kwrd"&gt;new&lt;/span&gt; AsyncPostBackTrigger();&lt;/pre&gt;&lt;pre&gt;                t.ControlID = l.ID;&lt;/pre&gt;&lt;pre class="alt"&gt;                AjaxPanel.Triggers.Add(t);&lt;/pre&gt;&lt;pre&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;            ellipsis = &lt;span class="kwrd"&gt;new&lt;/span&gt; LinkButton();&lt;/pre&gt;&lt;pre&gt;            ellipsis.ID = &lt;span class="str"&gt;"ellipsisNext"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;            ellipsis.Text = &lt;span class="str"&gt;"&amp;gt;&amp;gt;"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;            ellipsis.ToolTip = &lt;span class="str"&gt;"Next"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;            ellipsis.CommandArgument = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"next"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;            ellipsis.CssClass = &lt;span class="str"&gt;"pagelink"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//add event handler to each linkbutton&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            ellipsis.Click += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(ellipsis_Click);&lt;/pre&gt;&lt;pre class="alt"&gt;            PageLinksPH.Controls.Add(ellipsis);&lt;/pre&gt;&lt;pre&gt;            t = &lt;span class="kwrd"&gt;new&lt;/span&gt; AsyncPostBackTrigger();&lt;/pre&gt;&lt;pre class="alt"&gt;            t.ControlID = ellipsis.ID;&lt;/pre&gt;&lt;pre&gt;            AjaxPanel.Triggers.Add(t);&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="rem"&gt;//this will show next and the previous ellipsis&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        {&lt;/pre&gt;&lt;pre&gt;            ellipsis = &lt;span class="kwrd"&gt;new&lt;/span&gt; LinkButton();&lt;/pre&gt;&lt;pre class="alt"&gt;            ellipsis.Text = &lt;span class="str"&gt;"&amp;lt;&amp;lt;"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;            ellipsis.ID = &lt;span class="str"&gt;"ellipsisPrevious"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;            ellipsis.ToolTip = &lt;span class="str"&gt;"Previous"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;            ellipsis.CommandArgument = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"previous"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;            ellipsis.CssClass = &lt;span class="str"&gt;"pagelink"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="rem"&gt;//add event handler to each linkbutton&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            ellipsis.Click += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(ellipsis_Click);&lt;/pre&gt;&lt;pre&gt;            PageLinksPH.Controls.Add(ellipsis);&lt;/pre&gt;&lt;pre class="alt"&gt;            t = &lt;span class="kwrd"&gt;new&lt;/span&gt; AsyncPostBackTrigger();&lt;/pre&gt;&lt;pre&gt;            t.ControlID = ellipsis.ID;&lt;/pre&gt;&lt;pre class="alt"&gt;            AjaxPanel.Triggers.Add(t);&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = MAX_PAGE_LINKS * x; i &amp;lt; p; i++)&lt;/pre&gt;&lt;pre class="alt"&gt;            {&lt;/pre&gt;&lt;pre&gt;                LinkButton l = &lt;span class="kwrd"&gt;new&lt;/span&gt; LinkButton();&lt;/pre&gt;&lt;pre class="alt"&gt;                l.ID = &lt;span class="str"&gt;"pagelink"&lt;/span&gt; + i;&lt;/pre&gt;&lt;pre&gt;                l.Text = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}"&lt;/span&gt;, i + 1);&lt;/pre&gt;&lt;pre class="alt"&gt;                l.ToolTip = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}+..."&lt;/span&gt;, (i * pageSize) + 1);&lt;/pre&gt;&lt;pre&gt;                l.CommandArgument = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}"&lt;/span&gt;, (i * pageSize) + 1);&lt;/pre&gt;&lt;pre class="alt"&gt;                l.CssClass = &lt;span class="str"&gt;"pagelink"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;                &lt;span class="rem"&gt;//add event handler to each linkbutton&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                l.Click += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(l_Click);&lt;/pre&gt;&lt;pre&gt;                PageLinksPH.Controls.Add(l);&lt;/pre&gt;&lt;pre class="alt"&gt;                t = &lt;span class="kwrd"&gt;new&lt;/span&gt; AsyncPostBackTrigger();&lt;/pre&gt;&lt;pre&gt;                t.ControlID = l.ID;&lt;/pre&gt;&lt;pre class="alt"&gt;                AjaxPanel.Triggers.Add(t);&lt;/pre&gt;&lt;pre&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;            ellipsis = &lt;span class="kwrd"&gt;new&lt;/span&gt; LinkButton();&lt;/pre&gt;&lt;pre&gt;            ellipsis.ID = &lt;span class="str"&gt;"ellipsisNext"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;            ellipsis.Text = &lt;span class="str"&gt;"&amp;gt;&amp;gt;"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;            ellipsis.ToolTip = &lt;span class="str"&gt;"Next"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;            ellipsis.CommandArgument = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"next"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;            ellipsis.CssClass = &lt;span class="str"&gt;"pagelink"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//add event handler to each linkbutton&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            ellipsis.Click += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(ellipsis_Click);&lt;/pre&gt;&lt;pre class="alt"&gt;            PageLinksPH.Controls.Add(ellipsis);&lt;/pre&gt;&lt;pre&gt;            t = &lt;span class="kwrd"&gt;new&lt;/span&gt; AsyncPostBackTrigger();&lt;/pre&gt;&lt;pre class="alt"&gt;            t.ControlID = ellipsis.ID;&lt;/pre&gt;&lt;pre&gt;            AjaxPanel.Triggers.Add(t);&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;    }        &lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;Event handler for the ellipsis:&lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode-wrapper" style="width: 48.81%; height: 188px"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// The ellipsis' event handler. It shows the next/previous bunch of links&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; ellipsis_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    &lt;span class="rem"&gt;//throw new Exception("The method or operation is not implemented.");&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    LinkButton l = (LinkButton)sender;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; x = &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(ViewState[&lt;span class="str"&gt;"PageLinkLastBunchCount"&lt;/span&gt;].ToString());&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (l.CommandArgument.ToLower().Equals(&lt;span class="str"&gt;"previous"&lt;/span&gt;))&lt;/pre&gt;&lt;pre&gt;    {            &lt;/pre&gt;&lt;pre class="alt"&gt;        x--;&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (l.CommandArgument.ToLower().Equals(&lt;span class="str"&gt;"next"&lt;/span&gt;))&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        x++;        &lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;    ViewState[&lt;span class="str"&gt;"PageLinkLastBunchCount"&lt;/span&gt;] = x;&lt;/pre&gt;&lt;pre&gt;    CreateButtons();&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;Event handler for the links:&lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode-wrapper" style="width: 48.73%; height: 158px"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// This handler will send the query to the database fetching the &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// exact number of records only. It also takes care of sorting.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; l_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//throw new Exception("The method or operation is not implemented.");&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="rem"&gt;//Response.Write("l_Click");&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        LinkButton l = (LinkButton)sender;&lt;/pre&gt;&lt;pre&gt;        l.CssClass = &lt;span class="str"&gt;"pagelinkSelected"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; startIndex = &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(l.CommandArgument);&lt;/pre&gt;&lt;pre&gt;        ViewState[&lt;span class="str"&gt;"PageStartIndex"&lt;/span&gt;] = startIndex;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; pageSize = &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(PageSizeHdn.Value);&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;using&lt;/span&gt; (Entity en = &lt;span class="kwrd"&gt;new&lt;/span&gt; Entity())&lt;/pre&gt;&lt;pre class="alt"&gt;        {&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (_isPageSorted)&lt;/pre&gt;&lt;pre class="alt"&gt;            {&lt;/pre&gt;&lt;pre&gt;                MainGrid.DataSource = en.Select(_userID, startIndex, pageSize, ColumnList.SelectedValue.ToString(), OrderDirectionList.SelectedValue.ToString());&lt;/pre&gt;&lt;pre class="alt"&gt;            }&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            {&lt;/pre&gt;&lt;pre&gt;                MainGrid.DataSource = en.Select(_userID, startIndex, pageSize);&lt;/pre&gt;&lt;pre class="alt"&gt;            }&lt;/pre&gt;&lt;pre&gt;            MainGrid.DataBind();&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;        InfoLabel.Text = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"You are at Page# {0}"&lt;/span&gt;, l.Text);&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt;(Exception ex)&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        ErrorLabel.Text = ex.Message;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;After you follow the steps above, I am sure it will be a cake walk for you all to create&lt;br&gt;or maintain any such page. It might appear to be lots of work, but its highly reliable&lt;br&gt;and scalable. No blackboxes!!! &lt;/font&gt;
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;So, this brings us to an end of this long post, I sincerely hope it will help you a lot.&lt;/font&gt; 
&lt;p&gt;&lt;font face="Segoe UI" size="2"&gt;See you soon...&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3043681" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sanjeets/archive/tags/ajax/default.aspx">ajax</category><category domain="http://blogs.msdn.com/sanjeets/archive/tags/Custom+Paging/default.aspx">Custom Paging</category><category domain="http://blogs.msdn.com/sanjeets/archive/tags/GridView/default.aspx">GridView</category><category domain="http://blogs.msdn.com/sanjeets/archive/tags/Business+Object/default.aspx">Business Object</category><category domain="http://blogs.msdn.com/sanjeets/archive/tags/ObjectDatasource/default.aspx">ObjectDatasource</category></item></channel></rss>