<?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 : ajax</title><link>http://blogs.msdn.com/sanjeets/archive/tags/ajax/default.aspx</link><description>Tags: ajax</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><item><title>AJAX in a nutshell : It can't get any simpler folks</title><link>http://blogs.msdn.com/sanjeets/archive/2007/04/18/ajax-in-a-nutshell-it-can-t-get-any-simpler-folks.aspx</link><pubDate>Thu, 19 Apr 2007 05:55:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2184969</guid><dc:creator>Sanjeet</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/sanjeets/comments/2184969.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sanjeets/commentrss.aspx?PostID=2184969</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sanjeets/rsscomments.aspx?PostID=2184969</wfw:comment><description>&lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;&lt;strong&gt;1. Ajax basics&lt;/strong&gt; &lt;/font&gt; &lt;p&gt;&lt;font color="#0080c0"&gt;&lt;font face="Segoe UI" size="2"&gt;- "Asynchronous JavaScript and XML," is a web development technique for creating interactive web applications. The intent is to make web pages feel more &lt;/font&gt;&lt;font face="Segoe UI" size="2"&gt;responsive by exchanging small amounts of data with the server behind the scenes, so that the entire web page does not have to be reloaded each time the user &lt;/font&gt;&lt;font face="Segoe UI" size="2"&gt;requests a change. &lt;/font&gt;&lt;/font&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- Ajax uses the following existing technologies.&lt;br&gt;&lt;em&gt;Designing/Styling :&lt;/em&gt; XHTML/HTML, CSS&lt;br&gt;&lt;em&gt;Async/Sync calls to the server :&lt;/em&gt; XMLHttpRequest&lt;br&gt;&lt;em&gt;Data manipulation :&lt;/em&gt; DOM&lt;br&gt;&lt;em&gt;Data&amp;nbsp;Exchange :&lt;/em&gt; XML, Html, Plain Text, JSON&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- Ajax is not a technology in itself, but a term that refers to the use of a group of technologies. &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;&lt;strong&gt;2. History&lt;/strong&gt; &lt;/font&gt; &lt;p&gt;&lt;font color="#0080c0"&gt;&lt;font face="Segoe UI" size="2"&gt;- Although the term Ajax was coined in 2005, most of the technologies that enable Ajax started a decade earlier with Microsoft's initiatives in developing &lt;/font&gt;&lt;font face="Segoe UI" size="2"&gt;Remote Scripting.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- AJAX was made popular in 2005 by Google (with Google Suggest).&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- Remote Scripting allowed a Java Applet to pull data from the server and then use JavaScript at the client side to manipulate it.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- Microsoft then introduced XMLHttpRequest object in IE5 and used it extensively in OWA and MS Exchange 2000. &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;&lt;strong&gt;3. Advantages &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- User Experience&lt;br&gt;- Bandwidth Usage&lt;br&gt;- Separation of Data, format, style and function &lt;/font&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;&lt;strong&gt;4. Disadvantages &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;&lt;em&gt;- Browser Integration&lt;/em&gt;&lt;br&gt;The dynamically created page does not register itself with the browser history engine, so triggering the "Back" function of the users' browser might not &lt;/font&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;bring the desired result.&lt;br&gt;Another issue is that dynamic web page updates make it difficult for a user to bookmark a particular state of the application.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;&lt;em&gt;- Response Time&lt;/em&gt;&lt;br&gt;Network Latency or the interval between user request and server response&amp;nbsp;- needs to be considered carefully during Ajax development. ASP.Net Ajax has UpdateProgress to counter this concern.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;&lt;em&gt;- Dependency on Javascript&lt;/em&gt;&lt;br&gt;Ajax relies on JavaScript, which may be implemented differently by different browsers or versions of a particular browser. &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;&lt;strong&gt;5. A quick view of XMLHttpRequest&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- &lt;/font&gt;&lt;a href="http://blogs.msdn.com/sanjeets/archive/2007/04/11/xmlhttp-step-1.aspx"&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;http://blogs.msdn.com/sanjeets/archive/2007/04/11/xmlhttp-step-1.aspx&lt;/font&gt;&lt;/a&gt;&lt;br&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- &lt;/font&gt;&lt;a href="http://blogs.msdn.com/sanjeets/archive/2007/04/13/xmlhttp-step-2.aspx"&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;http://blogs.msdn.com/sanjeets/archive/2007/04/13/xmlhttp-step-2.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;&lt;strong&gt;6. Ajax Toolkit and CTP &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- You need important&amp;nbsp;&lt;/font&gt;&lt;a href="http://ajax.asp.net/downloads/default.aspx?tabid=47"&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;AJAX Downloads&lt;/font&gt;&lt;/a&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;&amp;nbsp;to get started. It contains the AJAX Toolkit and Community Technology Preview controls. &lt;/font&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- The AJAX Extensions provides you with all the necessary controls like UpdatePanel, UpdateProgress, ScriptManager etc. It also provides you with an ASP.Net AJAX Enabled Website template. It is installed in your Visual Studio 2005. So, all you need to do is to select this template and then rock and roll.&lt;/font&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- The AJAX Toolkit is a set of controls that greatly enhance the UI and provides easy to use functionality.&lt;/font&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- The CTP tools provide you an some original and extender controls. This is actually created and supported by the ASP.Net AJAX community.&lt;/font&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- See the&amp;nbsp;&lt;/font&gt;&lt;a href="http://www.asp.net/learn/videos/default.aspx?tabid=63"&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;ASP.Net AJAX videos to do simple things simply&lt;/font&gt;&lt;/a&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;&lt;strong&gt;7. Asynchronous communication Layer &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0080c0"&gt;&lt;font face="Segoe UI" size="2"&gt;- &lt;/font&gt;&lt;font face="Segoe UI" size="2"&gt;The MS ASP.Net AJAX Asynchronous Communication Layer enables a browser to call a Web Service method on the server using Javascript.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- It exposes APIs that Javascript functions can use in any browser to call Webservice.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- It can invoke ASP.Net page methods.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- It supports a variety of serialization formats like JSON(Javascript Object Notation), string, and XML.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- Generates JavaScript proxies at the client so that methods can be accessed using XMLHttp.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- It provides a default XMLHttpExecutor class that functions as an interface between a client web request and the network. &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sanjeets/WindowsLiveWriter/AJAXinanutshellItcantgetanysimplerfolks_10FE6/ACSC_Comm11.png" atomicselection="true"&gt;&lt;font color="#0080c0"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="223" src="http://blogs.msdn.com/blogfiles/sanjeets/WindowsLiveWriter/AJAXinanutshellItcantgetanysimplerfolks_10FE6/ACSC_Comm_thumb7.png" width="456" border="0"&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#0080c0"&gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- The ASP.Net AJAX Client Asynchronous Communication Layer looks like following. It uses JSON for data exchange&amp;nbsp;by default. Its preferred over SOAP/XML because of it doesn't need to use extensive Javascript to&amp;nbsp;construct requests.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- The proxies are created at the client end. This facilitates XMLHttpRequest object to send requests.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sanjeets/WindowsLiveWriter/AJAXinanutshellItcantgetanysimplerfolks_10FE6/ACSC_ClientArch2.png" atomicselection="true"&gt;&lt;font color="#0080c0"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="333" src="http://blogs.msdn.com/blogfiles/sanjeets/WindowsLiveWriter/AJAXinanutshellItcantgetanysimplerfolks_10FE6/ACSC_ClientArch_thumb.png" width="451" border="0"&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#0080c0"&gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- The Server Asynchronous Communication Layer looks like following. The Http Handler performs deserialization of JSON/XML request and hands it over to Business classes.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sanjeets/WindowsLiveWriter/AJAXinanutshellItcantgetanysimplerfolks_10FE6/ACSC_ServerArch2.png" atomicselection="true"&gt;&lt;font color="#0080c0"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="168" src="http://blogs.msdn.com/blogfiles/sanjeets/WindowsLiveWriter/AJAXinanutshellItcantgetanysimplerfolks_10FE6/ACSC_ServerArch_thumb.png" width="451" border="0"&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#0080c0"&gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;&lt;strong&gt;8. ScriptManager&lt;/strong&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Segoe UI"&gt;&lt;font color="#0080c0" size="2"&gt;- This guy needs special introduction as it sits on each of your AJAX enabled page.&lt;/font&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- By default, the&amp;nbsp;ScriptManager control registers the script for the Microsoft AJAX Library&amp;nbsp;with the page. This enables client script to use the type system extensions and to support features such as partial-page rendering and Web-service calls.&lt;/font&gt;  &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- It enables&amp;nbsp;Client-script functionality of the Microsoft AJAX Library, and any custom script that you want to send to the browser.&lt;/font&gt;  &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- Partial-page rendering, which enables regions on the page to be independently refreshed without a postback. The UpdatePanel, UpdateProgress and Time controls need it.&lt;/font&gt;  &lt;p&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;- JavaScript proxy classes for Web services, which enable you to use client script to access Web services by exposing Web services as strongly typed objects.&lt;/font&gt;  &lt;p&gt;&lt;font color="#0080c0"&gt;&lt;font face="Segoe UI" size="2"&gt;&lt;strong&gt;9. Resources &lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;font face="Segoe UI" size="2"&gt;- &lt;/font&gt;&lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/AJAX"&gt;&lt;font face="Segoe UI" color="#0080c0" size="2"&gt;http://en.wikipedia.org/wiki/AJAX&lt;/font&gt;&lt;/a&gt;&lt;br&gt;&lt;font face="Segoe UI" size="2"&gt;&lt;font color="#0080c0"&gt;- &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/overview/aboutxmlhttp.asp"&gt;&lt;font color="#0080c0"&gt;http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/overview/aboutxmlhttp.asp&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2184969" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sanjeets/archive/tags/ajax/default.aspx">ajax</category></item></channel></rss>