<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4942427404274609914</id><updated>2012-02-29T20:46:58.735-08:00</updated><category term='LINQ'/><category term='Visual Studio'/><category term='Developer Tools'/><category term='MVC'/><category term='SQL'/><category term='CSS'/><category term='IT'/><category term='Site Marketing'/><category term='Ajax'/><category term='ASP.NET'/><category term='Source code'/><category term='C#'/><category term='PHP'/><category term='JQuery'/><category term='Video Tutorials'/><category term='SEO'/><category term='Database'/><category term='CMS'/><category term='HTML'/><category term='OOP'/><category term='Community News'/><category term='IIS7'/><category term='JavaScript'/><category term='Design Patterns'/><category term='Tips and Tricks'/><category term='.NET'/><title type='text'>Programming Discussions</title><subtitle type='html'>.Net Tips &amp;amp; Tricks, C#, Javascript, Ajax, SQL, PHP programming skills,
.net, .net beginner, programming discussion, programming tutorials, asp.net,.net, tips, tricks, linq, sql,php, Free source code and tutorials for Software developers and Architects.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default?start-index=101&amp;max-results=100'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>103</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-2398480749211372907</id><published>2010-09-07T19:51:00.001-07:00</published><updated>2010-09-07T19:51:14.025-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>The Constructions of ASP.NET web pages</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;b&gt;If you’ve ever built a model from Lego bricks, you’re well prepared to start building real ASP.NET web pages. ASP.NET offers features that allow web developers to build parts of web pages independently, then put them together later to form complete pages. &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The content we’re creating through our work with ASP.NET is almost never static. At design time, we tend to think in terms of templates that contain placeholders for the content that will be generated dynamically at runtime. And to fill those placeholders, we can either use one of the many controls ASP.NET provides, or build our own.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;In this chapter of the fabulous new edition of &lt;a class="sublink" href="http://www.sitepoint.com/books/aspnet3/"&gt;&lt;i&gt;Build Your Own ASP.NET 3.5 Web Site Using C# &amp;amp; VB&lt;/i&gt;&lt;/a&gt;, we’ll discuss many of the objects and techniques that give life and color to ASP.NET web pages, including:&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;  web forms&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;  HTML server controls&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;  web server controls&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;  web user controls&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;  master pages&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;  handling page navigation&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;  styling pages and controls with CSS&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;If the list looks intimidating, don’t worry—all of this is far easier to understand than it might first appear. And to help you along, you can now visit the book’s web page to &lt;a class="sublink" href="http://www.sitepoint.com/books/aspnet3/"&gt;download the first four chapters&lt;/a&gt; for free! In fact, it’s highly recommended that you do have the downloaded pdf handy if you want to take part in the practical side of this chapter, as we work through some exercises that necessitate the creation of folders and files as described in Chapter 1.&lt;/span&gt;&lt;br /&gt;&lt;h5&gt;&lt;span style="font-size: small;"&gt; Web Forms&lt;/span&gt;&lt;/h5&gt;&lt;span style="font-size: small;"&gt;As you know, there’s always new terminology to master when you’re learning new technologies. The term used to describe an ASP.NET web page is &lt;b&gt;web form&lt;/b&gt;, and this is the central object in ASP.NET development. At first glance, web forms look much like HTML pages, but in addition to static HTML content, they contain ASP.NET-specific elements, and code that executes on the server side.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Every web form includes a &lt;code&gt;&amp;lt;form runat="server"&amp;gt;&lt;/code&gt; tag, which contains the ASP.NET-specific elements that make up the page. Multiple forms aren’t supported. The basic structure of a web form is shown here:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;%@ Page Language="&lt;i&gt;language&lt;/i&gt;" %&amp;gt;&lt;br /&gt; &amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;script runat="server"&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp;… &lt;i&gt;code block…&lt;/i&gt;&lt;br /&gt; &amp;lt;/script&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt; &amp;lt;head runat="server"&amp;gt;&lt;br /&gt; &amp;nbsp;&amp;lt;title&amp;gt;Page Title&amp;lt;/title&amp;gt;&lt;br /&gt; &amp;lt;/head&amp;gt;&lt;br /&gt; &amp;lt;body&amp;gt;&lt;br /&gt; &amp;nbsp;&amp;lt;form id="form1" runat="server"&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp;… user interface elements…&lt;br /&gt; &amp;nbsp;&amp;lt;/form&amp;gt;&lt;br /&gt; &amp;lt;/body&amp;gt;&lt;br /&gt; &amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="vertical" id="adz"&gt;&lt;div id="google_ads_div_Articles_6_300x250"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;iframe frameborder="0" height="1" marginheight="1" marginwidth="1" name="1&amp;amp;1 Cookie" scrolling="no" src="http://om.1and1.com/postview/?ac=OM.US.USa09K17748H7072a" style="border: 1px hidden rgb(255, 255, 255); position: absolute;" width="1"&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;To access and manipulate a web form programmatically, we use the &lt;code&gt;System.Web.UI.Page&lt;/code&gt; class. We must mention the class explicitly in the code-behind file. In situations in which we’re not using code-behind files (that is, when we’re writing all the code inside the &lt;code&gt;.aspx&lt;/code&gt; file instead), the &lt;code&gt;Page&lt;/code&gt; class is still used—we just don’t see it.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;We can use a range of user interface elements inside the form—including typical static HTML code—but we can also use elements whose values or properties can be generated or manipulated on the server either when the page first loads, or when the form is submitted. These elements—which, in ASP.NET parlance, are called controls—allow us to reuse common functionality, such as the page header, a calendar, a shopping cart summary, or a “Today’s Quote” box, for example, across multiple web forms. There are several types of controls in ASP.NET:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;  HTML server controls&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;  web server controls&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;  web user controls&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;  master pages&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;There are significant technical differences between these types of controls, but what makes them similar is the ease with which we can integrate and reuse them in our web sites. Let’s take a look at them one by one.&lt;/span&gt;&lt;br /&gt;&lt;h5&gt;&lt;span style="font-size: small;"&gt; HTML Server Controls&lt;/span&gt;&lt;/h5&gt;&lt;span style="font-size: small;"&gt;HTML server controls are outwardly identical to plain old HTML tags, but include a &lt;code&gt;runat="server"&lt;/code&gt;&lt;code&gt;runat="server"&lt;/code&gt; attribute.&lt;/span&gt; attribute. This gives the ASP.NET runtime control over the HTML server controls, allowing us to access them programmatically. For example, if we have an &amp;lt;a&amp;gt; tag in a page and we want to be able to change the address to which it links dynamically, using VB or C# code, we use the &lt;br /&gt;&lt;span style="font-size: small;"&gt;A server-side HTML server control exists for each of HTML’s most common elements. Creating HTML server controls is easy: we simply stick a &lt;code&gt;runat="server"&lt;/code&gt; attribute on the end of a normal HTML tag to create the HTML control version of that tag. The complete list of current HTML control classes and their associated tags is given in Table 1.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Table 1. HTML control classes&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="1"&gt; &lt;thead&gt;&lt;tr&gt;   &lt;th&gt;&lt;span style="font-size: small;"&gt;Class&lt;/span&gt;&lt;/th&gt;   &lt;th&gt;&lt;span style="font-size: small;"&gt;Associated Tags&lt;/span&gt;&lt;/th&gt;  &lt;/tr&gt;&lt;/thead&gt; &lt;tbody&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlAnchor&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;a runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlButton&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;button runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlForm&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;form runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlImage&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;img runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlInputButton&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;input type="submit" runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td rowspan="3"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlInputCheckBox&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;input type="reset" runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;input type="button" runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;input type="checkbox" runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlInputFile&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;input type="file" runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlInputHidden&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;input type="hidden" runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlInputImage&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;input type="image" runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlInputRadioButton&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;input type="radio" runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlInputText&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;input type="text" runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td rowspan="2"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlSelect&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;input type="password" runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;select runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlTable&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;table runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlTableRow&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;tr runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlTableCell&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;td runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td rowspan="2"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlTextArea&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;th runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;textarea runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td rowspan="3"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlGenericControl&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;span runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;div runat="server"&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;span style="font-size: small;"&gt;All other HTML tags&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-size: small;"&gt;All the HTML server control classes are contained within the &lt;code&gt;System.Web.UI.HtmlControls&lt;/code&gt; namespace. As they’re processed on the server side by the ASP.NET runtime, we can access their properties through code elsewhere in the page. If you’re familiar with JavaScript, HTML, and CSS, you’ll know that manipulating text within HTML tags, or even manipulating inline styles within an HTML tag, can be cumbersome and error-prone. HTML server controls aim to solve these problems by allowing you to manipulate the page easily with your choice of .NET language—for instance, using VB or C#.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Using the HTML Server Controls&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Nothing explains the theory better than a simple, working example. Let’s create a simple survey form that uses the following HTML server controls:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  &lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlForm&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;  &lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlButton&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;  &lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlInputText&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;  &lt;span style="font-size: small;"&gt;&lt;code&gt;HtmlSelect&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;We’ll begin by creating a new file named &lt;code&gt;Survey.aspx&lt;/code&gt;. Create the file in the &lt;b&gt;LearningASP\VB&lt;/b&gt; or &lt;b&gt;LearningASP\CS&lt;/b&gt; folder that we cover in Chapter 1 of the &lt;a class="sublink" href="http://www.sitepoint.com/books/aspnet3/"&gt;downloadable pdf&lt;/a&gt; of this book. For the purpose of the exercises in this chapter we won’t be using a code-behind file, so don’t check the &lt;b&gt;Place code in a separate file&lt;/b&gt; checkbox when you create the form.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Update the automatically generated file with the following code to create the visual interface for the survey:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Visual Basic LearningASP\VB\Survey_01.aspx (&lt;i&gt;excerpt&lt;/i&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;%@ Page Language="VB" %&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;br /&gt; &amp;nbsp; &amp;nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;script runat="server"&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;/script&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt; &amp;nbsp;&amp;lt;head runat="server"&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp;&amp;lt;title&amp;gt;&lt;b&gt;Using ASP.NET HTML Server Controls&lt;/b&gt;&amp;lt;/title&amp;gt;&lt;br /&gt; &amp;nbsp;&amp;lt;/head&amp;gt;&lt;br /&gt; &amp;nbsp;&amp;lt;body&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp;&amp;lt;form id="form1" runat="server"&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp;&amp;lt;div&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&amp;lt;h1&amp;gt;Take the Survey!&amp;lt;/h1&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;!-- Display user name --&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;p&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name:&amp;lt;br /&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;input type="text" id="name" runat="server" /&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;!-- Display email --&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;p&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Email:&amp;lt;br /&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;input type="text" id="email" runat="server" /&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;!-- Display technology options --&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;p&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Which server technologies do you use?&amp;lt;br /&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;select id="serverModel" runat="server" multiple="true"&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;option&amp;gt;ASP.NET&amp;lt;/option&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;option&amp;gt;PHP&amp;lt;/option&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;option&amp;gt;JSP&amp;lt;/option&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;option&amp;gt;CGI&amp;lt;/option&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;option&amp;gt;ColdFusion&amp;lt;/option&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/select&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;!-- Display .NET preference options --&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;p&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Do you like .NET so far?&amp;lt;br /&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;select id="likeDotNet" runat="server"&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;option&amp;gt;Yes&amp;lt;/option&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;option&amp;gt;No&amp;lt;/option&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/select&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;!-- Display confirmation button --&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;p&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;button id="confirmButton" OnServerClick="Click"&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;runat="server"&amp;gt;Confirm&amp;lt;/button&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;!-- Confirmation label --&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;p&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;asp:Label id="feedbackLabel" runat="server" /&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/p&amp;gt;&lt;/b&gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp;&amp;lt;/form&amp;gt;&lt;br /&gt; &amp;nbsp;&amp;lt;/body&amp;gt;&lt;br /&gt; &amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;The C# version is identical except for the first line—the page declaration:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;C# LearningASP\CS\Survey_01.aspx (&lt;i&gt;excerpt&lt;/i&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;%@ Page Language="C#" %&amp;gt;&lt;br /&gt; …&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;From what we’ve already seen of HTML controls, you should have a good idea of the classes we’ll be working with in this page. All we’ve done is place some &lt;code&gt;HtmlInputTextcontrols&lt;/code&gt;, an &lt;code&gt;HtmlButtoncontrol&lt;/code&gt;, and an &lt;code&gt;HtmlSelect&lt;/code&gt; control inside the obligatory &lt;code&gt;HtmlForm&lt;/code&gt; control. We’ve also added a &lt;code&gt;Label&lt;/code&gt; control, which we’ll use to give feedback to the user.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;i&gt;&lt;b&gt;TIP: HTML Server Controls in Action &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Remember, HTML server controls are essentially HTML tags with the &lt;code&gt;runat="server"&lt;/code&gt; attribute. In most cases, you’ll also need to assign them IDs, which will enable you to use the controls in your code.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;i&gt;&lt;b&gt;NOTE: Validation Warnings &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; You may notice that Visual Web Developer will display a validation warning about the &lt;code&gt;multiple=”true”&lt;/code&gt; attribute value on the &lt;code&gt;selectelement&lt;/code&gt;. In XHTML 1.0, the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/select" title="Look up the select element in the SitePoint HTML Reference."&gt;select&lt;/a&gt;&lt;/code&gt; element only supports &lt;code&gt;multiple=”multiple”&lt;/code&gt; and the IDE dutifully reports the problem. However, since this is a server control—it has a &lt;code&gt;runat="server"&lt;/code&gt; attribute—you must specify &lt;code&gt;multiple=”true”&lt;/code&gt;, otherwise the page will not compile and execute. &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;i&gt;When you eventually test this page, you’ll be happy to note that ASP.NET will change the attribute value to &lt;code&gt;multiple=”multiple”&lt;/code&gt; when the HTML is generated and the page is displayed.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; When it’s complete, and you view it in Visual Web Developer’s &lt;b&gt;&lt;code&gt;Design&lt;/code&gt;&lt;/b&gt; mode, the &lt;b&gt;&lt;code&gt;Survey.aspx&lt;/code&gt;&lt;/b&gt; web form will resemble Figure 1. Note that you can’t execute the form yet, because it’s missing the button’s &lt;code&gt;Clickevent&lt;/code&gt; handler that we’ve specified using the &lt;code&gt;OnServerClick&lt;/code&gt; attribute on the &lt;code&gt;HtmlButton&lt;/code&gt; control.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img alt="A simple form that uses HTML server controls" height="288" src="http://i2.sitepoint.com/graphics/1%20a%20simple%20form.jpg" width="400" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; When a user clicks on the &lt;b&gt;&lt;code&gt;Confirm&lt;/code&gt;&lt;/b&gt; button, we’ll display the submitted responses in the browser. In a real application, we’d probably be more likely to save this information to a database, and perhaps show the results as a chart. Whatever the case, the code for the &lt;code&gt;Click&lt;/code&gt; event handler method below shows how we’d access the properties of the HTML controls:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Visual Basic LearningASP\VB\Survey_02.aspx (&lt;i&gt;excerpt&lt;/i&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;script runat="server"&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Sub Click(ByVal s As Object, ByVal e As EventArgs) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Dim i As Integer &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;feedbackLabel.Text = "Your name is: " &amp;amp; name.Value &amp;amp; "&amp;lt;br /&amp;gt;" &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;feedbackLabel.Text += "Your email is: " &amp;amp; email.Value &amp;amp; _ &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"&amp;lt;br /&amp;gt;" &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;feedbackLabel.Text += "You like to work with:&amp;lt;br /&amp;gt;" &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;For i = 0 To serverModel.Items.Count - 1 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If serverModel.Items(i).Selected Then &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;feedbackLabel.Text += " - " &amp;amp; _ &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverModel.Items(i).Text &amp;amp; "&amp;lt;br /&amp;gt;" &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Next i &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;feedbackLabel.Text += "You like .NET: " &amp;amp; likeDotNet.Value &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Sub&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;C# LearningASP\CS\Survey_02.aspx (&lt;i&gt;excerpt&lt;/i&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt; &amp;lt;script runat="server"&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;void Click(Object s, EventArgs e) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{ &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;feedbackLabel.Text = "Your name is: " + name.Value + "&amp;lt;br /&amp;gt;"; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;feedbackLabel.Text += "Your email is: " + email.Value + &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"&amp;lt;br /&amp;gt;"; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;feedbackLabel.Text += "You like to work with:&amp;lt;br /&amp;gt;"; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt;= serverModel.Items.Count - 1; i++) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;{ &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (serverModel.Items[i].Selected) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;feedbackLabel.Text += " - " + serverModel.Items[i].Text + &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"&amp;lt;br /&amp;gt;"; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;feedbackLabel.Text += "You like .NET: " + likeDotNet.Value; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; As with the examples we’ve seen in previous chapters, we start by placing our VB and C# code inside a server-side script block within the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/script" title="Look up the &amp;lt;script&amp;gt; tag in the SitePoint HTML Reference."&gt;&amp;lt;script&amp;gt;&lt;/a&gt;&lt;/code&gt; part of the page. Next, we create a new &lt;code&gt;Click&lt;/code&gt; event handler that takes the two usual parameters. Finally, we use the &lt;code&gt;Label&lt;/code&gt; control to display the user’s responses within the page.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Once you’ve written the code, save your work and test the results in your browser. Enter some information and click the button. To select multiple options in the &lt;code&gt;serverModel&lt;/code&gt; option box, hold down &lt;b&gt;&lt;code&gt;Ctrl&lt;/code&gt;&lt;/b&gt; as you click on your preferences. The information you enter should appear at the bottom of the page when the &lt;b&gt;&lt;code&gt;Confirm&lt;/code&gt;&lt;/b&gt;&lt;/span&gt; button is clicked, as shown in Figure 2.&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img alt="Viewing the survey results" height="385" src="http://i2.sitepoint.com/graphics/2%20viewing%20survey%20results.jpg" width="400" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; In conclusion, working with HTML server controls is really simple. All you need to do is assign each control an ID, and add the &lt;code&gt;runat="server"&lt;/code&gt; attribute. Then, you can simply access and manipulate the controls using VB or C# code on the server side.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h5&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Web Server Controls&lt;/span&gt;&lt;/h5&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Web server controls can be seen as advanced versions of HTML server controls. Web server controls are those that generate content for you—you’re no longer in control of the HTML being used. While having good knowledge of HTML is useful, it’s not a necessity for those working with web server controls.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Let’s look at an example. We can use the &lt;code&gt;Label&lt;/code&gt; web server control to place simple text inside a web form. To change the &lt;code&gt;Label&lt;/code&gt;’s text from within our C# or VB code, we simply set its Text property like so:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Visual Basic &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;myLabel.Text = "Mickey Mouse"&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Similarly, to add a text box to our form, we use the &lt;code&gt;TextBox&lt;/code&gt; web server control. Again, we can read or set its text using the &lt;code&gt;Text&lt;/code&gt; property:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;C# &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;username = usernameTextBox.Text;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Though we’re applying the &lt;code&gt;TextBox&lt;/code&gt; control, ASP.NET still uses an &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/input" title="Look up the input element in the SitePoint HTML Reference."&gt;input&lt;/a&gt;&lt;/code&gt; element behind the scenes; however, we no longer have to worry about this detail. With web server controls, you no longer need to worry about translating the needs of your application into elements you can define in HTML—you can let the ASP.NET framework do the worrying for you.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Unlike HTML server controls, web server controls don’t have a direct, one-to-one correspondence with the HTML elements they generate. For example, we can use either of two web server controls—the &lt;code&gt;DropDownList&lt;/code&gt; control, or the &lt;code&gt;ListBox&lt;/code&gt; control—to generate a select element.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Web server controls follow the same basic pattern as HTML tags, but the tag name is preceded by &lt;code&gt;asp:&lt;/code&gt;, and is capitalized using Pascal Casing. Pascal Casing is a form that capitalizes the first character of each word (such as &lt;code&gt;TextBox&lt;/code&gt;). The object IDs are usually named using Camel Casing, where the first letter of each word &lt;i&gt;except the first&lt;/i&gt; is capitalized (e.g. &lt;code&gt;usernameTextBox&lt;/code&gt;).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Consider the following HTML &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/input" title="Look up the input element in the SitePoint HTML Reference."&gt;input&lt;/a&gt;&lt;/code&gt; element, which creates an input text box:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;input type="text" name="usernameTextBox" size="30" /&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The equivalent web server control is the &lt;code&gt;TextBox&lt;/code&gt; control, and it looks like this:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;asp:TextBox id="usernameTextBox" runat="server" Columns="30"&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Remember that, unlike any normal HTML that you might use in your web forms, web server controls are first processed by the ASP.NET engine, where they’re transformed to HTML. A side effect of this approach is that you must be very careful to always include closing tags (the &lt;code&gt;&amp;lt;/asp:TextBox&amp;gt;&lt;/code&gt; part above). The HTML parsers of most web browsers are forgiving about badly formatted HTML code, but ASP.NET is not. Remember that you can use the shorthand syntax (&lt;code&gt;/&amp;gt;&lt;/code&gt;) if nothing appears between your web server control’s opening and closing tags. As such, you could also write this &lt;code&gt;TextBox&lt;/code&gt; like so:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;asp:TextBox id="usernameTextBox" runat="server" Columns="30" /&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; To sum up, the key points to remember when you’re working with web server controls are:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;Web server controls must be placed within a &lt;code&gt;&amp;lt;form runat="server"&amp;gt;&lt;/code&gt; tag to function properly.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;Web server controls require the &lt;code&gt;runat="server"&lt;/code&gt; attribute to function properly.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;We include web server controls in a form using the &lt;code&gt;asp:&lt;/code&gt; prefix.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; There are more web server controls than HTML controls. Some offer advanced features that simply aren’t available using HTML alone, and some generate quite complex HTML code for you. We’ll meet many web server controls as we work through this and future chapters in &lt;a class="sublink" href="http://www.sitepoint.com/books/aspnet3/"&gt;the book&lt;/a&gt;. For more information on web server controls, including the properties, methods, and events for each, have a look at Appendix A of this book.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;i&gt;Standard Web Server Controls&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The standard set of web server controls that comes with ASP.NET mirrors the HTML server controls in many ways. However, web server controls offer some new refinements and enhancements, such as support for events and view state, a more consistent set of properties and methods, and more built-in functionality. In this section, we’ll take a look as some of the controls you’re most likely to use in your day-to-day work.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Remember to use the .NET Framework SDK Documentation whenever you need more details about any of the framework’s classes (or controls). You can access the documentation from the &lt;code&gt;&lt;b&gt;Help &amp;gt; Index&lt;/b&gt;&lt;/code&gt;&lt;code&gt;&lt;b&gt;Index Results&lt;/b&gt;&lt;/code&gt; window. For example, you’ll find that there are two classes named &lt;code&gt;Label&lt;/code&gt;, located in the &lt;code&gt;System.Web.UI.WebControls&lt;/code&gt; and &lt;code&gt;System.Windows.Forms&lt;/code&gt; namespaces, as Figure 3 illustrates. You’ll most likely be interested in the version of the class situated in the &lt;code&gt;WebControls&lt;/code&gt; namespace.&lt;/span&gt; menu item in Visual Web Developer. To find a class, simply search for the class’s name. If there are many classes with a given name in different namespaces, you’ll be able to choose the one you want from the &lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img alt="Documentation for the Label control" height="284" src="http://i2.sitepoint.com/graphics/3%20documentation%20label.jpg" width="400" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;code&gt;Label&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The easiest way to display static text on your page is simply to add the text to the body of the page without enclosing it in a tag. However, if you want to modify the text displayed on a page using ASP.NET code, you can display your text within a &lt;code&gt;Label&lt;/code&gt; control. Here’s a typical example:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;asp:Label id="messageLabel" Text="" runat="server" /&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The following code sets the &lt;code&gt;Text&lt;/code&gt; property of the &lt;code&gt;Label&lt;/code&gt; control to display the text “Hello World”:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Visual Basic&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Public Sub Page_Load() &lt;br /&gt; &amp;nbsp;messageLabel.Text = "Hello World" &lt;br /&gt; End Sub&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;C#&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt; public void Page_Load() &lt;br /&gt; { &lt;br /&gt; &amp;nbsp;messageLabel.Text = "Hello World"; &amp;nbsp; &lt;br /&gt; }&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Reading this &lt;code&gt;Page_Load&lt;/code&gt; handler code, we can see that when the page first loads, the &lt;code&gt;Text&lt;/code&gt; property of the &lt;code&gt;Label&lt;/code&gt; control with the &lt;code class="ref-term"&gt;&lt;a _cke_saved_href="http://reference.sitepoint.com/html/core-attributes/id" href="http://reference.sitepoint.com/html/core-attributes/id" title="Look up the id attribute in the SitePoint HTML Reference."&gt;id&lt;/a&gt;&lt;/code&gt; of &lt;code&gt;message&lt;/code&gt; will be set to “Hello World.”&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;code&gt;Literal&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;This is perhaps the simplest control in ASP.NET. If you set &lt;code&gt;Literal&lt;/code&gt;’s &lt;code&gt;Text&lt;/code&gt; property, it will simply insert that text into the output HTML code without altering it. Unlike &lt;code&gt;Label&lt;/code&gt;, which has similar functionality, &lt;code&gt;Literal&lt;/code&gt; doesn’t wrap the text in &lt;code class="ref-term"&gt;&lt;/code&gt; tags that would allow the setting of style information.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;b&gt;TextBox&lt;/b&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The &lt;code&gt;TextBox&lt;/code&gt; control is used to create a box in which the user can type or read standard text. You can use the &lt;code&gt;TextMode&lt;/code&gt;property to set this control to display text in a single line, acrossmultiple lines, or to hide the text being entered (for instance, inHTML password fields). The following code shows how we might use it ina simple login page:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;p&amp;gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;Username: &amp;lt;asp:TextBox id="userTextBox" TextMode="SingleLine" &lt;br /&gt;&amp;nbsp;&amp;nbsp; Columns="30" runat="server" /&amp;gt; &lt;br /&gt;&amp;lt;/p&amp;gt; &lt;br /&gt;&amp;lt;p&amp;gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;Password: &amp;lt;asp:TextBox id="passwordTextBox"&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TextMode="Password" Columns="30" runat="server" /&amp;gt; &lt;br /&gt;&amp;lt;/p&amp;gt; &lt;br /&gt;&amp;lt;p&amp;gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;Comments: &amp;lt;asp:TextBox id="commentsTextBox" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TextMode="MultiLine" Columns="30" Rows="10" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; runat="server" /&amp;gt; &lt;br /&gt;&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;In each of the instances above, the &lt;code&gt;TextMode&lt;/code&gt; attribute dictates the kind of text box that’s to be rendered.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;b&gt;HiddenField&lt;/b&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;HiddenField&lt;/code&gt; is a simple control that renders an &lt;code class="ref-term"&gt;&lt;a _cke_saved_href="http://reference.sitepoint.com/html/input" href="http://reference.sitepoint.com/html/input" title="Look up the input element in the SitePoint HTML Reference."&gt;input&lt;/a&gt;&lt;/code&gt; element whose &lt;code&gt;type&lt;/code&gt; attribute is set to &lt;code&gt;hidden&lt;/code&gt;. We can set its only important property, &lt;code&gt;Value&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;b&gt;Button&lt;/b&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;By default, the &lt;code&gt;Button&lt;/code&gt; control renders an &lt;code class="ref-term"&gt;&lt;a _cke_saved_href="http://reference.sitepoint.com/html/input" href="http://reference.sitepoint.com/html/input" title="Look up the input element in the SitePoint HTML Reference."&gt;input&lt;/a&gt;&lt;/code&gt; element whose type attribute is set to &lt;code&gt;submit&lt;/code&gt;. When a button is clicked, the form containing the button is submitted to the server for processing, and both the &lt;code&gt;Click&lt;/code&gt;&lt;code&gt;Command&lt;/code&gt; events are raised.&lt;/span&gt; and &lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The following markup displays a &lt;code&gt;Button&lt;/code&gt; control and a &lt;code&gt;Label&lt;/code&gt;:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;asp:Button id="submitButton" Text="Submit" runat="server" &lt;br /&gt;&amp;nbsp;&amp;nbsp; OnClick="WriteText" /&amp;gt; &lt;br /&gt;&amp;lt;asp:Label id="messageLabel" runat="server" /&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Notice the &lt;code&gt;OnClick&lt;/code&gt; attribute on the control. When the button is clicked, the &lt;code&gt;Click&lt;/code&gt; event is raised, and the &lt;code&gt;WriteText&lt;/code&gt; subroutine is called. The &lt;code&gt;WriteText&lt;/code&gt; subroutine will contain the code that performs the intended function for this button, such as displaying a message to the user:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Visual Basic&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Public Sub WriteText(s As Object, e As EventArgs) &lt;br /&gt; &amp;nbsp;messageLabel.Text = "Hello World" &lt;br /&gt; End Sub&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;C#&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt; public void WriteText(Object s, EventArgs e) &lt;br /&gt; { &lt;br /&gt; &amp;nbsp; &amp;nbsp;messageLabel.Text = "Hello World"; &lt;br /&gt; }&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;It’simportant to realize that events are associated with most web servercontrols, and the basic techniques involved in using them, are the sameevents and techniques we used with the &lt;code&gt;Click&lt;/code&gt; event of the &lt;code&gt;Button&lt;/code&gt;&lt;code&gt;WebControl&lt;/code&gt; base class.&lt;/span&gt; control. All controls implement a standard set of events because they all inherit from the &lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;b&gt;ImageButton&lt;/b&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;An &lt;code&gt;ImageButton&lt;/code&gt; control is similar to a &lt;code&gt;Button&lt;/code&gt; control, but it uses an image that we supply in place of the typical system button graphic. Take a look at this example:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;asp:ImageButton id="myImgButton" ImageUrl="myButton.gif" &lt;br /&gt;&amp;nbsp;&amp;nbsp; runat="server" OnClick="WriteText" /&amp;gt; &lt;br /&gt;&amp;lt;asp:Label id="messageLabel" runat="server" /&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;The &lt;code&gt;Click&lt;/code&gt; event of the &lt;code&gt;ImageButton&lt;/code&gt; receives the coordinates of the point at which the image was clicked:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Visual Basic&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt; Public Sub WriteText(s As Object, e As ImageClickEventArgs) &lt;br /&gt; &amp;nbsp;messageLabel.Text = "Coordinate: " &amp;amp; e.X &amp;amp; "," &amp;amp; e.Y &lt;br /&gt; End Sub&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;C#&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;public void WriteText(Object s, ImageClickEventArgs e) &lt;br /&gt; { &lt;br /&gt; &amp;nbsp;messageLabel.Text = "Coordinate: " + e.X + "," + e.Y; &lt;br /&gt; }&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;b&gt;LinkButton&lt;/b&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;A &lt;code&gt;LinkButton&lt;/code&gt; control renders a hyperlink that fires the &lt;code&gt;Click&lt;/code&gt; event when it’s clicked. From the point of view of ASP.NET code, &lt;code&gt;LinkButtons&lt;/code&gt; can be treated in much the same way as buttons, hence the name. Here’s &lt;code&gt;LinkButton&lt;/code&gt; in action:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;asp:LinkButton id="myLinkButon" Text="Click Here"&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; runat="server" /&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;code&gt;HyperLink&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The &lt;code&gt;HyperLink&lt;/code&gt; control creates on your page a hyperlink that links to the URL in the &lt;code&gt;NavigateUrl&lt;/code&gt;&lt;code&gt;LinkButton&lt;/code&gt; control, which offers features such as &lt;code&gt;Click&lt;/code&gt; events and validation, &lt;code&gt;HyperLinks&lt;/code&gt; are meant to be used to navigate from one page to the next:&lt;/span&gt; property. Unlike the &lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;asp:HyperLink id="myLink" NavigateUrl="http://www.sitepoint.com/" &lt;br /&gt;&amp;nbsp;&amp;nbsp; ImageUrl="splogo.gif" runat="server"&amp;gt;SitePoint&amp;lt;/asp:HyperLink&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If it’s specified, the &lt;code&gt;ImageUrl&lt;/code&gt;attribute causes the control to display the specified image, in whichcase the text is demoted to acting as the image’s alternate text.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;code&gt;CheckBox&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;You can use a &lt;code&gt;CheckBox&lt;/code&gt; control to represent a choice that can have only two possible states—checked or unchecked:&lt;code&gt;&amp;lt;asp:CheckBox id="questionCheck" Text="Yep, ASP.NET is cool!" &lt;br /&gt;&amp;nbsp;&amp;nbsp; Checked="True" runat="server" /&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The main event associated with a &lt;code&gt;CheckBox&lt;/code&gt; is the &lt;code&gt;CheckChanged&lt;/code&gt; event, which can be handled with the &lt;code&gt;OnCheckChanged&lt;/code&gt; attribute. The &lt;code&gt;Checked&lt;/code&gt; property is &lt;code&gt;True&lt;/code&gt; if the checkbox is checked, and &lt;code&gt;False&lt;/code&gt;&lt;/span&gt; otherwise.&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;b&gt;RadioButton&lt;/b&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;A &lt;code&gt;RadioButton&lt;/code&gt; is a lot like a &lt;code&gt;CheckBox&lt;/code&gt;, except that &lt;code&gt;RadioButtons&lt;/code&gt; can be grouped to represent a set of options from which only one can be selected. Radio buttons are grouped together using the &lt;code&gt;GroupName&lt;/code&gt;&lt;/span&gt; property, like so:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;asp:RadioButton id="sanDiego" GroupName="City" Text="San Diego" &lt;br /&gt;&amp;nbsp;&amp;nbsp; runat="server" /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;asp:RadioButton id="boston" GroupName="City" Text="Boston" &lt;br /&gt;&amp;nbsp;&amp;nbsp; runat="server" /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;asp:RadioButton id="phoenix" GroupName="City" Text="Phoenix" &lt;br /&gt;&amp;nbsp;&amp;nbsp; runat="server" /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;asp:RadioButton id="seattle" GroupName="City" Text="Seattle" &lt;br /&gt;&amp;nbsp;&amp;nbsp; runat="server" /&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Like the &lt;code&gt;CheckBox&lt;/code&gt; control, the main event associated with &lt;code&gt;RadioButtons&lt;/code&gt; is the &lt;code&gt;CheckChanged&lt;/code&gt; event, which can be handled with the &lt;code&gt;OnCheckChanged&lt;/code&gt; attribute. The other control we can use to display radio buttons is &lt;code&gt;RadioButtonList&lt;/code&gt;, which we’ll also meet in this chapter.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;code&gt;Image&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;An &lt;code&gt;Image&lt;/code&gt; control creates an image that can be accessed dynamically from code; it equates to the &lt;code class="ref-term"&gt;&lt;a _cke_saved_href="http://reference.sitepoint.com/html/img" href="http://reference.sitepoint.com/html/img" title="Look up the &amp;lt;img&amp;gt; tag in the SitePoint HTML Reference."&gt;&lt;img /&gt;&lt;/a&gt;&lt;/code&gt; tag in HTML. Here’s an example:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;asp:Image id="myImage" ImageUrl="mygif.gif" runat="server" &lt;br /&gt;&amp;nbsp;&amp;nbsp; AlternateText="description" /&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&lt;b&gt;ImageMap&lt;/b&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The &lt;code&gt;ImageMap&lt;/code&gt; control generates HTML to display images that have certain clickable regions called &lt;b&gt;hot spots&lt;/b&gt;. Each hot spot reacts in a specific way when it’s clicked by the user.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; These areas can be defined using three controls, which generate hot spots of different shapes: &lt;code&gt;CircleHotSpot&lt;/code&gt;, &lt;code&gt;RectangleHotSpot&lt;/code&gt;, and &lt;code&gt;PolygonHotSpot&lt;/code&gt;. Here’s an example that defines an image map with two circular hot spots:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;asp:ImageMap ID="myImageMap" runat="server" ImageUrl="image.jpg"&amp;gt; &amp;nbsp; &amp;lt;asp:CircleHotSpot AlternateText="Button1" &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Radius="20" X="50" Y="50" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;asp:CircleHotSpot AlternateText="Button2" &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Radius="20" X="100" Y="50" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:ImageMap&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Table 2. Possible values of &lt;code&gt;HotSpotMode&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;thead&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;th&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;HotSpotMode&lt;/code&gt; value&lt;/span&gt;&lt;/th&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;th&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Behavior when hot spot is clicked&lt;/span&gt;&lt;/th&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/thead&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;tbody&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;Inactive&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; none&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;Navigate&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; The user is navigated to the specified URL.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td rowspan="2"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;NotSet&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; When this value is set for a &lt;code&gt;HotSpot&lt;/code&gt;, the behavior is inherited from the parent &lt;code&gt;ImageMap&lt;/code&gt;; if the parent &lt;code&gt;ImageMap&lt;/code&gt; doesn’t specify a &lt;code&gt;defaultvalue&lt;/code&gt;, &lt;code&gt;Navigate&lt;/code&gt; is set.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; When it’s set for an &lt;code&gt;ImageMap&lt;/code&gt;, this value is effectively equivalent to &lt;code&gt;Navigate&lt;/code&gt;.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;PostBack&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; The hot spot raises the &lt;code&gt;Clickevent&lt;/code&gt; that can be handled on the server side to respond to the user action.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; To configure the action that results when a hot spot is clicked by the user, we set the &lt;code&gt;HotSpotMode&lt;/code&gt;&lt;code&gt;ImageMap&lt;/code&gt; control, or the &lt;code&gt;HotSpotMode&lt;/code&gt; property of the individual hot spot objects, or both, using the values shown in Table 2. If the &lt;code&gt;HotSpotMode&lt;/code&gt; property is set for the &lt;code&gt;ImageMap&lt;/code&gt; control as well as for an individual hot spot, the latter property will override that set for the more general &lt;code&gt;ImageMap&lt;/code&gt; control.&lt;/span&gt; property of the &lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The Microsoft .NET Framework SDK Documentation for the &lt;code&gt;ImageMap&lt;/code&gt; class and &lt;code&gt;HotSpotMode&lt;/code&gt;&lt;/span&gt; enumeration contains detailed examples of the usage of these values.&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&lt;b&gt;PlaceHolder&lt;/b&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The &lt;code&gt;PlaceHolder&lt;/code&gt; control lets us add elements at a particular place on a page at any time, dynamically, through our code. Here’s what it looks like:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;asp:PlaceHolder id="myPlaceHolder" runat="server" /&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The following code dynamically adds a new &lt;code&gt;HtmlButton&lt;/code&gt; control within the placeholder:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Visual Basic&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;Public Sub Page_Load() &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim myButton As HtmlButton = New HtmlButton() &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;myButton.InnerText = "My New Button" &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;myPlaceHolder.Controls.Add(myButton) &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;C#&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;public void Page_Load() &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;HtmlButton myButton = new HtmlButton(); &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;myButton.InnerText = "My New Button"; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;myPlaceHolder.Controls.Add(myButton); &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;code&gt;Panel&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The &lt;code&gt;Panel&lt;/code&gt; control functions similarly to the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/div" title="Look up the div element in the SitePoint HTML Reference."&gt;div&lt;/a&gt;&lt;/code&gt; element in HTML, in that it allows the set of items that resides within the tag to be manipulated as a group. For instance, the &lt;code&gt;Panel&lt;/code&gt; could be made visible or hidden by a &lt;code&gt;Button&lt;/code&gt;’s &lt;code&gt;Click&lt;/code&gt; event:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;asp:Panel id="myPanel" runat="server"&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;p&amp;gt;Username: &amp;lt;asp:TextBox id="usernameTextBox" Columns="30" &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;runat="server" /&amp;gt;&amp;lt;/p&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;Password: &amp;lt;asp:TextBox id="passwordTextBox" &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TextMode="Password" Columns="30" runat="server" /&amp;gt;&amp;lt;/p&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:Panel&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Button id="hideButton" Text="Hide Panel" OnClick="HidePanel" &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;runat="server" /&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The code above places two &lt;code&gt;TextBox&lt;/code&gt; controls within a &lt;code&gt;Panel&lt;/code&gt; control. The &lt;code&gt;Button&lt;/code&gt; control is outside of the panel. The &lt;code&gt;HidePanel&lt;/code&gt; subroutine would then control the &lt;code&gt;Panel&lt;/code&gt;’s visibility by setting its &lt;code&gt;Visible&lt;/code&gt;&lt;code&gt;False&lt;/code&gt;:&lt;/span&gt; property to &lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&lt;b&gt;Visual Basic&lt;/b&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;Public Sub HidePanel(s As Object, e As EventArgs) &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;myPanel.Visible = False &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub &lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;C#&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;public void HidePanel(Object s, EventArgs e) &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;myPanel.Visible = false; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; In this case, when the user clicks the button, the &lt;code&gt;Click&lt;/code&gt; event is raised and the &lt;code&gt;HidePanel&lt;/code&gt; subroutine is called, which sets the &lt;code&gt;Visible&lt;/code&gt; property of the &lt;code&gt;Panel&lt;/code&gt; control to &lt;code&gt;False&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;i&gt;&lt;b&gt;List Controls&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Here, we’ll meet the ASP.NET controls that display simple lists of elements: &lt;code&gt;ListBox&lt;/code&gt;, &lt;code&gt;DropDownList&lt;/code&gt;, &lt;code&gt;CheckBoxList&lt;/code&gt;, &lt;code&gt;RadioButtonList&lt;/code&gt;, and &lt;code&gt;BulletedList&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&lt;b&gt;DropDownList&lt;/b&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; A &lt;code&gt;DropDownList&lt;/code&gt; control is similar to the HTML &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/select" title="Look up the select element in the SitePoint HTML Reference."&gt;select&lt;/a&gt;&lt;/code&gt; element. The &lt;code&gt;DropDownList&lt;/code&gt; control allows you to select one item from a list using a drop-down menu. Here’s an example of the control’s code:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;asp:DropDownList id="ddlFavColor" runat="server"&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="Red" value="red" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="Blue" value="blue" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="Green" value="green" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:DropDownList&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The most useful event that this control provides is &lt;code&gt;SelectedIndexChanged&lt;/code&gt;. This event is also exposed by other list controls, such as the &lt;code&gt;CheckBoxList&lt;/code&gt; and &lt;code&gt;RadioButtonList&lt;/code&gt; controls, allowing for easy programmatic interaction with the control you’re using. These controls can also be bound to a database and used to extract dynamic content into a drop-down menu.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;code&gt;ListBox&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; A &lt;code&gt;ListBox&lt;/code&gt; control equates to the HTML &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/select" title="Look up the select element in the SitePoint HTML Reference."&gt;select&lt;/a&gt;&lt;/code&gt; element with either the &lt;code&gt;multiple&lt;/code&gt; or &lt;code&gt;size&lt;/code&gt; attribute set (&lt;code&gt;size&lt;/code&gt; would need to be set to a value of 2 or more). If you set the &lt;code&gt;SelectionMode&lt;/code&gt; attribute to &lt;code&gt;Multiple&lt;/code&gt;, the user will be able to select more than one item from the list, as in this example:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;asp:ListBox id="listTechnologies" runat="server" &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;SelectionMode="Multiple"&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="ASP.NET" Value="aspnet" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="JSP" Value="jsp" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="PHP" Value="php" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="CGI" Value="cgi" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="ColdFusion" Value="cf" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:ListBox&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;code&gt;RadioButtonList&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Like the &lt;code&gt;RadioButton&lt;/code&gt; control, the &lt;code&gt;RadioButtonList&lt;/code&gt; control represents radio buttons. However, the &lt;code&gt;RadioButtonList&lt;/code&gt; control represents a list of radio buttons and uses more compact syntax. Here’s an example:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;asp:RadioButtonList id="favoriteColor" runat="server"&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="Red" Value="red" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="Blue" Value="blue" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="Green" Value="green" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:RadioButtonList&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;code&gt;CheckBoxList&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; As you may have guessed, the &lt;code&gt;CheckBoxList&lt;/code&gt; control represents a group of check boxes; it’s equivalent to using several &lt;code&gt;CheckBox&lt;/code&gt; controls in a row:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;asp:CheckBoxList id="favoriteFood" runat="server"&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="Pizza" Value="pizza" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="Tacos" Value="tacos" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;asp:ListItem Text="Pasta" Value="pasta" /&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:CheckBoxList&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;code&gt;BulletedList&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The &lt;code&gt;BulletedList&lt;/code&gt; control displays bulleted or numbered lists, using &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/ul" title="Look up the &amp;lt;ul&amp;gt; tag in the SitePoint HTML Reference."&gt;&amp;lt;ul&amp;gt;&lt;/a&gt;&lt;/code&gt; (unordered list) or &lt;code&gt;&amp;lt;ol&amp;gt; &lt;/code&gt;(ordered list) tags. Unlike the other list controls, the &lt;code&gt;BulletedList&lt;/code&gt; doesn’t allow the selection of items, so the &lt;code&gt;SelectedIndexChanged&lt;/code&gt; event isn’t supported.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The first property you’ll want to set is &lt;code&gt;DisplayMode&lt;/code&gt;, which can be &lt;code&gt;Text&lt;/code&gt;(the default), or &lt;code&gt;HyperLink&lt;/code&gt;, which will render the list items as links. When &lt;code&gt;DisplayMode&lt;/code&gt; is set to &lt;code&gt;HyperLink&lt;/code&gt;, you can use the &lt;code&gt;Click&lt;/code&gt;&lt;/span&gt; event to respond to a user’s click on one of the items.&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The other important property is &lt;code&gt;BulletStyle&lt;/code&gt;, which determines the style of the bullets. The accepted values are:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;Numbered&lt;/code&gt; (1, 2, 3, …)&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;LowerAlpha&lt;/code&gt; (a, b, c, …)&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;UpperAlpha&lt;/code&gt; (A, B, C, …)&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;LowerRoman&lt;/code&gt; (i, ii, iii, …)&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;UpperRoman&lt;/code&gt; (I, II, III, …)&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;Circle&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;Disc&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;Square&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;CustomImage&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If the style is set to &lt;code&gt;CustomImage&lt;/code&gt;, you’ll also need to set the &lt;code&gt;BulletStyleImageUrl&lt;/code&gt; to specify the image to be used for the bullets. If the style is one of the numbered lists, you can also set the &lt;code&gt;FirstBulletNumber&lt;/code&gt; property to specify the first number or letter that’s to be generated.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;i&gt;Advanced Controls&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; These controls are advanced in terms of their usage, the HTML code they generate, and the background work they do for you. Some of these controls aren’t available to older versions of ASP.NET.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&lt;b&gt;Calendar&lt;/b&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The &lt;code&gt;Calendar&lt;/code&gt; is a great example of the reusable nature of ASP.NET controls. The &lt;code&gt;Calendar&lt;/code&gt; control generates markup that displays an intuitive calendar in which the user can click to select, or move between, days, weeks, months, and so on.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The &lt;code&gt;Calendar&lt;/code&gt; control requires very little customization. In Visual Web Developer, select &lt;b&gt;&lt;code&gt;Website &amp;gt; Add New Item…&lt;/code&gt;&lt;/b&gt;, and make the changes indicated:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Visual Basic LearningASP\VB\Calendar_01.aspx &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;%@ Page Language="VB" %&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script runat="server"&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;head runat="server"&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;title&amp;gt;&lt;b&gt;Calendar Test&lt;/b&gt;/title&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/head&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;body&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;form id="form1" runat="server"&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&amp;lt;asp:Calendar ID="myCalendar" runat="server" /&amp;gt;&lt;/b&gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/div&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/form&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/body&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/html&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Again, the C# version is the same, except for the &lt;code&gt;Page&lt;/code&gt; declaration:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt; C# LearningASP\CS\01_Calendar.aspx (&lt;i&gt;excerpt&lt;/i&gt;) &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;%@ Page Language="C#" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; …&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If you save this page in your working folder and load it, you’ll see the output shown in Figure 4.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img alt="Displaying the default calendar" height="214" src="http://i2.sitepoint.com/graphics/4%20displaying%20default%20calendar.jpg" width="400" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The &lt;code&gt;Calendar&lt;/code&gt; control contains a wide range of properties, methods, and events, including those listed in Table 3.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Table 3. Some of the &lt;code&gt;Calendar&lt;/code&gt; control’s properties&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;thead&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;th&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Property&lt;/span&gt;&lt;/th&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;th&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Description&lt;/span&gt;&lt;/th&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/thead&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;tbody&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;DayNameFormat&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; This property sets the format of the day names. Its possible values are FirstLetter, FirstTwoLetters, Full, and Short. The default is Short, which displays the three-letter abbreviation.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;FirstDayOfWeek&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; This property sets the day that begins each week in the calendar. By default, the value of this property is determined by your server’s region settings, but you can set this to Sundayor Monday if you want to control it.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;NextPrevFormat&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Set to CustomText by default, this property can be set to ShortMonth or FullMonth to control the format of the next and previous month links.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;SelectedDate&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; This property contains a DateTime value that specifies the highlighted day. You’ll use this property often, to determine which date the user has selected.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;SelectionMode&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; This property determines whether days, weeks, or months can be selected; its possible values are Day, DayWeek, DayWeekMonth, and None, and the default is Day. When Dayis selected, a user can only select a day; when DayWeek is selected, a user can select a day or an entire week; and so on.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;SelectMonthText&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; This property controls the text of the link that’s displayed to allow users to select an entire month from the calendar.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;SelectWeekText&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; This property controls the text of the link that’s displayed to allow users to select an entire week from the calendar.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;ShowDayHeader&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; If True, this property displays the names of the days of the week. The default is True.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;ShowGridLines&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; If True, this property renders the calendar with grid lines. The default is True.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;ShowNextPrevMonth&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; If True, this property displays next month and previous month links. The default is True.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;ShowTitle&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; If True, this property displays the calendar’s title. The default is False&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;TitleFormat&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; This property determines how the month name appears in the title bar. Possible values are Monthand MonthYear. The default is MonthYear.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;TodaysDate&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; This DateTime value sets the calendar’s current date. By default, this value is not highlighted within the Calendar control.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;VisibleDate&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; This DateTime value controls which month is displayed.&lt;/span&gt;&lt;/td&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tr&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Let’s take a look at an example that uses some of these properties, events, and methods to create a &lt;code&gt;Calendar&lt;/code&gt; control which allows users to select days, weeks, and months. Modify the calendar in &lt;code&gt;&lt;b&gt;Calendar.aspx&lt;/b&gt;&lt;/code&gt; (both the VB and C# versions), and add a label to it, as follows:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;LearningASP\VB\Calendar_02.aspx (&lt;i&gt;excerpt&lt;/i&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;… &amp;nbsp; &lt;br /&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;form id="form1" runat="server"&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&amp;lt;h1&amp;gt;Pick your dates:&amp;lt;/h1&amp;gt; &amp;nbsp; &lt;/b&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;asp:Calendar ID="myCalendar" runat="server" &amp;nbsp; &lt;/b&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DayNameFormat="Short" FirstDayOfWeek="Sunday" &amp;nbsp; &lt;/b&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NextPrevFormat="FullMonth" SelectionMode="DayWeekMonth" &amp;nbsp; &lt;/b&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SelectWeekText="Select Week" &amp;nbsp; &lt;/b&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SelectMonthText="Select Month" TitleFormat="Month" &amp;nbsp; &lt;/b&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;OnSelectionChanged="SelectionChanged" /&amp;gt; &amp;nbsp; &lt;/b&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;h1&amp;gt;You selected these dates:&amp;lt;/h1&amp;gt; &amp;nbsp; &lt;/b&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;asp:Label ID="myLabel" runat="server" /&amp;gt;&lt;/b&gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/div&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/form&amp;gt; &amp;nbsp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; …&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Now edit the &lt;code&gt;&amp;lt;script runat="server"&amp;gt;&lt;/code&gt; tag to include the &lt;code&gt;SelectionChanged&lt;/code&gt; event handler referenced by your calendar:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Visual Basic LearningASP\VB\Calendar_02.aspx (&lt;i&gt;excerpt&lt;/i&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;script runat="server"&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;b&gt;Sub SelectionChanged(ByVal s As Object, ByVal e As EventArgs) &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;myLabel.Text = "" &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;For Each d As DateTime In myCalendar.SelectedDates &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;myLabel.Text &amp;amp;= d.ToString("D") &amp;amp; "&amp;lt;br /&amp;gt;" &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Next &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Sub&lt;/b&gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;C# LearningASP\CS\Calendar_02.aspx (&lt;i&gt;excerpt&lt;/i&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;script runat="server"&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;b&gt;void SelectionChanged(Object s, EventArgs e) &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{ &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;myLabel.Text = ""; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (DateTime d in myCalendar.SelectedDates) &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;{ &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;myLabel.Text += d.ToString("D") + "&amp;lt;br /&amp;gt;"; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/b&gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Save your work and test it in a browser. Try selecting a day, week, or month. The selection will be highlighted in a similar way to the display shown in Figure 5.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img alt="Using the Calendar control" height="410" src="http://i2.sitepoint.com/graphics/5%20using%20calendar%20control.jpg" width="400" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; In &lt;code&gt;SelectionChanged&lt;/code&gt;, we loop through each of the dates that the user has selected, and append each to the &lt;code&gt;Label&lt;/code&gt; we added to the page.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;code&gt;AdRotator&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The &lt;code&gt;AdRotator&lt;/code&gt; control allows you to display a list of banner advertisements at random within your web application. However, it’s more than a mere substitute for creating a randomization script from scratch. Since the &lt;code&gt;AdRotator&lt;/code&gt; control gets its content from an XML file, the administration and updating of banner advertisement files and their properties is a snap. Also, the XML file allows you to control the banner’s image, link, link target, and frequency of appearance in relation to other banner ads.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The benefits of using this control don’t stop there, though. Most of the &lt;code&gt;AdRotator&lt;/code&gt; control’s properties reside within an XML file; if you wanted to, you could share that XML file on the Web, allowing value added resellers (VARS), or possibly your companies’ partners, to use your banner advertisements on their web sites.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;i&gt;&lt;b&gt;NOTE: What Is XML?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; In essence, XML is simply a text-based format for the transfer or storage of data; it contains no details about how that data should be presented. XML is very easy to start with because of its close resemblance to your old friend HTML: both are largely comprised of tags inside angle brackets (&lt;code&gt;&amp;lt;&lt;/code&gt; and &lt;code&gt;&amp;gt;&lt;/code&gt;), and any tag may contain attributes that are specific to that tag. The biggest difference between XML and HTML is that, rather than providing a fixed set of tags as HTML does, XML allows us to create our own tags to describe the data we wish to represent. &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;i&gt;Take a look at the following HTML element: &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&lt;i&gt;&amp;lt;h1&amp;gt;Star Wars Episode I: The Phantom Menace&amp;lt;/h1&amp;gt;&lt;/i&gt;&lt;/code&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;i&gt;This example describes the content between the tags as a level one heading. This is fine if all we want to do is display the heading “Star Wars Episode I: The Phantom Menace” on a web page. But what if we want to access those words as data? &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;i&gt;Like HTML, XML’s purpose is to describe the content of a document. But where HTML is a very generic markup language for documents—headings, paragraphs and lists, for example—XML can, very specifically, describe &lt;b&gt;what the content is&lt;/b&gt;. Using XML, the web author can mark up the contents of a document, describing that content in terms of its relevance as data.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; We can use XML to mark up the words “Star Wars Episode I: The Phantom Menace” in a way that better reflects this content’s significance as data: &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&lt;i&gt;&amp;lt;film&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;title&amp;gt;Star Wars Episode I: The Phantom Menace&amp;lt;/title&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/film&amp;gt;&lt;/i&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;i&gt;Here, the XML tag names we’ve chosen best describe the contents of the element. We also define our own attribute names as necessary. For instance, in the example above, you may decide that you want to differentiate between the VHS version and the DVD version of the film, or record the name of the movie’s director. This can be achieved by adding attributes and elements, as shown below: &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&lt;i&gt;&lt;b&gt;&amp;lt;film format="DVD"&amp;gt;&lt;/b&gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;title&amp;gt;Star Wars Episode I: The Phantom Menace&amp;lt;/title&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;b&gt;&amp;lt;director&amp;gt;George Lucas&amp;lt;/director&amp;gt;&lt;/b&gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/film&amp;gt;&lt;/i&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If you want to test this control out, create a file called &lt;code&gt;&lt;b&gt;ads.xml&lt;/b&gt;&lt;/code&gt; in your &lt;code&gt;&lt;b&gt;LearningASP\VB&lt;/b&gt;&lt;/code&gt; or /&lt;b&gt;#c#/LearningASP\CS&lt;/b&gt; folder (or both), and insert the content presented below. Feel free to create your own banners, or to use those provided in the code archive for this book:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;LearningASP\VB\Ads.xml&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Advertisements&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;Ad&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;ImageUrl&amp;gt;workatdorknozzle.gif&amp;lt;/ImageUrl&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;NavigateUrl&amp;gt;http://www.example.com&amp;lt;/NavigateUrl&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;TargetUrl&amp;gt;_blank&amp;lt;/TargetUrl&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;AlternateText&amp;gt;Work at Dorknozzle!&amp;lt;/AlternateText&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Keyword&amp;gt;HR Sites&amp;lt;/Keyword&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Impressions&amp;gt;2&amp;lt;/Impressions&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/Ad&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;Ad&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;ImageUrl&amp;gt;getthenewsletter.gif&amp;lt;/ImageUrl&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;NavigateUrl&amp;gt;http://www.example.com&amp;lt;/NavigateUrl&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;TargetUrl&amp;gt;_blank&amp;lt;/TargetUrl&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;AlternateText&amp;gt;Get the Nozzle Newsletter!&amp;lt;/AlternateText&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Keyword&amp;gt;Marketing Sites&amp;lt;/Keyword&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Impressions&amp;gt;1&amp;lt;/Impressions&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/Ad&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Advertisements&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; As you can see, the &lt;code&gt;Advertisements&lt;/code&gt; element is the root node, and in accordance with the XML specification, it appears only once. For each individual advertisement, we simply add an &lt;code&gt;Ad&lt;/code&gt; child element. For instance, the above advertisement file contains details for two banner advertisements.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; As you’ve probably noticed by now, the &lt;code&gt;.xml&lt;/code&gt; file enables you to specify properties for each banner advertisement by inserting appropriate elements inside each of the Ad elements. These elements include:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;code&gt;ImageURL&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; the URL of the image to display for the banner ad&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;code&gt;NavigateURL&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; the web page to which your users will navigate when they click the banner ad&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;code&gt;AlternateText&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; the alternative text to display for browsers that don’t support images&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;code&gt;Keyword&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; the keyword to use to categorize your banner ad&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (If you use the &lt;code&gt;KeywordFilter&lt;/code&gt; property of the &lt;code&gt;AdRotator&lt;/code&gt; control, you can specify the categories of banner ads to display.)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;code&gt;Impressions&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; the relative frequency with which a particular banner ad should be shown in relation to other banner advertisements&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (The higher this number, the more frequently that specific banner will display in the browser. The number provided for this element can be as low as one, but cannot exceed 2,048,000,000; if it does, the page throws an exception.)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Except for &lt;code&gt;ImageURL&lt;/code&gt;, all these elements are optional. Also, if you specify an &lt;code&gt;Ad&lt;/code&gt; without a &lt;code&gt;NavigateURL&lt;/code&gt;, the banner ad will display without a hyperlink.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; To make use of this &lt;b&gt;&lt;code&gt;Ads.xml&lt;/code&gt;&lt;/b&gt; file, create a new ASP.NET page called &lt;b&gt;&lt;code&gt;AdRotator.aspx&lt;/code&gt;&lt;/b&gt;, and add the following code to it:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Visual Basic LearningASP\VB\AdRotator.aspx&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;code&gt;&amp;lt;%@ Page Language="VB" %&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script runat="server"&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;head runat="server"&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;title&amp;gt;&lt;b&gt;Using the AdRotator Control&lt;/b&gt;&amp;lt;/title&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/head&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;body&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;form id="form1" runat="server"&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&amp;lt;asp:AdRotator ID="adRotator" runat="server" &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AdvertisementFile="Ads.xml" /&amp;gt;&lt;/b&gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/div&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/form&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/body&amp;gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/html&amp;gt; &lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; As with most of our examples, the C# version of this code is the same except for the &lt;code&gt;Page&lt;/code&gt; declaration. You’ll also need to copy the &lt;code&gt;&lt;b&gt;workatdorknozzle.gif&lt;/b&gt;&lt;/code&gt; and &lt;code&gt;&lt;b&gt;getthenewsletter.gif&lt;/b&gt;&lt;/code&gt; image files from the code archive and place them in your working folder in order to see these ad images. Save your work and test it in the browser; the display should look something like Figure 6.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img alt="Displaying ads using AdRotator.aspx" height="124" src="http://i2.sitepoint.com/graphics/6%20adrotator.jpg" width="400" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Refresh the page a few times, and you’ll notice that the first banner appears more often than the second. This occurs because the &lt;code&gt;Impression&lt;/code&gt; value for the first &lt;code&gt;Ad&lt;/code&gt; is double the value set for the second banner, so it will appear twice as often.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4942427404274609914-2398480749211372907?l=programmingdiscussions.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/2398480749211372907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/09/constructions-of-aspnet-web-pages.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/2398480749211372907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/2398480749211372907'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/09/constructions-of-aspnet-web-pages.html' title='The Constructions of ASP.NET web pages'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-3823515691830728254</id><published>2010-09-05T23:07:00.000-07:00</published><updated>2010-09-05T23:07:40.546-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><title type='text'>Encapsulation and Inheritence</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;Introduction&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;In this article i would like to describe the people what are the basic concepts of Object Oriented Programming&lt;br /&gt;The OOP stands on the following three pillars.&lt;/span&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Object &amp;amp;Class (Encapsulation)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Inheritance&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Polymorphism&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size: small;"&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;1 Object &amp;amp; Class (Encapsulation):&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;&lt;h4&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;Object:&lt;/span&gt;&lt;/h4&gt;&lt;div&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;TheObject is an Instance in programming language which is made byinspiring from the real world which contains some properties andmethods.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Lets take an example of a person(object) from the real world.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;A&amp;nbsp;person&amp;nbsp;is an &lt;u&gt;object,&lt;/u&gt; as i told&amp;nbsp;you before that an object could &lt;em&gt;have methodes(behaviour)&amp;amp; properties&lt;/em&gt; so here person(object) could have some&lt;em&gt; properties &lt;/em&gt;like his black hair,fair color,tall,and so on..Simillarly it could have the&lt;em&gt; methodes &lt;/em&gt;like&amp;nbsp;Eat,Run,Play,Sleep and so on..All these properties &amp;amp; methodes are kept stored in a seperate &lt;u&gt;class.&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;h4&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Class:&lt;/span&gt;&lt;/h4&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;A class is basically a container where object lies..In programming we define all the properties&amp;amp;methodes in a seperate class while we make object of that class in main class... It means we generate the objects from main class, lets have a look..&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,Arial,Tahoma; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;class cat&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp; public void eat()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.writeline("cat eats mouse");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void walk()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.writeline("It walks slowly...");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Here we have defined a class and in 'class cat' "&amp;nbsp;public void eat() "and " public void walk() " are methods.now we make an object in mainclass and call these methods...&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,Arial,Tahoma; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;static void main ()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp; cat&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;mycat&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;/em&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;new cat();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;mycat&lt;/span&gt;&lt;/em&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;.eat();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;mycat&lt;/span&gt;&lt;/em&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;.walk();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.readline();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;This is the main&amp;nbsp; class in which we make an object named &lt;em&gt;mycat &lt;/em&gt;of the classs cat.. after making the cat's class object we can call its methods&amp;amp;properties by writting "&lt;em&gt;mycat.&lt;/em&gt;" when we put dot after the object it calls all the methodes &amp;amp; properties from the related class...&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span style="font-size: small;"&gt;Encapsulation in OOP?&lt;/span&gt;&lt;/h4&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;Encapsulationis the word which came from the word "CAPSULE" which to put some thingin a kind of shell. In OOP we are capsuling our code not in a shell butin "Objects" &amp;amp; "Classes".&amp;nbsp; So it means to hide the information intoobjects and classes is called Encapsulation.&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;2 Inheritance:&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;The Inheritance is one of the main concepts of oop.Inheritance is just to adobe the functionality (methods &amp;amp; properties) of one class to another. This simple term is known as Inheritance.&amp;nbsp;&lt;br /&gt;Lets have a look of code&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,Arial,Tahoma; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;public class cat&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; public void eat()&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.writeline("cat can eat");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; public void walk()&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.writeline("cat can walk");&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;now we make another class of another cat and we inherit the methodsof the first class to the new class.Do remember in programming weinherit one class to another by coding " : " colon between the parentand child class.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Lets have a look..&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,Arial,Tahoma; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;public class EgyptianCat : cat&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; public void jump()&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.writeline("Egyptian cat can jump");&amp;nbsp;&lt;br /&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;&amp;nbsp;public void bite()&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.writeline("Egyptian cat can not bite");&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,Arial,Tahoma; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;static void main()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;cat mycat=new cat();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;mycat.eat();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;mycat.walk();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;EgyptianCat yourcat=new EgyptianCat();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;yourcat.eat();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;yourcat.walk();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;yourcat.jump();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;yourcat.bite();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;console.readline();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;this is the code in main class in which we are inheriting the class EgyptianCat to the class cat, so that the new class becomes the child class of the first class which is now called the &lt;/span&gt;&lt;span style="color: #993300; font-size: small;"&gt;parent class&lt;/span&gt;&lt;span style="font-size: small;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4942427404274609914-3823515691830728254?l=programmingdiscussions.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/3823515691830728254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/09/encapsulation-and-inheritence.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/3823515691830728254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/3823515691830728254'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/09/encapsulation-and-inheritence.html' title='Encapsulation and Inheritence'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-6122506130277305813</id><published>2010-08-31T23:10:00.000-07:00</published><updated>2010-08-31T23:10:58.232-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Basic Concepts of OOP</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="ArticleContents"&gt;&lt;div class="WebPartContents"&gt;&lt;span style="font-size: small;"&gt;Theseare the basic concepts of Object Oriented Programming. I wrote it forthose who don't have basic concepts of oop, and for those who feelsprogramming a big monster. I tried to make them understand as mucheasiest as i could in my blog.. Best of Luck&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;                &lt;br /&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;Introduction&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;In this article i would like to describe the people what are the basic concepts of Object Oriented Programming&lt;br /&gt;The OOP stands on the following three pillars.&lt;/span&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Object &amp;amp;Class (Encapsulation)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Inheritance&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Polymorphism&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;1 Object &amp;amp; Class:&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;&lt;h4&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;Object:&lt;/span&gt;&lt;/h4&gt;&lt;div&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;TheObject is an Instance in programming language which is made byinspiring from the real world which contains some properties andmethods.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Lets take an example of a person(object) from the real world.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;A&amp;nbsp;person&amp;nbsp;is an &lt;u&gt;object,&lt;/u&gt; as i told&amp;nbsp;you before that an object could &lt;em&gt;have methodes(behaviour)&amp;amp; properties&lt;/em&gt; so here person(object) could have some&lt;em&gt; properties &lt;/em&gt;like his black hair,fair color,tall,and so on..Simillarly it could have the&lt;em&gt; methodes &lt;/em&gt;like&amp;nbsp;Eat,Run,Play,Sleep and so on..All these properties &amp;amp; methodes are kept stored in a seperate &lt;u&gt;class.&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;h4&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Class:&lt;/span&gt;&lt;/h4&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;A class is basically a container where object lies..In programming we define all the properties&amp;amp;methodes in a seperate class while we make object of that class in main class... It means we generate the objects from main class, lets have a look..&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,Arial,Tahoma; white-space: normal;"&gt;class cat&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; public void eat()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.writeline("cat eats mouse");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void walk()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.writeline("It walks slowly...");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Here we have defined a class and in 'class cat' "&amp;nbsp;public void eat() "and " public void walk() " are methods.now we make an object in mainclass and call these methods...&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,Arial,Tahoma; white-space: normal;"&gt;static void main ()&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,Arial,Tahoma; white-space: normal;"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; cat&amp;nbsp;&lt;em&gt;mycat&amp;nbsp;=&amp;nbsp;&lt;/em&gt;new cat();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;em&gt;&amp;nbsp;mycat&lt;/em&gt;.eat();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;em&gt;mycat&lt;/em&gt;.walk();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.readline();&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;This is the main&amp;nbsp; class in which we make an object named &lt;em&gt;mycat &lt;/em&gt;of the classs cat.. after making the cat's class object we can call its methods&amp;amp;properties by writting "&lt;em&gt;mycat.&lt;/em&gt;" when we put dot after the object it calls all the methodes &amp;amp; properties from the related class...&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;Encapsulation in OOP?&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;Encapsulationis the word which came from the word "CAPSULE" which to put some thingin a kind of shell. In OOP we are capsuling our code not in a shell butin "Objects" &amp;amp; "Classes".&amp;nbsp; So it means to hide the information intoobjects and classes is called Encapsulation.&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;2 Inheritance:&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;The Inheritance is one of the main concepts of oop.Inheritance is just to adobe the functionality (methods &amp;amp; properties) of one class to another. This simple term is known as Inheritance.&amp;nbsp;&lt;br /&gt;Lets have a look of code&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,Arial,Tahoma; white-space: normal;"&gt;public class cat&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; public void eat()&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.writeline("cat can eat");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; public void walk()&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.writeline("cat can walk");&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;now we make another class of another cat and we inherit the methodsof the first class to the new class.Do remember in programming weinherit one class to another by coding " : " colon between the parentand child class.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Lets have a look..&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,Arial,Tahoma; white-space: normal;"&gt;public class EgyptianCat : cat&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; public void jump()&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.writeline("Egyptian cat can jump");&amp;nbsp;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;public void bite()&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.writeline("Egyptian cat can not bite");&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,Arial,Tahoma; white-space: normal;"&gt;static void main()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;cat mycat=new cat();&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;mycat.eat();&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;mycat.walk();&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;EgyptianCat yourcat=new EgyptianCat();&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;yourcat.eat();&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;yourcat.walk();&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;yourcat.jump();&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;yourcat.bite();&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;console.readline();&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;his is the code in main class in which we are inheriting the class EgyptianCat to the class cat, so that the new class becomes the child class of the first class which is now called the &lt;/span&gt;&lt;span style="color: #993300; font-size: small;"&gt;parent class&lt;/span&gt;&lt;span style="font-size: small;"&gt;.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;In the next article, I shall describe about Polymorphism.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4942427404274609914-6122506130277305813?l=programmingdiscussions.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/6122506130277305813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/basic-concepts-of-oop.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/6122506130277305813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/6122506130277305813'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/basic-concepts-of-oop.html' title='Basic Concepts of OOP'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-8744391263538017321</id><published>2010-08-26T19:19:00.000-07:00</published><updated>2010-08-26T19:19:47.690-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Site Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips and Tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='SEO'/><title type='text'>Dump That Free Hit Counter And Start Tracking</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;Dump That Free Hit Counter And Start Tracking&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;It seems that every other web site we visit has some sort of hitcounter on the main page, supposedly telling us how many people havebeen there before us. This week we're going to address this populartrend, explain why you don't need one, and what you should be doinginstead.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Most Internet marketers will normally implement a hit counter ontheir site for one or both of two reasons -- to give them a roughestimate of the number of visitors, and/or to give visitors theimpression that their site is popular and thus worthy of a good look.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Let's consider the first reason. There is nothing wrong with wantingto know how many people have visited your web site, in fact it'ssomething that you really do need to know. But putting a visible hitcounter on your home page is not the answer, especially not one ofthose free services.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;For one thing, the free services require you to in some way promotetheir site. For another, they are normally slow and increase the timeit takes for your pages to load. But most importantly, a hit counterdoesn't provide you with all of the information you need.&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Just look at any of the top web sites on the Internet. We promisethat you will not find a visible hit counter on any of them! That aloneshould tell you that the common hit counter is worthless. If a visiblecounter was worthwhile, don't you think Yahoo or Infoseek would haveone?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;You just can't win with a visible hit counter. If your site does notget many visitors, all it's going to do is make sure that the visitorsyou do get know that they are not visiting a popular site. If anything,all this will do is discourage them from exploring your web site indetail.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;On the other hand, maybe your site gets 50,000 visitors a day andyou think that letting people know this via a hit counter is a goodidea. Not really. If your web site gets lots of traffic it is becauseyou are doing something right, and having a hit counter isn't going toaffect this.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Unfortunately, what normally happens is that the misguided Internetmarketer will set up a visible hit counter on their home page and thenartificially inflate their visitor count. This is done in the hopesthat it will impress people, but it's a terribly bad idea and does notwork.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;In the early days of the web it was "cool" to have a hit counter onyour home page, but they are so commonplace these days that no one paysthem any attention anyway. No matter what your reason for using avisible hit counter, we say dump it and start tracking!&lt;/span&gt;&lt;br /&gt;&lt;h5&gt;&lt;span style="font-size: small;"&gt;Tracking Visitors' Footsteps&lt;/span&gt;&lt;/h5&gt;&lt;span style="font-size: small;"&gt;While Yahoo and Infoseek don't have visible counters on their pages,rest assured that they know your every move. No other advertisingmedium allows you to do the things the Internet does, and it amazes usthat more marketers do not take advantage of serious site tracking.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Part of the problem seems to be that many Internet marketers areonly concerned with promoting their web site and getting more people tovisit. More visitors equals more sales right? Well yes that is true,but only if your web site leads visitors through the sales process.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Before you even begin promoting a web site, you should have in yourmind the path that you want visitors to take through your site. Salesis a process. One step leads to the next, until finally the end resultis hopefully that what was once just a prospect is now a customer.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Tracking your visitor's footsteps throughout your web site is thebest way to determine why they didn't take the action that you wantedthem to take. Who knows, maybe 80% of your visitors aren't even makingit past your introductory page? You'll never know unless you track them.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Consider this another Internet marketing rule that is written instone. If you're not tracking your entire web site and tweaking it on aregular basis, you're throwing money down the proverbial drain. From aprofit standpoint, it is critical that you know the answers toquestions like:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;How do visitors find your site in the first place? &lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;How many of them make it past the main page? &lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Which page of your site is the most popular?&lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;How long does the average visitor stick around? &lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;What is the average number of pages viewed? &lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;What path do visitors take through your site? &lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;What links do they use to leave your site?&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size: small;"&gt;If you don't know the answers to these simple questions, here's aneasy way to increase your profits starting immediately. And the goodnews is that it may not cost you anything other than some time. We'regoing to show you how to use free CGI scripts to ultimately increasesales!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;While you don't really need to learn anything technical to use thescripts we're going to suggest, you do need to be able to run CGIscripts on your web server. If you have no idea what CGI scripts are,ask your ISP. If they say no, we strongly suggest that you find a newISP.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If you haven't realized it by now, we are a big fan of CGI scriptsbecause they are what allows you to add interactivity to your web site.But CGI scripts can also help you do many other things, like track yourvisitors' footsteps.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Go to http://www.cgi-resources.com&lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Click on "Programs and Scripts"&lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Click on "Perl"&lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Click on "Logging Accesses and Statistics"&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size: small;"&gt;You'll be presented with no less than 30 CGI script packages whichwill help you gather valuable information about your visitors, andbelieve it or not, most of them are free! We looked at all of them, sowe'll save you the time and suggest the two we like best to help youget started.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;One of the first scripts we tried, and still one of our favorites,is AXS by Fluid Dynamics. It's one of the first scripts listed and youcan't miss it. You can download it for free, and with a minimal amountof effort you could be tracking your entire web site within the nextfew hours.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The direct URL to the AXS site is &lt;a class="sublink" href="http://www.xav.com/scripts/axs"&gt;http://www.xav.com/scripts/axs&lt;/a&gt;Rather than going into detail about it here, we'll let you discover itfor yourself. It's a great system and the only thing we don't likeabout it is that it creates it's own log files, and they get huge ifyour site is busy.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The alternative is to use something like Darryl Burgdorf's WebLog. The direct URL to this great script is &lt;a class="sublink" href="http://awsd.com/scripts/weblog"&gt;http://awsd.com/scripts/weblog&lt;/a&gt;.It does everything AXS does, but it runs off of your existing serverlogs which makes it easier to set up for most. It's also more efficient.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Both AXS and WebLog will give you all of the information you couldever want about your visitors, and both display this information in away that is easy for you to interpret using graphs, etc. We encourageyou to download and set up one of these scripts to track your web site.&lt;/span&gt;&lt;br /&gt;&lt;h5&gt;&lt;span style="font-size: small;"&gt;My Site Is Being Tracked, What Next?&lt;/span&gt;&lt;/h5&gt;&lt;span style="font-size: small;"&gt;The point of tracking your site is to act on the information yougather and use it to improve your web site's effectiveness. If youdiscover that 80% of your visitors aren't making it past your homepage, or that the average person leaves within 2 minutes, you now haveyour work cut out for you.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The real value of tracking your visitor's footsteps is that it willhelp you determine why they did not take the action that you wantedthem to take. Once you see how most people navigate your web site, youcan then make changes until the path they take is the one you want.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Spend some time implementing a good tracking system on your site,because if you can increase your visitor-to-sales ratio even just a fewpercentage points it will be more than worth your time. Remember, itdoesn't matter how many hits you get if your site doesn't do its job.&lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4942427404274609914-8744391263538017321?l=programmingdiscussions.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/8744391263538017321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/dump-that-free-hit-counter-and-start.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/8744391263538017321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/8744391263538017321'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/dump-that-free-hit-counter-and-start.html' title='Dump That Free Hit Counter And Start Tracking'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-2751320489041083666</id><published>2010-08-24T19:19:00.000-07:00</published><updated>2010-08-24T19:39:53.469-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips and Tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Source code'/><title type='text'>4-Tier Architecture in ASP.NET with C#</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Well, the architecture I am going to demonstrate here is justenhancement of 3-Tier archicture. In this architecture; you no need ofwriting long function parameters throughout the layers (as intraditionally 3-Tier archicture has to) and the actual objects of theapplication will be in a separate tier so that in future you canseparately use these objects for enhancements. Change in the objectdefinition can be done without touching the entire Business AccessLayers ............&lt;br /&gt;Let me explain you step-wise process of creatioin of 4-Tier architecture application.&lt;br /&gt;In this application, I am going to take example of a Person thatwill have 3 properties: FirstName, LastName, Age. We will create aseparate pages to insert these records (default.aspx) into database andlist,update,delete records (list.aspx) from database.&lt;/span&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;In this application we will have following 4-Tiers&lt;br /&gt;1. Business Object [BO]&lt;br /&gt;2. Business Access Layer [BAL]&lt;br /&gt;3. Data Access Layer [DAL]&lt;br /&gt;4. UI (4-Tier) folder [UI]&lt;br /&gt;&lt;u&gt;&lt;i&gt;Picture - 1 (Solution Explorer) &lt;/i&gt;&lt;/u&gt;&lt;br /&gt;&lt;img class="ArticleImage" src="http://www.dotnetfunda.com/UserFiles/ArticlesFiles/633286699889686736_SheoNarayan_4-tiers.GIF" /&gt;&lt;br /&gt;For simplicity reason, I have created separate folders for first3-tiers into App_Code folder. You can create a separate projects forthese tiers and add into forth tier (UI) solution.&lt;br /&gt;Lets create above tiers one by one.&lt;br /&gt;&lt;span class="ArticleParagraphTitle"&gt;Business Object [BO - Person.cs]&lt;/span&gt;&lt;br /&gt;Create a separate folder by right-clicking App_Code folder and nameit as BO. Right click this folder and create a new .cs (Class) filenamed Person.cs. Write following code inside it.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;int m_PersonID = 0;&lt;br /&gt;    string m_FirstName = string.Empty;&lt;br /&gt;    string m_LastName = string.Empty;&lt;br /&gt;    int m_Age = 0;&lt;br /&gt;    #region Propertiers&lt;br /&gt;    public int PersonID&lt;br /&gt;    {&lt;br /&gt;        get { return m_PersonID; }&lt;br /&gt;        set { m_PersonID = value; }&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;    public string FirstName&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;        get { return m_FirstName; }&lt;br /&gt;        set { m_FirstName = value; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    public string LastName&lt;br /&gt;    {&lt;br /&gt;        get { return m_LastName; }&lt;br /&gt;        set { m_LastName = value; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;    public int Age&lt;br /&gt;    {&lt;br /&gt;        get { return m_Age; }&lt;br /&gt;        set { m_Age = value; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    #endregion Properties&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Here, we are first declaring 4 variables for corresponding properitesand defining properties for them.This is your Business Object with allits properties/attributes to work with. Next step is to create DataAccess Layer.&lt;br /&gt;&lt;span class="ArticleParagraphTitle"&gt;Data Access Layer [DAL - PersonDAL.cs]&lt;/span&gt;&lt;br /&gt;The way you created BO folder inside App_Code folder, createanother folder named DAL. Create a .cs file inside it and name it asPersonDAL.cs&lt;br /&gt;Write following code inside it (You can copy-paste).&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;using System;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Configuration;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.Security;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;using System.Web.UI.WebControls;&lt;br /&gt;using System.Web.UI.WebControls.WebParts;&lt;br /&gt;using System.Web.UI.HtmlControls;&lt;br /&gt;using System.Data.SqlClient;&lt;/span&gt; &lt;span style="font-size: small;"&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Summary description for PersonDAL&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public class PersonDAL &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string connStr = ConfigurationManager.ConnectionStrings["TutTestConn"].ToString();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public PersonDAL()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Used to insert records into database&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="p"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Insert(Person person)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlConnection conn = new SqlConnection(connStr);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Open();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlCommand dCmd = new SqlCommand("InsertData", conn);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.CommandType = CommandType.StoredProcedure;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.Parameters.AddWithValue("@firstName", person.FirstName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.Parameters.AddWithValue("@lastName", person.LastName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.Parameters.AddWithValue("@age", person.Age);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return dCmd.ExecuteNonQuery();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; /// Update record into database&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="p"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Update(Person person)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlConnection conn = new SqlConnection(connStr);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Open();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlCommand dCmd = new SqlCommand("UpdateData", conn);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.CommandType = CommandType.StoredProcedure;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.Parameters.AddWithValue("@firstName", person.FirstName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.Parameters.AddWithValue("@lastName", person.LastName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.Parameters.AddWithValue("@age", person.Age);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.Parameters.AddWithValue("@personID", person.PersonID);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return dCmd.ExecuteNonQuery();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Load all records from database&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataTable Load()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlConnection conn = new SqlConnection(connStr);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlDataAdapter dAd = new SqlDataAdapter("LoadAll", conn);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dAd.SelectCommand.CommandType = CommandType.StoredProcedure;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataSet dSet = new DataSet();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dAd.Fill(dSet, "PersonTable");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return dSet.Tables["PersonTable"];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dSet.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dAd.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Delete record from database&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="person"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Delete(Person person)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlConnection conn = new SqlConnection(connStr);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Open();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlCommand dCmd = new SqlCommand("DeleteData", conn);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.CommandType = CommandType.StoredProcedure;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.Parameters.AddWithValue("@personID", person.PersonID);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return dCmd.ExecuteNonQuery();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dCmd.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: small;"&gt;In this class file, we have Insert, Update, Delete, Load methods. Inthis class file, first I am getting the connection string from theweb.config file in a class level variable called &lt;i&gt;connStr&lt;/i&gt; and using the same string in all my methods to open the connection.&lt;br /&gt;&lt;u&gt;&lt;b&gt;For simplicity reason, I have not shown the code for StoredProcedure, however you can get the complete database and code bydownloading the Source Code files.&lt;/b&gt;&lt;/u&gt; This was your Data AccessLayer. Till now you have your Business Object and Data Access Layerready. Now lets go to the third layer and create Business Access Layer.&lt;br /&gt;&lt;span class="ArticleParagraphTitle"&gt;Business Access Layer [BAL - PersonBAL.cs] &lt;/span&gt;&lt;br /&gt;Again, right click App_Code folder and add a new folder named BAL.Create a new class file inside it and name it as PersonBAL.cs. Writefollowing code inside it.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;using System;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Configuration;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.Security;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;using System.Web.UI.WebControls;&lt;br /&gt;using System.Web.UI.WebControls.WebParts;&lt;br /&gt;using System.Web.UI.HtmlControls;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Summary description for PersonBAL&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public class PersonBAL&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public PersonBAL()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// insert records into database&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="person"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Insert(Person person)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PersonDAL pDAL = new PersonDAL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return pDAL.Insert(person);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDAL = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Update records into database&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="person"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Update(Person person)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PersonDAL pDAL = new PersonDAL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return pDAL.Update(person);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDAL = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Load records from database&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataTable Load()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PersonDAL pDAL = new PersonDAL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return pDAL.Load();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDAL = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Delete record from database&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="person"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Delete(Person person)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PersonDAL pDAL = new PersonDAL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return pDAL.Delete(person);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDAL = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Here, we are creating separate methods each for respective PersonDAL.csmethods here. As in our case we don't have any business logic, so weare just instantiating the Data Access Layer objects, using its methodsand and returning to UI (fourth layer, described later on).&lt;br /&gt;&lt;i&gt;You must have noticed here that in the try catch block, I amjust writing throw; statement. This is because when any error willoccur it will be send to the calling layers (in our case UI) and therewe will handle it.&lt;/i&gt;&lt;br /&gt;Till now, we have BO, BAL and DAL ready. Now we are left with ourapplication face, I mean UI. Lets first create default.aspx file thatwill contain one form and textboxs that will be used to enter records.&lt;br /&gt;&lt;span class="ArticleParagraphTitle"&gt;User Interface - [UI]-Default.aspx&lt;/span&gt;&lt;br /&gt;Create a separate folder in your UI solution named 4-Tier and addone .aspx page called Default.aspx (Picture - 2). In this page, we willwrite ASP.NET code to render textboxes and buttons. OnClick event ofthe button we will calll &lt;b&gt;AddRecords &lt;/b&gt; method that will ultimately insert the records into database. Below is the code to render the asp.net form.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;form id="form1" runat="server"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;&amp;lt;a href="List.aspx"&amp;gt;List Records&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Label ID="lblMessage" runat="Server" ForeColor="red" &lt;br /&gt;EnableViewState="False"&amp;gt;&amp;lt;/asp:Label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;table style="border:2px solid #cccccc;"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr style="background-color:#ECF3AB;"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;th colspan="3"&amp;gt;Add Records&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; First Name:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TextBox ID="txtFirstName" runat="Server"&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:RequiredFieldValidator ID="req1" runat="Server" Text="*" &lt;br /&gt;ControlToValidate="txtFirstName" Display="dynamic"&amp;gt;&amp;lt;/asp:RequiredFieldValidator&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Last Name:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TextBox ID="txtLastName" runat="Server"&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:RequiredFieldValidator ID="req2" runat="Server" Text="*" &lt;br /&gt;ControlToValidate="txtLastName" Display="dynamic"&amp;gt;&amp;lt;/asp:RequiredFieldValidator&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Age:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TextBox ID="txtAge" runat="Server" Columns="4"&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:RequiredFieldValidator ID="req3" runat="Server" Text="*" ControlToValidate="txtAge" &lt;br /&gt;Display="dynamic"&amp;gt;&amp;lt;/asp:RequiredFieldValidator&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:CompareValidator ID="Comp1" runat="Server" Text="Only integer" &lt;br /&gt;ControlToValidate="txtAge" Operator="DataTypeCheck" Type="Integer"&amp;gt;&amp;lt;/asp:CompareValidator&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="AddRecords" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/table&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/form&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;u&gt;&lt;i&gt;Picture - 2 (Default.aspx)&lt;/i&gt;&lt;/u&gt;&lt;br /&gt;&lt;img class="ArticleImage" src="http://www.dotnetfunda.com/UserFiles/ArticlesFiles/633286700026408986_SheoNarayan_insert4-tier.GIF" /&gt;&lt;br /&gt;&lt;b&gt;AddRecords method&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;protected void AddRecords(object sender, EventArgs e)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;       //Lets validate the page first&lt;br /&gt;&lt;br /&gt;        if (!Page.IsValid)&lt;br /&gt;&lt;br /&gt;            return;&lt;br /&gt;&lt;br /&gt;        int intResult = 0;&lt;br /&gt;&lt;br /&gt;        // Page is valid, lets go ahead and insert records&lt;br /&gt;&lt;br /&gt;        // Instantiate BAL object&lt;br /&gt;&lt;br /&gt;        PersonBAL pBAL = new PersonBAL();&lt;br /&gt;&lt;br /&gt;     // Instantiate the object we have to deal with&lt;br /&gt;&lt;br /&gt;        Person person = new Person();&lt;br /&gt;&lt;br /&gt;        // set the properties of the object&lt;br /&gt;&lt;br /&gt;        person.FirstName = txtFirstName.Text;&lt;br /&gt;&lt;br /&gt;        person.LastName = txtLastName.Text;&lt;br /&gt;&lt;br /&gt;        person.Age = Int32.Parse(txtAge.Text);&lt;br /&gt;&lt;br /&gt;        try&lt;br /&gt;      {&lt;br /&gt;&lt;br /&gt;            intResult = pBAL.Insert(person);&lt;br /&gt;&lt;br /&gt;            if (intResult &amp;gt; 0)&lt;br /&gt;&lt;br /&gt;                lblMessage.Text = "New record inserted successfully.";&lt;br /&gt;&lt;br /&gt;            else&lt;br /&gt;&lt;br /&gt;                lblMessage.Text = "FirstName [&lt;b&gt;"+ txtFirstName.Text +"&lt;/b&gt;] alredy exists, try another &lt;br /&gt;name";&lt;br /&gt;        }&lt;br /&gt;        catch (Exception ee)&lt;br /&gt;        {&lt;br /&gt;            lblMessage.Text = ee.Message.ToString();&lt;br /&gt;        }&lt;br /&gt;        finally&lt;br /&gt;        {&lt;br /&gt;            person = null;&lt;br /&gt;            pBAL = null;&lt;br /&gt;        }        &lt;br /&gt;&lt;br /&gt;    }&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;In the above method, I am doing following things mainly:&lt;br /&gt;1. Instantiating BAL object&lt;br /&gt;2. Instantiating BO object&lt;br /&gt;3. Settinng properties of BO object by the textbox values&lt;br /&gt;4. Calling Insert method of the BAL object and passing BO object as parameter [pBAL.Insert(person)] in try block &lt;br /&gt;5. Checking for number of records affected, If the number is morethan zero, I am writing Success message otherwise Duplicate recordsfound.&lt;br /&gt;6. If any layer will throw any error, I am catching it and displaying to the user in throw block.&lt;br /&gt;7. Whatever objects I had instantiated, I am specifying theirvalues to null to let the GC know that I am no more going to use them.&lt;br /&gt;&lt;br /&gt;&lt;span class="ArticleParagraphTitle"&gt;User Interface - [UI]-List.aspx&lt;/span&gt;&lt;br /&gt;In this page, I am going to use a GridView to List, Modify, Sortand Delete records from the database. Create an .aspx page in the same4-Tier folder named List.aspx (Picture - 3). Following is the code forthe GridView that will do data manipulation for us.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;form id="form1" runat="server"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;&amp;lt;a href="Default.aspx"&amp;gt;Add Record&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Label ID="lblMessage" runat="Server" ForeColor="red" EnableViewState="False"&amp;gt;&amp;lt;/asp:Label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataKeyNames="PersonID" AutoGenerateEditButton="True" AutoGenerateColumns="False"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnRowEditing="EditRecord" OnRowUpdating="UpdateRecord" OnRowCancelingEdit="CancelRecord"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnRowDeleting="DeleteRecord" AllowPaging="True" AllowSorting="true" PageSize="5" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnPageIndexChanging="ChangePage" OnSorting="SortRecords"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowStyle BackColor="#EFF3FB" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;EditRowStyle BackColor="#2ff1BF" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;AlternatingRowStyle BackColor="White" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Columns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundField DataField="PersonID" HeaderText="Person ID" ReadOnly="True"&amp;nbsp; SortExpression="PersonID" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TemplateField HeaderText="First Name" SortExpression="FirstName"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%# Eval("FirstName") %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;EditItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TextBox ID="txtFName" runat="Server" Text='&amp;lt;%# Eval("FirstName") %&amp;gt;'&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/EditItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TemplateField HeaderText="Last Name" SortExpression="LastName"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%# Eval("LastName") %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;EditItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TextBox ID="txtLName" runat="Server" Text='&amp;lt;%# Eval("LastName") %&amp;gt;'&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/EditItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TemplateField HeaderText="Age" SortExpression="Age"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%# Eval("Age") %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;EditItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TextBox ID="txtAge" runat="Server" Text='&amp;lt;%# Eval("Age") %&amp;gt;'&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/EditItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TemplateField HeaderText="Delete?"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;span onclick="return confirm('Are you sure to Delete?')"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:LinkButton ID="lnBD" runat="server" Text="Delete" CommandName="Delete"&amp;gt;&amp;lt;/asp:LinkButton&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/span&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Columns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/form&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;u&gt;&lt;i&gt;Picture - 3 (List.aspx) &lt;/i&gt;&lt;/u&gt;&lt;br /&gt;&lt;img class="ArticleImage" src="http://www.dotnetfunda.com/UserFiles/ArticlesFiles/633286700069535090_SheoNarayan_list4-tier.GIF" /&gt;&lt;br /&gt;On the OnRowEditing, OnRowUpdating, OnRowCancelEdit, OnSorting andOnRowDeleting events we are calling respective methods to do datamanipulation. Following are codes to bind the GridView and methods thatwill fire on GridView events.&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!IsPostBack)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindGrid();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Fired when Cancel button is clicked&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void CancelRecord(object sender, GridViewCancelEditEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GridView1.EditIndex = -1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindGrid();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Fires when Edit button is clicked&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void EditRecord(object sender, GridViewEditEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GridView1.EditIndex = e.NewEditIndex;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindGrid();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Fires when Update button is clicked&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void UpdateRecord(object sender, GridViewUpdateEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int personID = Int32.Parse(GridView1.DataKeys[e.RowIndex].Value.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int intResult = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GridViewRow row = GridView1.Rows[e.RowIndex];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TextBox tFN = (TextBox) row.FindControl("txtFName");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TextBox tLN = (TextBox)row.FindControl("txtLName");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TextBox tAge = (TextBox)row.FindControl("txtAge");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // instantiate BAL&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PersonBAL pBAL = new PersonBAL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Person person = new Person();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; person.PersonID = personID;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; person.FirstName = tFN.Text;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; person.LastName = tLN.Text;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; person.Age = Int32.Parse(tAge.Text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intResult = pBAL.Update(person);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (intResult &amp;gt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lblMessage.Text = "Record Updated Successfully.";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lblMessage.Text = "Record couldn't updated";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception ee)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lblMessage.Text = ee.Message.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; person = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBAL = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GridView1.EditIndex = -1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Refresh the list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindGrid();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// fires when Delete button is clicked&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void DeleteRecord(object sender, GridViewDeleteEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int personID = Int32.Parse(GridView1.DataKeys[e.RowIndex].Value.ToString()); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // instantiate BAL&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PersonBAL pBAL = new PersonBAL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Person person = new Person();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; person.PersonID = personID;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBAL.Delete(person);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lblMessage.Text = "Record Deleted Successfully.";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception ee)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lblMessage.Text = ee.Message.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; person = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBAL = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GridView1.EditIndex = -1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Refresh the list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindGrid();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Fires when page links are clicked&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void ChangePage(object sender, GridViewPageEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GridView1.PageIndex = e.NewPageIndex;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Refresh the list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindGrid();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Fires when Columns heading are clicked&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void SortRecords(object sender, GridViewSortEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataTable dataTable = GridDataSource();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (dataTable != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataView dataView = new DataView(dataTable);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataView.Sort = GetSortExpression(e);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GridView1.DataSource = dataView;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GridView1.DataBind();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Private Methods&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Bind the gridview&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void BindGrid()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GridView1.DataSource = GridDataSource();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GridView1.DataBind();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Get GridView DataSource&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private DataTable GridDataSource()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PersonBAL p = new PersonBAL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataTable dTable = new DataTable();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dTable = p.Load();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception ee)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lblMessage.Text = ee.Message.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return dTable;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Get sort expression for the gridview&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string GetSortExpression(GridViewSortEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string sortDirection = string.Empty;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if clicked on the same column twice then let it toggle the sort order, else reset to ascending&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ViewState["SortExpression"] != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!ViewState["SortExpression"].ToString().Equals(e.SortExpression.ToLower()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewState["SortDirection"] = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ViewState["SortDirection"] != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ViewState["SortDirection"].ToString().Equals("ASC"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sortDirection = "DESC";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewState["SortDirection"] = "DESC";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sortDirection = "ASC";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewState["SortDirection"] = "ASC";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewState["SortDirection"] = "ASC";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewState["SortExpression"] = e.SortExpression.ToLower();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return e.SortExpression + " " + sortDirection;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion Private Methods &lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Thats it!!!&lt;br /&gt;Now we have done all our home work, Its time to enjoy now. Justbuild the application by pressing Ctrl+Shift+B, once it shows BuildSucceeded in the status bar at the bottom, you are ready to enjoy your4-Tier architecture application.&lt;br /&gt;Browse it as http://localhost/4-Tier (Provided you have created"4-Tier" virtual directory in your IIS or you can choose your ownvirtual directory name), you should see your screens as shown above(default.aspx and list.aspx pages).&lt;br /&gt;Try manipulating data and see how effectively its happening. Thiswas a simple application, based on this architecture, you can createlarger application by adding separate objects and their correspondingtiers. &lt;br /&gt;In order to use namespace in different tiers, you should defineyour namespace in respective tiers objects and use those namespace byusing statement whereever you need.&lt;br /&gt;I have also attached a ready to use sample code of this example, Download it and use it!!!&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span style="font-size: small;"&gt;Download &lt;/span&gt;&lt;/h4&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;img align="absbottom" src="http://www.dotnetfunda.com/images/sourceFiles.gif" /&gt;&amp;nbsp;&lt;a class="ArticleDownloadSource" href="http://www.dotnetfunda.com/UserFiles/ArticlesFiles/SheoNarayan_Articles_633443620385540760_4-TierArchitecture.zip"&gt;Download source code for &lt;b&gt;4-Tier Architecture in ASP.NET with C#&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Thanks &amp;amp; Happy Coding.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4942427404274609914-2751320489041083666?l=programmingdiscussions.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/2751320489041083666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/4-tier-architecture-in-aspnet-with-c.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/2751320489041083666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/2751320489041083666'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/4-tier-architecture-in-aspnet-with-c.html' title='4-Tier Architecture in ASP.NET with C#'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-4891903673270827625</id><published>2010-08-23T22:40:00.000-07:00</published><updated>2010-08-23T22:40:43.596-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Passwords Security  in Your Database</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;When ASP.NET developers think of Web security andauthentication, three options typically come to mind: Windowsauthentication, forms authentication, and passport authentication. &lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If you're building an Intranet application within your organization,for instance, you might choose to use Windows authentication.Configuring Windows authentication within IIS is fairly straightforward and involves only two steps. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;First, we make sure that Integrated Windows Authentication ischecked and Anonymous Access is unchecked for a Web application byfollowing the steps outlined below:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Right-click on the Web app directory within IIS and select Properties.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Select the Directory Security tab from the application's Properties dialog.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Select the Edit… button within the Anonymous Access and Authentication control panel.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Uncheck Anonymous Access and make sure that Integrated Windows Authentication is checked similar to the figure below.&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="1370_01" height="432" src="http://sitepointstatic.com/graphics/01.png" width="371" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Second, we need only to modify the mode attribute within theauthentication tag in the application's Web.config file so that it'sset to Windows (which is set by default) as follows:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;authentication mode="Windows" /&amp;gt; &lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;That's all there is to it. Whenever users request a page, they'll beasked to supply their Windows username and password. Once logged in,users can be tracked by accessing the &lt;code&gt;user.identity&lt;/code&gt; property for the page.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;In many scenarios, however, development is focused around formsauthentication. Why? Because you wouldn't want manually to createusernames and passwords for the thousands of potential users that wouldaccess your site. Assuming you're building a large-scale forumapplication that is accessible by many users over the Internet, formsauthentication would be your best bet because it allows you to storeusernames and password within your data store (usually a databasetable) of choice, then validate your users based on a Web accessiblelogin page similar to this: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="1370_02" height="332" src="http://sitepointstatic.com/graphics/02.png" width="371" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;In this scenario, users enter their usernames and passwords and click a Login button. The Login button raises a &lt;code&gt;Click&lt;/code&gt;event, some sort of validation method is called, and code is executedto compare the values users entered into the text boxes with valuescontained in a database. Typically, the database is structured with aUsers table containing UserID, Username, and Password fields similar tothe design shown here. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="1370_03" height="177" src="http://sitepointstatic.com/graphics/03.png" width="363" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Now, I've read dozens of articles and a few dozen chapters in booksthat discuss working with forms authentication and most seem tostructure their database table around the simple design shown above. Soyou're probably asking yourself, "What's the problem?" Well, passwordinformation is stored as clear text, so any developer with access tothe database has access to the username and password information forall users that subscribe to the application. While it's not a big dealfor forum applications, it becomes an issue when you start dealing withonline banking applications or even day-trading applications likeE*Trade, TD Waterhouse, etc. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;One solution to this problem could see us use simplistic hashing and store our passwords within a message digest.&lt;/span&gt;&lt;br /&gt;&lt;h5&gt;&lt;span style="font-size: small;"&gt;Message Digest and Simplistic Hashing&lt;/span&gt;&lt;/h5&gt;&lt;span style="font-size: small;"&gt;A message digest is the representation of text in the form of asingle string of digits created using a formula called a one-way hashfunction. A one-way hash function takes an input string (such as apassword) and performs some math on it to produce a string ofgobbledygook (a digest string). Let's take the password "zak", forinstance. I could "hash" that password and the resulting digest wouldbe: D52987198EA2730FD22A38E7976344D843A7FFA0. Doesn't look at all like"zak", does it?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;A good hash function makes it extremely difficult to guess an inputstring that will produce a given digest string. What if you convertedyour users' passwords into digest strings, and stored those digeststrings in the database instead of the actual passwords? Whenever auser logs in, your authentication script could perform the same one-wayhash function on the password he or she enters and compare it with thedigest string stored in the database. A match means the user enteredthe right password, and should be granted access to the site.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The big advantage here is that someone who can read your userdatabase (say, a database administrator), can see only the digeststrings—not the original passwords! And, because it's practicallyimpossible to find the password to produce a particular message digest,they can't use that information to gain access to your application!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;To really appreciate how hashing works, let's create a simple application that uses forms authentication. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Note that all the code included in this article is contained in &lt;a class="sublink" href="http://www.sitepoint.com/examples/securepword/securepword.zip" rel="external"&gt;this downloadable code archive&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Setting up a site to use forms authentication is just as easy asWindows authentication. First, we need only to modify the modeattribute within the authentication tag in the application's Web.configfile so that it's set to &lt;code&gt;Forms&lt;/code&gt; as follows:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;authentication mode="Forms" /&amp;gt; &lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Second, we can set the &lt;code&gt;users&lt;/code&gt; attribute of the deny tag within the authorization section handler to &lt;code&gt;"?"&lt;/code&gt; as follows:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;authorization&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;deny users="?" /&amp;gt;&lt;br /&gt;&amp;lt;/authorization&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Essentially, we'd be denying all anonymous users. Next, we create a registration page (registration.aspx) complete with three TextBox controls and a Button control to handle the user registration. The code should resemble the following:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;form runat="server"&amp;gt;&lt;br /&gt;&amp;lt;strong&amp;gt;User Registration&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;Username:&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;asp:TextBox id="txtUsername" runat="server" /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;Password:&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;asp:TextBox id="txtPassword" runat="server" TextMode="Password" /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;Email:&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;asp:TextBox id="txtEmail" runat="server" /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;asp:Button id="btnAddCredentials" runat="server" Text="Add Credentials" /&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;When viewed in the browser, your page should resemble the image below.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="1370_04" height="395" src="http://sitepointstatic.com/graphics/04.png" width="381" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Now that you've seen the UI output of our markup, let's add the &lt;code&gt;OnClick&lt;/code&gt; attribute that will call our &lt;code&gt;AddCredentials_Click()&lt;/code&gt; method, which we'll build in a minute:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;asp:button id="btnAddCredentials" onclick="AddCredentials_Click" runat="server" text="Add Credentials"&gt;&lt;/asp:button&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Now that we have our user interface ironed out, let's create a newdatabase and database table to store the username, password, and email(in case a user happens to forget the password and must reset it, wecan send out the instructions to the user's email). For this example, Icreate a simple Access database called Customers.mdb with a singletable called Users. The design for the Users table is outlined below:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="1370_table1" height="123" src="http://sitepointstatic.com/graphics/ASPtable1.png" width="427" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;When complete, the Datasheet will resemble that shown below.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="1370_05" height="150" src="http://sitepointstatic.com/graphics/05.png" width="456" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;We can now write the code to store our user's username, hashedpassword, and email within our database. We start by adding thenecessary directives to the top of the page as follows:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;%@ Import Namespace="System.Data.OleDb" %&amp;gt;&lt;br /&gt;&amp;lt;%@ Import Namespace="System.Web.Security" %&amp;gt;&lt;/span&gt; &lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Because we'll be interacting with an Access database, we import the &lt;code&gt;System.Data.OleDb&lt;/code&gt; namespace. Similarly, because we'll need to work with the &lt;code&gt;FormsAuthentication&lt;/code&gt; classes, we import the &lt;code&gt;System.Web.Security&lt;/code&gt; namespace. Next, we can add a code declaration block within the &amp;lt;head&amp;gt;&lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/head" title="Look up the &amp;lt;head&amp;gt; tag in the SitePoint HTML Reference."&gt;&lt;/a&gt;&lt;/code&gt; tag of our document, complete with variable declarations and our &lt;code&gt;AddCredentials_Click()&lt;/code&gt; method, as follows:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt; &lt;span style="font-size: small;"&gt;&amp;lt;script runat="server"&amp;gt;&lt;br /&gt;Dim objConn As New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data&amp;nbsp; &lt;br /&gt;&amp;nbsp;Source=C:InetpubwwwrootPasswordHashingDatabaseCustomers.mdb")&lt;br /&gt;Dim objCmd As OleDbCommand&lt;br /&gt;Dim sqlCmd As String&lt;br /&gt;&lt;br /&gt;Sub AddCredentials_Click(s As Object, e As EventArgs)&lt;br /&gt;&amp;nbsp;sqlCmd = "INSERT INTO Users (Username, Pass, Email)&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VALUES (@Username, @Pass, @Email)"&lt;br /&gt;&amp;nbsp;objCmd = New OleDbCommand(sqlCmd, objConn)&lt;br /&gt;&amp;nbsp;objCmd.Parameters.Add("@Username", txtUsername.Text)&lt;br /&gt;&amp;nbsp;objCmd.Parameters.Add("@Pass",&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormsAuthentication.HashPasswordForStoringInConfigFile(txtPassword.Text,&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; "SHA1"))&lt;br /&gt;&amp;nbsp;objCmd.Parameters.Add("@Email", txtEmail.Text)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;objConn.Open()&lt;br /&gt;&amp;nbsp;objCmd.ExecuteNonQuery()&lt;br /&gt;&amp;nbsp;objConn.Close()&lt;br /&gt;End Sub&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;For the sake of brevity, I'll assume that you have experienceinteracting with databases using ASP.NET. At first glance, everythingseems fairly straight forward in the code above, except for the use ofthe &lt;code&gt;HashPasswordForStoringInConfigFile()&lt;/code&gt; method of the &lt;code&gt;FormsAuthentication&lt;/code&gt;class. This method exists as a way to hash and store a password withinthe Web.config file. We can use this method for our own purposes, thatis, to store hashed passwords into a database.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;As you can see, the method accepts two parameters. The first isobviously the text value to use. Since we're retrieving this value fromthe password text box, we use txtPassword.Text. The second is thedigest algorithm to use. In this example, I've use SHA1, which producesa 160 bit digest. You could also use MD5, in which case the resultwould be a 128 bit digest. Generally speaking, the more bits in adigest string, the harder it is to guess an input string that willproduce it.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Now, when I add a new user, the password is hashed and the digest isstored within the Pass field in the Users table, as shown below. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="1370_06" height="102" src="http://sitepointstatic.com/graphics/06.png" width="500" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;See how simple that is? To validate a user, we simply create a login form (login.aspx) complete with two &lt;code&gt;TextBox&lt;/code&gt; controls and a &lt;code&gt;Button&lt;/code&gt; control to handle the validation. The markup would resemble the following:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;form runat="server"&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;strong&amp;gt;Authenticate:&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;Username:&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;asp:TextBox id="txtUsername" runat="server" /&amp;gt;&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;Password:&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;asp:TextBox id="txtPassword" runat="server" TextMode="Password" /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;asp:Button id="btnCheck" runat="server" Text="Check Credentials" /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;asp:Label id="lblCheck" runat="server" /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/span&gt; &lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;As a result of this markup, our Login page should look like this: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="1370_07" height="327" src="http://sitepointstatic.com/graphics/07.png" width="359" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Once you've got the interface looking the way you want it to, add the &lt;code&gt;OnClick="CheckCredentials_Click"&lt;/code&gt; attribute to the &lt;code&gt;Button&lt;/code&gt; control as follows:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;asp:Button id="btnCheck" runat="server" Text="Check Credentials" OnClick="CheckCredentials_Click" /&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Finally, we create a code declaration block within the &amp;lt;head&amp;gt; tag of our document and add the code to validate our users as follows:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;script runat="server"&amp;gt;&amp;nbsp; &lt;br /&gt;Dim objConn As New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data&amp;nbsp; &lt;br /&gt;&amp;nbsp;Source=C:InetpubwwwrootPasswordHashingDatabaseCustomers.mdb")&amp;nbsp; &lt;br /&gt;Dim objCmd As OleDbCommand&amp;nbsp; &lt;br /&gt;Dim objDR As OleDbDataReader&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Function CheckCredentials(Username As String, Password As String) As Boolean&amp;nbsp; &lt;br /&gt;&amp;nbsp;objConn.Open()&amp;nbsp; &lt;br /&gt;&amp;nbsp;objCmd = New OleDbCommand("SELECT Username, Pass FROM Users WHERE&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; Username=@givenUsername", objConn)&amp;nbsp; &lt;br /&gt;&amp;nbsp;objCmd.Parameters.Add("@givenUsername", Username)&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;objDR = objCmd.ExecuteReader()&amp;nbsp; &lt;br /&gt;&amp;nbsp;If Not objDR.Read() Then&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; Return False&amp;nbsp; &lt;br /&gt;&amp;nbsp;Else&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; Dim storedHashedPassword As String = objDR("Pass")&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; Dim givenHashedPassword As String =&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormsAuthentication.HashPasswordForStoringInConfigFile(Password,&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "SHA1")&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; Return storedHashedPassword = givenHashedPassword&amp;nbsp; &lt;br /&gt;&amp;nbsp;End If&amp;nbsp; &lt;br /&gt;End Function&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Sub CheckCredentials_Click(s As Object, e As EventArgs)&amp;nbsp; &lt;br /&gt;&amp;nbsp;If (CheckCredentials(txtUsername.Text, txtPassword.Text) = True) Then&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; lblCheck.Text = "You entered the right credentials!"&amp;nbsp; &lt;br /&gt;&amp;nbsp;Else&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; lblCheck.Text = "You entered the wrong credentials!"&amp;nbsp; &lt;br /&gt;&amp;nbsp;End If&amp;nbsp; &lt;br /&gt;End Sub&amp;nbsp; &lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Again, don't forget to add the following directives to the top of the page:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;%@ Import Namespace="System.Data.OleDb" %&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;%@ Import Namespace="System.Web.Security" %&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Now, launch &lt;code&gt;login.aspx&lt;/code&gt; within the browser and enter ausername and password. As you can see from the figure below, when I login with the right credentials, the &lt;code&gt;Label&lt;/code&gt; control displays the message "You entered the right credentials".&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="1370_08" height="345" src="http://sitepointstatic.com/graphics/08.png" width="359" /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Right away you can see the benefits to simplistic hashing. It's farmore secure than storing clear text because of the fact that it wouldbe extremely difficult for someone to guess the original password thatproduced a hashed message digest. Notice I said "extremely difficult".Because we've only performed simplistic hashing, it wouldn't beimpossible for a hacker to perform what's called a dictionary attackand exploit vulnerabilities. Again, there is a solution to this problemas well.&lt;/span&gt;&lt;br /&gt;&lt;h5&gt;&lt;span style="font-size: small;"&gt;Salting a Hash&lt;/span&gt;&lt;/h5&gt;&lt;span style="font-size: small;"&gt;So far, we've managed to solve the problem of storing clear textpasswords in our database in a relatively secure fashion.Unfortunately, this solution is secure enough only to prevent wanderingdatabase administrator eyes from seeing usernames and passwords in ourdatabase. A hacker can still perform what's called a dictionary attack.Malicious parties may make a dictionary attack by taking, for instance,100,000 passwords that they know people use frequently (e.g. citynames, sports teams, etc.), hash them, and then compare each entry inthe dictionary against each row in the database table. If the hackersfind a match, bingo! They have your password. To solve this problem,however, we need only salt the hash.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;To salt a hash, we simply come up with a random-looking string oftext, concatenate it with the password supplied by the user, then hashboth the randomly generated string and password together as one value.We then save both the hash and the salt as separate fields within theUsers table. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;In this scenario, not only would a hacker need to guess thepassword, they'd have to guess the salt as well. Adding salt to theclear text improves security: now, if a hacker tries a dictionaryattack, he must hash his 100,000 entries with the salt of every userrow. Although it's still possible, the chances of hacking successdiminish radically. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;To implement this functionality, we start by adding a new field, called &lt;code&gt;Salt&lt;/code&gt;, to our Users database table. The modified design will resemble the below.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="1370_table2" height="149" src="http://sitepointstatic.com/graphics/ASPtable2.png" width="430" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;When complete, the Datasheet will appear similar to the figure shown below.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="1370_09" height="102" src="http://sitepointstatic.com/graphics/09.png" width="500" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Now, we can modify the code within &lt;code&gt;registration.aspx&lt;/code&gt; slightly to accommodate the salt. I bolded the code additions to make them easier to distinguish:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;%@ Import Namespace="System.Data.OleDb" %&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;%@ Import Namespace="System.Web.Security" %&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;%@ Import Namespace="System.Security.Cryptography" %&amp;gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;head&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;title&amp;gt;Password Hashing&amp;lt;/title&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;script runat="server"&amp;gt;&amp;nbsp; &lt;br /&gt;Dim objConn As New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data&amp;nbsp; &lt;br /&gt;&amp;nbsp;Source=C:InetpubwwwrootPasswordHashingDatabaseCustomers.mdb")&amp;nbsp; &lt;br /&gt;Dim objCmd As OleDbCommand&amp;nbsp; &lt;br /&gt;Dim sqlCmd As String&amp;nbsp; &lt;br /&gt;Dim objRng As New RNGCryptoServiceProvider&amp;nbsp; &lt;br /&gt;Dim intSaltSize As Integer = 16&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Sub AddCredentials_Click(s As Object, e As EventArgs)&amp;nbsp; &lt;br /&gt;&amp;nbsp;sqlCmd = "INSERT INTO Users (Username, Salt, Pass, Email) VALUES&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (@Username, @Salt, @Pass, @Email)"&amp;nbsp; &lt;br /&gt;&amp;nbsp;objCmd = New OleDbCommand(sqlCmd, objConn)&amp;nbsp; &lt;br /&gt;&amp;nbsp;objCmd.Parameters.Add("@Username", txtUsername.Text)&amp;nbsp; &lt;br /&gt;&amp;nbsp;Dim objByte() As Byte = New Byte(intSaltSize) {}&amp;nbsp; &lt;br /&gt;&amp;nbsp;objRng.GetBytes(objByte)&amp;nbsp; &lt;br /&gt;&amp;nbsp;Dim strSalt As String = Convert.ToBase64String(objByte)&amp;nbsp; &lt;br /&gt;&amp;nbsp;objCmd.Parameters.Add("@Salt", strSalt)&amp;nbsp; &lt;br /&gt;&amp;nbsp;objCmd.Parameters.Add("@Pass",&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormsAuthentication.HashPasswordForStoringInConfigFile(strSalt +&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; txtPassword.Text, "SHA1"))&amp;nbsp; &lt;br /&gt;&amp;nbsp;objCmd.Parameters.Add("@Email", txtEmail.Text)&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;objConn.Open()&amp;nbsp; &lt;br /&gt;&amp;nbsp;objCmd.ExecuteNonQuery()&amp;nbsp; &lt;br /&gt;&amp;nbsp;objConn.Close()&amp;nbsp; &lt;br /&gt;End Sub&amp;nbsp; &lt;br /&gt;&amp;lt;/script&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;/head&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;body&amp;gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;lt;form runat="server"&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;strong&amp;gt;User Registration&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;Username:&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;asp:TextBox id="txtUsername" runat="server" /&amp;gt;&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;Password:&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;asp:TextBox id="txtPassword" runat="server" TextMode="Password" /&amp;gt;&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;Email:&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;asp:TextBox id="txtEmail" runat="server" /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;asp:Button id="btnAddCredentials" runat="server" Text="Add Credentials"&amp;nbsp; &lt;br /&gt;onClick="AddCredentials_Click " /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;/form&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;/body&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/span&gt; &lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Notice the use of the &lt;code&gt;RNGCryptoServiceProvider&lt;/code&gt; class. This class is used to create the salt. The &lt;code&gt;GetBytes()&lt;/code&gt; method of the &lt;code&gt;RNGCryptoServiceProvider&lt;/code&gt; class creates an array of random bytes for cryptographic purposes. Although we could have used the &lt;code&gt;Random&lt;/code&gt; class, the &lt;code&gt;RNGCryptoServiceProvider&lt;/code&gt;&lt;code&gt;Random&lt;/code&gt; class. &lt;/span&gt; class provides a result that is much more random than that of the &lt;br /&gt;&lt;span style="font-size: small;"&gt;This time, when I add a new username (zak) and password (zak), theresult is written similarly to our first example. The difference hereis that, when I add a second user (fred) with the same password (zak),the digest for both the password and salt are completely differentacross the board. This point is illustrated below.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="1370_10" height="92" src="http://sitepointstatic.com/graphics/10.png" width="500" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;To validate a user now, we simply modify the &lt;code&gt;CheckCredentials_Click()&lt;/code&gt; function within &lt;code&gt;login.aspx&lt;/code&gt; as follows:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Function CheckCredentials(Username As String, Password As String) As Boolean &lt;br /&gt; &amp;nbsp;objConn.Open() &lt;br /&gt; &amp;nbsp;objCmd = New OleDbCommand("SELECT Salt, Pass FROM Users WHERE &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;Username=@givenUsername", objConn) &lt;br /&gt; &amp;nbsp;objCmd.Parameters.Add("@givenUsername", Username) &lt;br /&gt; &lt;br /&gt; &amp;nbsp;objDR = objCmd.ExecuteReader() &lt;br /&gt; &amp;nbsp;If Not objDR.Read() Then &lt;br /&gt; &amp;nbsp; &amp;nbsp;Return False &lt;br /&gt; &amp;nbsp;Else &lt;br /&gt; &amp;nbsp; &amp;nbsp;Dim strSalt As String = objDR("Salt") &lt;br /&gt; &amp;nbsp; &amp;nbsp;Dim strStoredPassword As String = objDR("Pass") &lt;br /&gt; &amp;nbsp; &amp;nbsp;Dim strGivenPassword As String = &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;FormsAuthentication.HashPasswordForStoringInConfigFile(strSalt &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;amp; Password, "SHA1") &lt;br /&gt; &amp;nbsp; &amp;nbsp;Return strStoredPassword = strGivenPassword &amp;nbsp; &lt;br /&gt; &amp;nbsp;End If &lt;br /&gt;End Function&lt;/code&gt;&lt;/span&gt; &lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;This time, when the user logs in, the hashed password is compared tothe value of the salt and password combined. As you can see from theimage below, I've entered the correct username and password.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="1370_11" height="349" src="http://sitepointstatic.com/graphics/11.png" width="363" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h5&gt;&lt;span style="font-size: small;"&gt;Conclusion&lt;/span&gt;&lt;/h5&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Now that you know that the .NET Framework provides excellent supportfor storing passwords securely, you shouldn't ever have to store cleartext passwords within your database ever again! &lt;/span&gt;&lt;br /&gt; &lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4942427404274609914-4891903673270827625?l=programmingdiscussions.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/4891903673270827625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/passwords-security-in-your-database.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/4891903673270827625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/4891903673270827625'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/passwords-security-in-your-database.html' title='Passwords Security  in Your Database'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-2703544944687371581</id><published>2010-08-18T07:20:00.000-07:00</published><updated>2010-08-18T07:20:06.819-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips and Tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>The Total Newbie’s Guide to jQuery: Select Elements and Manipulate CSS with jQuery</title><content type='html'>&lt;span style="color: black; font-size: small;"&gt;&lt;/span&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;This article, as well as a follow-up article coming next week, are  excerpts from Chapter 2 of the new SitePoint book, &lt;i class="citetitle"&gt;jQuery: Novice  to Ninja&lt;/i&gt;, by Earle Castledine and Craig Sharkie. You can &lt;a class="ulink" href="http://www.sitepoint.com/books/jquery1/samplechapters.php" target="_top"&gt;grab the  entirety of Chapter 2, as well as Chapters 1 and 7 and the complete code  archive for the entire book for free here&lt;/a&gt;. Together, these two  articles constitute an introduction to jQuery for designers who’ve only ever  worked with CSS and HTML.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;If you’ve been wanting to learn the basics of jQuery and start adding  some dynamic interactions to your website, this is the place to start. If  you’d like to follow along with the code in this article, download the  sample, which includes all of the code examples from the book.&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="section" lang="en" style="color: black;"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=4942427404274609914" name="id2805624"&gt;&lt;/a&gt;The Scenario&lt;/span&gt;&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;“In phase two, we are going to want to harness the social and enable    Web 2.0 community-based, crowd-sourced, Ajax, um, interactions,” says our    new client. “But for now we just need some basic stuff changed on our    site.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Our client is launching a startup called StarTrackr! It uses GPS and    RFID technology to track popular celebrities’ exact physical location—then    sells that information to fans. It’s been going great guns operating out    of a friend’s local store, but now they’re taking the venture    online.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;“Can you do it? Here’s a list that needs to be live by Friday, close    of business.”&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;You survey the list. By amazing coincidence you notice that all of    the requests can be implemented using jQuery. You look at your calendar.    It’s Friday morning. Let’s get started!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The first task on the list is to add a simple JavaScript alert when    the existing site loads. This is to let visitors know that StarTrackr! is    not currently being sued for invasion of privacy (which was recently    implied in a local newspaper).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Sure, we could use plain old JavaScript to do it, but we know that    using jQuery will make our lives a lot easier—plus we can learn a new    technology as we go along! We already saw the anatomy of a jQuery    statement in Chapter 1; now let’s look at the steps required to put jQuery    into action: we wait until the page is ready, select our target, and then    change it.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;You may have probably guessed that jQuery can be more complicated    than this—but only a little! Even advanced effects will rely on this basic    formula, with multiple iterations of the last two steps, and perhaps a bit    of JavaScript know-how. For now, let’s start nice and easy.&lt;/span&gt;&lt;/div&gt;&lt;div class="section" lang="en" style="color: black;"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=4942427404274609914" name="id2805706"&gt;&lt;/a&gt;Making Sure the Page Is Ready&lt;/span&gt;&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="http://www.blogger.com/post-create.g?blogID=4942427404274609914" name="id2805713"&gt;&lt;/a&gt;&lt;a class="indexterm" href="http://www.blogger.com/post-create.g?blogID=4942427404274609914" name="id2805718"&gt;&lt;/a&gt;&lt;a class="indexterm" href="http://www.blogger.com/post-create.g?blogID=4942427404274609914" name="id2805728"&gt;&lt;/a&gt;&lt;a class="indexterm" href="http://www.blogger.com/post-create.g?blogID=4942427404274609914" name="id2805737"&gt;&lt;/a&gt;Before we can interact with HTML elements on a page, those    elements need to have been loaded: we can only change them once they’re    already there. In the old days of JavaScript, the only reliable way to do    this was to wait for the entire page (including images) to finish loading    before we ran any scripts.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Fortunately for us, jQuery has a very cool built-in event that    executes our magic as soon as possible. Because of this, our pages and    applications appear to load much faster to the end user:&lt;/span&gt;&lt;br /&gt;&lt;div class="example"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=4942427404274609914" name="id2805766"&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example&amp;nbsp;1.&amp;nbsp;&lt;code class="filename"&gt;chapter_02/01_document_ready/script.js&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class="example-contents"&gt;&lt;pre class="programlisting"&gt;&lt;span class="emphasis" style="font-size: small;"&gt;&lt;i&gt;$(document).ready(function() {&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;  alert('Welcome to StarTrackr! Now no longer under police …');&lt;br /&gt;&lt;span class="emphasis" style="font-size: small;"&gt;&lt;i&gt;});&lt;/i&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="example-break" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The important bits here (highlighted in bold) say, “When our    document is ready, run our function.” This is one of the most common    snippets of jQuery you’re likely to see. It’s usually a good idea to do a    simple alert test like this to ensure you’ve properly included the jQuery    library—and that nothing funny is going on.&lt;/span&gt;&lt;br /&gt;&lt;div class="admonition important" style="margin-left: 0.5in; margin-right: 0.5in;"&gt;&lt;div class="notetitle"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;important: &lt;/b&gt;You’ll Be Seeing $(document).ready() a      Lot!&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;Almost everything you do in jQuery will need to be done      &lt;/span&gt;&lt;span class="emphasis" style="font-size: small;"&gt;&lt;i&gt;after&lt;/i&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt; the document is ready—so we’ll be using this      action a lot. It will be referred to as the document-ready event from      now on. Every example that follows in this book, unless otherwise      stated, needs to be run from inside the document-ready event. You should      only need to declare it once per page though.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;The document-ready idiom is so common, in fact, that there’s a    shortcut version of it:&lt;/span&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$(function() { alert('Ready to do your bidding!'); });&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;If you’d like to use the shortcut method, go ahead! The expanded    version is arguably a better example of self-documenting code; it’s much    easier to see at a glance exactly what’s going on—especially if it’s    buried in a page of another developer’s JavaScript!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;At a cursory glance, the document-ready event looks much removed    from the structure we encountered back in our jQuery anatomy class, but on    closer inspection we can see that the requisite parts are all accounted    for: the selector is &lt;code class="literal"&gt;document&lt;/code&gt;; the action is    &lt;code class="literal"&gt;ready&lt;/code&gt;; and the parameter is a function that runs some    code (our &lt;code class="methodname"&gt;alert&lt;/code&gt;).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 class="title"&gt;&lt;span style="font-size: small;"&gt;Selecting: The Core of jQuery&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="index-160S511KE7S"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="index-520O283UP0B"&gt;&lt;/a&gt;Time is ticking, and deadlines wait for no one. The client    has noted that people have been having quoting incorrect celebrity IDs    from the web site. This is because the celebrities’ names are all laid out    in one big table and it’s difficult for users to line up a celebrity with    the correct reference ID. Our client tells us that he wants every other    row to be a light gray color so the users can easily find their favorite    celebrity.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;We have jQuery ready to do our bidding—it just needs us to choose a    target for it. Selecting the elements you want to modify on the page is    really the art of jQuery. One of the biggest differences between being a    novice and ninja is the amount of time it takes you to grab the elements    you want to play with!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;You might remember from our jQuery anatomy class that all of our    selectors are wrapped in the &lt;code class="function"&gt;jQuery&lt;/code&gt;&lt;a class="indexterm" href="" name="id2465941"&gt;&lt;/a&gt;&lt;/span&gt;    function:&lt;br /&gt;&lt;blockquote&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;jQuery(&lt;selectors go="" here=""&gt;)&lt;/selectors&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Or the alias:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$(&lt;selectors go="" here=""&gt;)&lt;/selectors&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;We’ll be using the shortcut alias for the remainder of the book—it’s    much more convenient. As we mentioned earlier, there’s no real reason to    use the full jQuery name unless you’re having conflict issues with other    libraries (see &lt;a class="xref" href="http://articles.sitepoint.com/article/jquery-tutorial-select-css/2#"&gt;???&lt;/a&gt;).&lt;/span&gt;&lt;br /&gt;&lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2465982"&gt;&lt;/a&gt;Simple Selecting&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="id2465989"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2465998"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2421492"&gt;&lt;/a&gt;Our task is to select alternate table rows on the      celebrity table. How do we do this? When selecting with jQuery, your      goal should be to be only as specific as required: you want to find out      the most concise selector that returns exactly what you want to change.      Let’s start by taking a look at the markup of the Celebrities table,      shown in &lt;a class="xref" href="http://articles.sitepoint.com/article/jquery-tutorial-select-css/2#fig_celebs_table" title="Figure 1. class and id attributes in the HTML page"&gt;Figure&amp;nbsp;1, “class and id attributes in the HTML page”&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;div class="figure"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="fig_celebs_table"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure&amp;nbsp;1.&amp;nbsp;&lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; and &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/id" title="Look up the id attribute in the SitePoint HTML Reference."&gt;id&lt;/a&gt;&lt;/code&gt; attributes in the HTML page&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="figure-contents"&gt;&lt;div class="mediaobject"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="class and id attributes in the HTML page" src="http://articles.sitepoint.com/articleresources/2010-03-05-jquery-intro-part-1-earle/figures/fig_selecting_celebs_table.png" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="figure-break" /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;We could start by selecting every table row element on the entire      page. To select by element type, you simply pass the element’s HTML name      as a string parameter to the &lt;code class="function"&gt;$&lt;/code&gt; function. To select      all table row elements (which are marked up with the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/tr" title="Look up the &amp;lt;tr&amp;gt; tag in the SitePoint HTML Reference."&gt;&lt;/a&gt;&lt;/code&gt; tag), you would simply write:&lt;/span&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$('tr')&lt;/span&gt;&lt;/pre&gt;&lt;div class="admonition important" style="margin-left: 0.5in; margin-right: 0.5in;"&gt;&lt;div class="notetitle"&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;important: &lt;/strong&gt;Nothing Happens!&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;If you run this command, nothing will happen on the page. This        is expected—after all, we’re just selecting elements. But there’s no        need to worry; soon enough we’ll be modifying our selections in all        sorts of weird and wonderful ways.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;Similarly, if we wanted to select every paragraph, &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/div" title="Look up the div element in the SitePoint HTML Reference."&gt;div&lt;/a&gt;&lt;/code&gt; element, &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/h1" title="Look up the h1 element in the SitePoint HTML Reference."&gt;h1&lt;/a&gt;&lt;/code&gt; heading, or &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/input" title="Look up the input element in the SitePoint HTML Reference."&gt;input&lt;/a&gt;&lt;/code&gt; box on the page, we would use these      selectors accordingly:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$('p')&lt;br /&gt;$('div')&lt;br /&gt;$('h1')&lt;br /&gt;$('input')&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;But we don’t want to change &lt;span class="emphasis"&gt;&lt;em&gt;every&lt;/em&gt;&lt;/span&gt; table row      on the celebrity page: just the rows in the table that have the      celebrity data. We need to be a bit more specific, and select first the      containing element that holds the list of celebrities. If you have a      look at the HTML and at &lt;a class="xref" href="http://articles.sitepoint.com/article/jquery-tutorial-select-css/2#fig_celebs_table" title="Figure 1. class and id attributes in the HTML page"&gt;Figure&amp;nbsp;1, “class and id attributes in the HTML page”&lt;/a&gt;, you can see      that the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/div" title="Look up the div element in the SitePoint HTML Reference."&gt;div&lt;/a&gt;&lt;/code&gt; that contains our      celebrity &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/table" title="Look up the table element in the SitePoint HTML Reference."&gt;table&lt;/a&gt;&lt;/code&gt; has an &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/id" title="Look up the id attribute in the SitePoint HTML Reference."&gt;id&lt;/a&gt;&lt;/code&gt; of &lt;code class="sgmltag-attvalue"&gt;celebs&lt;/code&gt;, while the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/table" title="Look up the table element in the SitePoint HTML Reference."&gt;table&lt;/a&gt;&lt;/code&gt; itself has a &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; of &lt;code class="sgmltag-attvalue"&gt;data&lt;/code&gt;. We could use either of these to select      the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/table" title="Look up the table element in the SitePoint HTML Reference."&gt;table&lt;/a&gt;&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;jQuery borrows the conventions from CSS for referring to &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/id" title="Look up the id attribute in the SitePoint HTML Reference."&gt;id&lt;/a&gt;&lt;/code&gt; and &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; names. To select by &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/id" title="Look up the id attribute in the SitePoint HTML Reference."&gt;id&lt;/a&gt;&lt;/code&gt;, use the hash symbol (#) &lt;a class="indexterm" href="" name="id2466070"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2466076"&gt;&lt;/a&gt;followed by the element’s &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/id" title="Look up the id attribute in the SitePoint HTML Reference."&gt;id&lt;/a&gt;&lt;/code&gt;, and pass this as a string to the jQuery      function:&lt;/span&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$('#celebs')&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="id2466095"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2466100"&gt;&lt;/a&gt;You should note that the string we pass to the jQuery      function is exactly the same format as a CSS &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/id" title="Look up the id attribute in the SitePoint HTML Reference."&gt;id&lt;/a&gt;&lt;/code&gt;&lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/id" title="Look up the id attribute in the SitePoint HTML Reference."&gt;id&lt;/a&gt;&lt;/code&gt;s should be unique, we expect this to only      return one element. jQuery now holds a reference to this element.&lt;/span&gt; selector. Because &lt;br /&gt;&lt;span style="font-size: small;"&gt;Similarly, we can use a CSS &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; selector to select by &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt;. We pass a string consisting of a      period (&lt;code class="literal"&gt;.&lt;/code&gt;) followed by the element’s &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; name to the jQuery function:&lt;/span&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$('.data')&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;Both of these statements will select the table but, as mentioned      earlier when we talked about the DOM, a &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; can be shared by multiple elements—and      jQuery will happily select as many elements as we point it to. If there      were multiple tables (or any other elements for that matter) that also      had the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; &lt;code class="sgmltag-attvalue"&gt;data&lt;/code&gt;, they’d all be selected. For that      reason, we’ll stick to using the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/id" title="Look up the id attribute in the SitePoint HTML Reference."&gt;id&lt;/a&gt;&lt;/code&gt;      for this one!&lt;/span&gt;&lt;br /&gt;&lt;div class="admonition tip" style="margin-left: 0.5in; margin-right: 0.5in;"&gt;&lt;div class="notetitle"&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;tip: &lt;/strong&gt;Can You Be More Specific?&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;Just like with CSS, we can select either        &lt;code class="literal"&gt;$('.data')&lt;/code&gt; or the more specific        &lt;code class="literal"&gt;$('table.data')&lt;/code&gt;. By specifying an element type        &lt;a class="indexterm" href="" name="id2969520"&gt;&lt;/a&gt;in addition to the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt;, the selector will only return        &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/table" title="Look up the table element in the SitePoint HTML Reference."&gt;table&lt;/a&gt;&lt;/code&gt; elements with the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; &lt;code class="sgmltag-attvalue"&gt;data&lt;/code&gt;—rather than &lt;span class="emphasis"&gt;&lt;em&gt;all&lt;/em&gt;&lt;/span&gt;        elements with the class &lt;code class="sgmltag-attvalue"&gt;data&lt;/code&gt;.        Also, like CSS, you can add parent container selectors &lt;a class="indexterm" href="" name="id2969562"&gt;&lt;/a&gt;to narrow your selection even further.&lt;a class="indexterm" href="" name="id2974233"&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2974241"&gt;&lt;/a&gt;Narrowing Down Our Selection&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="id2974248"&gt;&lt;/a&gt;We’ve selected the table successfully, though the table      itself is of no interest to us—we want &lt;span class="emphasis"&gt;&lt;em&gt;every other      row&lt;/em&gt;&lt;/span&gt;&lt;span class="emphasis"&gt;&lt;em&gt;inside&lt;/em&gt;&lt;/span&gt; the containing &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/table" title="Look up the table element in the SitePoint HTML Reference."&gt;table&lt;/a&gt;&lt;/code&gt;. To do this, we put a space between the      ancestor and the descendant:&lt;/span&gt; inside it. We’ve selected the containing element, and      from that containing element we want to pick out all the descendants      that are table rows: that is, we want to specify all table rows      &lt;br /&gt;&lt;blockquote&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$('#celebs tr')&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;You can use this construct to drill down to the elements that      you’re looking for, but for clarity’s sake try to keep your selectors as      succinct as possible.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Let’s take this idea a step further. Say we wanted to select all      &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/span" title="Look up the span element in the SitePoint HTML Reference."&gt;span&lt;/a&gt;&lt;/code&gt; elements inside of &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/p" title="Look up the p element in the SitePoint HTML Reference."&gt;p&lt;/a&gt;&lt;/code&gt; elements, which are themselves inside      &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/div" title="Look up the div element in the SitePoint HTML Reference."&gt;div&lt;/a&gt;&lt;/code&gt; elements—but only if those      &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/div" title="Look up the div element in the SitePoint HTML Reference."&gt;div&lt;/a&gt;&lt;/code&gt;s happen to have a class of      &lt;code class="sgmltag-attvalue"&gt;fancy&lt;/code&gt;. We would use the      selector:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$('div.fancy p span')&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;If you can follow this, you’re ready to select just about      anything!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2466411"&gt;&lt;/a&gt;Testing Our Selection&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="id2466418"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2466427"&gt;&lt;/a&gt;Right, back to our task at hand. It feels like we’re      getting closer, but so far we’ve just been selecting blindly with no way      of knowing if we’re on the right path. We need a way of confirming that      we’re selecting the correct elements. A simple way to achieve this is to      take advantage of the &lt;span class="property"&gt;length&lt;/span&gt; property.&lt;a class="indexterm" href="" name="id2466448"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2466454"&gt;&lt;/a&gt; &lt;span class="property"&gt;length&lt;/span&gt; returns the number of      elements currently matched by the selector. We can combine this with the      good ol’ trusty &lt;code class="function"&gt;alert&lt;/code&gt;&lt;/span&gt; statement to ensure that our      elements have been selected:&lt;br /&gt;&lt;div class="example"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2466478"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example&amp;nbsp;2.&amp;nbsp;&lt;code class="filename"&gt;chapter_02/02_selecting/script.js&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class="example-contents"&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$(document).ready(function() {&lt;br /&gt;  alert($('#celebs tr').length + ' elements!');&lt;br /&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="example-break" /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;This will alert the length of the selection—7 elements—for the      celebrity &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/table" title="Look up the table element in the SitePoint HTML Reference."&gt;table&lt;/a&gt;&lt;/code&gt;. This result might be      different from what you’d expect, as there are only six celebrities in      the table! If you have a look at the HTML, you’ll see where our problem      lies: the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/table" title="Look up the table element in the SitePoint HTML Reference."&gt;table&lt;/a&gt;&lt;/code&gt; header is also a      &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/tr" title="Look up the tr element in the SitePoint HTML Reference."&gt;tr&lt;/a&gt;&lt;/code&gt;, so there are seven rows in total.      A quick fix involves narrowing down our selector to find only table rows      that lie inside the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/tbody" title="Look up the tbody element in the SitePoint HTML Reference."&gt;tbody&lt;/a&gt;&lt;/code&gt;      element:&lt;/span&gt;&lt;br /&gt;&lt;div class="example"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2409051"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example&amp;nbsp;3.&amp;nbsp;&lt;code class="filename"&gt;chapter_02/03_narrowing_selection/script.js&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class="example-contents"&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$(document).ready(function() {&lt;br /&gt;  alert($('#celebs &lt;span class="emphasis"&gt;&lt;em&gt;tbody&lt;/em&gt;&lt;/span&gt; tr').length + ' elements!');&lt;br /&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="example-break" /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;This will alert the correct length of 6 elements—the jQuery object      is now holding our six celebrity table row elements.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If the alert shows 0, you’ll know there’s a mistake in your      selector. A good way to troubleshoot this sort of issue is to reduce      your selector to the smallest, simplest one possible.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;In our example, we could simply write      &lt;code class="literal"&gt;$('#celebs')&lt;/code&gt;, which would select just the table      element and alert a length of 1. From here you can make your selectors      more specific, and check that you’re selecting the correct number of      elements as you go.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2409103"&gt;&lt;/a&gt;Filters&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="id2409110"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2409119"&gt;&lt;/a&gt;With the knowledge that we’ve successfully selected all of      the table rows, narrowing our selection down to every other row is      simple—because jQuery has a &lt;em class="firstterm"&gt;filter&lt;/em&gt; to do it. A      filter removes certain items, and keeps only the ones we want. You’ll      acquire a feel for what can be filtered as we work through some more      examples, but for now we’ll just jump straight to the filter we need for      our zebra stripes:&lt;/span&gt;&lt;br /&gt;&lt;div class="example"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2409131"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example&amp;nbsp;4.&amp;nbsp;&lt;code class="filename"&gt;chapter_02/04_filters/script.js&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class="example-contents"&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$(document).ready(function() {&lt;br /&gt;  alert($('#celebs tbody tr&lt;span class="emphasis"&gt;&lt;em&gt;:even&lt;/em&gt;&lt;/span&gt;').length + ' elements!');&lt;br /&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="example-break" /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Filters are attached to the item you want to filter (in this case,      the table rows) and are defined by a colon, followed by the filter name.      The &lt;code class="literal"&gt;:even&lt;/code&gt; filter &lt;a class="indexterm" href="" name="id2974379"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2974384"&gt;&lt;/a&gt;used here keeps every even-indexed element in the      selection and removes the rest, which is what we want. When we alert the      selection length now, we see 3, as expected. All of our odd-numbered      rows have been filtered out of the selection. There is a wide array of      jQuery selector filters available to us: &lt;code class="literal"&gt;:odd&lt;/code&gt; (as you      might expect), &lt;code class="literal"&gt;:first&lt;/code&gt;, &lt;code class="literal"&gt;:last&lt;/code&gt;,      &lt;code class="literal"&gt;:eq()&lt;/code&gt; (for selecting, for example, the third      element), and more. We’ll look at each of these in more detail as we      need them throughout the book.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2974421"&gt;&lt;/a&gt;Selecting Multiple Elements&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="id2974428"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2974437"&gt;&lt;/a&gt;One last trick for basic selecting is the ability to      select multiple elements in a single statement. This is very useful, as      we’ll often want to apply the same action to several elements in      unrelated parts of the page. Separating the selector strings with commas      allows you to do this. For example, if we wanted to select every      paragraph, &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/div" title="Look up the div element in the SitePoint HTML Reference."&gt;div&lt;/a&gt;&lt;/code&gt; element, &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/h1" title="Look up the h1 element in the SitePoint HTML Reference."&gt;h1&lt;/a&gt;&lt;/code&gt; heading, and &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/input" title="Look up the input element in the SitePoint HTML Reference."&gt;input&lt;/a&gt;&lt;/code&gt; box on the page, we’d use this      selector:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$('p,div,h1,input')&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Learning how to use all these different selectors together to      access exactly the page elements you want is a big part of mastering      jQuery. It’s also one of the most satisfying parts of using jQuery,      since you can pack some fairly complex selection logic into a single      short line of code!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2432713"&gt;&lt;/a&gt;Becoming a Good Selector&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;Selecting may seem quite easy and, up to a point, it is. But what      we’ve covered so far has only just scratched the surface of selecting.      In most cases the basics are all you’ll need: if you’re simply trying to      target an element or a bunch of related elements, the element name,      &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/id" title="Look up the id attribute in the SitePoint HTML Reference."&gt;id&lt;/a&gt;&lt;/code&gt;, and &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; are the most efficient and easiest      ways to achieve this.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;When moving around the DOM from a given element, the situation      becomes a little trickier. jQuery provides a myriad of selectors and      actions for traversing the DOM.      &lt;em class="firstterm"&gt;Traversing&lt;/em&gt;&lt;a class="indexterm" href="" name="id2432756"&gt;&lt;/a&gt; means traveling up and down the page hierarchy, through      parent and child elements. You can add and remove elements as you go,      applying different actions at each step—which lets you perform some      mind-bogglingly complex actions in a single jQuery statement!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If you’re a wiz at CSS, you’ll already be familiar with a lot of      the statements; they’re mostly borrowed directly from the CSS      specification. But there are probably a few that you’re unfamiliar with,      especially if you’ve yet to spend much time learning CSS3 selectors. Of      course, we’ll be covering and learning advanced selection techniques as      we implement them in our examples and demos. For this reason, any time      you want to find out more about all the jQuery selectors available, you      can just head over to the &lt;a class="ulink" href="http://api.jquery.com/category/selectors/" target="_top"&gt;online      documentation&lt;/a&gt; and browse away!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 class="title"&gt;&lt;span style="font-size: small;"&gt;Decorating: CSS with jQuery&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="index-682O082QK2S"&gt;&lt;/a&gt;Selecting elements in jQuery is the hard part. Everything    else is both easy and fun. After we have selected our targets, we are able    to manipulate them to build effects or interfaces. In this section we will    cover a series of jQuery actions relating to CSS: adding and removing    styles, classes, and more. The actions we execute will be applied    individually to every element we’ve selected, letting us bend the page to    our will!&lt;/span&gt;&lt;br /&gt;&lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2939166"&gt;&lt;/a&gt;Reading CSS Properties&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="index-717V552GE0M"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="index-265T782TE0W"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="index-564E667JK0E"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2939214"&gt;&lt;/a&gt;Before we try changing CSS properties, let’s look first      into how we can simply access them. jQuery lets us do this with the      &lt;code class="function"&gt;css&lt;/code&gt; function. Try this:&lt;/span&gt;&lt;br /&gt;&lt;div class="example"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2939231"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example&amp;nbsp;5.&amp;nbsp;&lt;code class="filename"&gt;chapter_02/05_reading_css_properties/script.js&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class="example-contents"&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$(document).ready(function() {&lt;br /&gt;  var fontSize = $('#celebs tbody tr:first').&lt;span class="emphasis"&gt;&lt;em&gt;css('font-size')&lt;/em&gt;&lt;/span&gt;;&lt;br /&gt;  alert(fontSize);&lt;br /&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="example-break" /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;This code will alert the font size of the first element matched by      the selector (as you’ve likely guessed, the &lt;code class="literal"&gt;:first&lt;/code&gt;      filter will return the first element among those matched by the      selector).&lt;/span&gt;&lt;br /&gt;&lt;div class="admonition tip" style="margin-left: 0.5in; margin-right: 0.5in;"&gt;&lt;div class="notetitle"&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;tip: &lt;/strong&gt;CSS Properties of Multiple Elements&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="id2939269"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2939279"&gt;&lt;/a&gt;You &lt;span class="emphasis"&gt;&lt;em&gt;can&lt;/em&gt;&lt;/span&gt; ask for a CSS property        after selecting multiple elements, but this is almost always a bad        idea: a function can only return a single result, so you’ll still only        obtain the property for the first matched element.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;The nifty aspect about retrieving CSS properties with this method      is that jQuery gives you the element’s &lt;span class="emphasis"&gt;&lt;em&gt;calculated      &lt;/em&gt;&lt;/span&gt;style.&lt;a class="indexterm" href="" name="id2939312"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2939318"&gt;&lt;/a&gt; This means that you’ll receive the value that’s been      rendered in the user’s browser, rather than the value entered in the CSS      definition. So, if you gave a &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/div" title="Look up the div element in the SitePoint HTML Reference."&gt;div&lt;/a&gt;&lt;/code&gt; a      height of, say, 200 pixels in the CSS file, but the content inside it      pushed the height over 200 pixels, jQuery would provide you with the      actual height of the element, rather than the 200 pixels you’d      specified.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;We’ll see why that’s really important when we come to implement      some funky tricks a bit later.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2939354"&gt;&lt;/a&gt;Setting CSS Properties&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;So far we’ve yet to see jQuery actually &lt;span class="emphasis"&gt;&lt;em&gt;do&lt;/em&gt;&lt;/span&gt;      anything, and it’s high time to remedy that. We know the page is ready      (since we popped up an alert), and we’re fairly sure we’ve selected the      elements we’re interested in. Let’s check that we really have:&lt;/span&gt;&lt;br /&gt;&lt;div class="example"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2939376"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example&amp;nbsp;6.&amp;nbsp;&lt;code class="filename"&gt;chapter_02/06_zebra_striping/script.js&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class="example-contents"&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$(document).ready(function() {&lt;br /&gt;  $('#celebs tbody tr:even').&lt;span class="emphasis"&gt;&lt;em&gt;css('background-color','#dddddd')&lt;/em&gt;&lt;/span&gt;;&lt;br /&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="example-break" /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;You probably saw that coming! This is the same      &lt;code class="function"&gt;css&lt;/code&gt; function we used to read a CSS property, but      now it’s being passed an extra parameter: the value we wish to set for      that property. We’ve used the action to set the      &lt;span class="property"&gt;background-color&lt;/span&gt; to the value      &lt;code class="literal"&gt;#dddddd&lt;/code&gt; (a light gray). Open the file from the code      archive in your browser and test that it’s working correctly. You can      see the result in &lt;a class="xref" href="http://articles.sitepoint.com/article/jquery-tutorial-select-css/3#fig_zebra_striping" title="Figure 2. Zebra striping implemented with jQuery"&gt;Figure&amp;nbsp;2, “Zebra striping implemented with jQuery”&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;div class="figure"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="fig_zebra_striping"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure&amp;nbsp;2.&amp;nbsp;Zebra striping implemented with jQuery&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="figure-contents"&gt;&lt;div class="mediaobject"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Zebra striping implemented with jQuery" src="http://articles.sitepoint.com/articleresources/2010-03-05-jquery-intro-part-1-earle/figures/fig_selecting_zebra_striping.png" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="figure-break" /&gt;&lt;/span&gt;&lt;div class="admonition important" style="margin-left: 0.5in; margin-right: 0.5in;"&gt;&lt;div class="notetitle"&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;important: &lt;/strong&gt;Were You Ready?&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="id2939453"&gt;&lt;/a&gt;As mentioned previously, this command must be issued        from within our document-ready function. If we run the command before        the DOM is ready, the selector will go looking for the        &lt;code class="literal"&gt;#celebs&lt;/code&gt; element, but will find nothing that        matches. At this point it will give up; it won’t even look for the        &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/tr" title="Look up the tr element in the SitePoint HTML Reference."&gt;tr&lt;/a&gt;&lt;/code&gt; elements, let alone change the        background style.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;This is true for all of the examples that follow, so remember to        wrap your code in the document-ready function.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;It’s looking good! But perhaps we should add a little extra to      it—after all, more is more! What about a shade lighter font color to      really define our stripes? There are a few ways we could add a second      CSS property. The simplest way is to repeat the entire jQuery statement      with our new values:&lt;/span&gt;&lt;br /&gt;&lt;div class="example"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2939498"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example&amp;nbsp;7.&amp;nbsp;&lt;code class="filename"&gt;chapter_02/07_multiple_properties_1/script.js&lt;/code&gt;        (excerpt)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class="example-contents"&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$('#celebs tbody tr:even').css('background-color','#dddddd');&lt;br /&gt;$('#celebs tbody tr:even').css('color', '#666666');&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="example-break" /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;These lines are executed one after the other. Though the end      result is correct, it will become quite messy and inefficient if we have      to change a whole slew of properties. Thankfully, jQuery provides us      with a nice way to set multiple properties at the same time, using an      &lt;em class="firstterm"&gt;object literal&lt;/em&gt;.&lt;a class="indexterm" href="" name="id2939526"&gt;&lt;/a&gt; Object literals are a JavaScript concept beyond the scope      of this book, but for our purposes, all you need to know is that they      provide an easy way of grouping together key/value pairs. For CSS,      object literals allow us to match up our CSS properties (the keys) with      the matching CSS values (the values) in a neat package:&lt;/span&gt;&lt;br /&gt;&lt;div class="example"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2939540"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example&amp;nbsp;8.&amp;nbsp;&lt;code class="filename"&gt;chapter_02/08_multiple_properties_2/script.js&lt;/code&gt;        (excerpt)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class="example-contents"&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$('#celebs tbody tr:even').css( &lt;br /&gt;  &lt;span class="emphasis"&gt;&lt;em&gt;{'background-color': '#dddddd', 'color': '#666666'}&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="example-break" /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;The object literal is wrapped in curly braces, with each key      separated from its corresponding value by a colon, and each key/value      pair separated by a comma. It’s passed as a single parameter to the      &lt;code class="function"&gt;css&lt;/code&gt; function. Using this method you can specify as      many key/value pairs as you like—just separate them with commas. It’s a      good idea to lay out your key/value pairs in a readable manner so you      can easily see what’s going on when you come back to your code later.      This is especially helpful if you need to set a larger number of      properties. As an example:&lt;/span&gt;&lt;br /&gt;&lt;div class="example"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2939587"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example&amp;nbsp;9.&amp;nbsp;&lt;code class="filename"&gt;chapter_02/09_multiple_properties_3/script.js&lt;/code&gt;        (excerpt)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class="example-contents"&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$('#celebs tbody tr:even').css({&lt;br /&gt;  'background-color': '#dddddd', &lt;br /&gt;  'color': '#666666',&lt;br /&gt;  'font-size': '11pt',&lt;br /&gt;  'line-height': '2.5em' &lt;br /&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="example-break" /&gt;&lt;/span&gt;&lt;div class="admonition note" style="margin-left: 0.5in; margin-right: 0.5in;"&gt;&lt;div class="notetitle"&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;note: &lt;/strong&gt;To Quote or Not to Quote&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="id2939612"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2939618"&gt;&lt;/a&gt;In general, when dealing with JavaScript        objects,&lt;a class="indexterm" href="" name="id2939625"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2939631"&gt;&lt;/a&gt; it’s unnecessary for the keys to be in quotes. However,        for jQuery to work properly, any key that contains a hyphen (as our        &lt;span class="property"&gt;background-color&lt;/span&gt; and        &lt;span class="property"&gt;font-size&lt;/span&gt; examples do) must be placed in quotes,        or written in camel case (&lt;code class="literal"&gt;like        backgroundColor&lt;/code&gt;).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Additionally, any key that’s already a keyword &lt;a class="indexterm" href="" name="id2939664"&gt;&lt;/a&gt;in the JavaScript language (such as        &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/css/float" title="Look up the float property in the SitePoint CSS Reference."&gt;float&lt;/a&gt;&lt;/code&gt; and &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt;) must also be        written in quotes.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;It can be confusing trying to remember which keys need to be        quoted and which don’t, so it’s to be recommended that you just put        all object keys in quotes each time.&lt;a class="indexterm" href="" name="id2939690"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2939696"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2939701"&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2939710"&gt;&lt;/a&gt;Classes&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="id2939717"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2939726"&gt;&lt;/a&gt;Excellent! We’ve already struck two tasks off the client’s      list, and we have some funky jQuery happening. But if you stop and have      a look at our last solution, you might notice something a little fishy.      If you were to inspect the zebra-striped rows in a development tool such      as Firebug, you’d notice that the CSS properties have been added to the      paragraphs &lt;span class="emphasis"&gt;&lt;em&gt;inline&lt;/em&gt;&lt;/span&gt;, as illustrated in &lt;a class="xref" href="http://articles.sitepoint.com/article/jquery-tutorial-select-css/3#fig_inline_styles_firebug" title="Figure 3. Inline styles viewed with Firebug"&gt;Figure&amp;nbsp;3, “Inline styles viewed with Firebug”&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;div class="figure"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="fig_inline_styles_firebug"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure&amp;nbsp;3.&amp;nbsp;Inline styles viewed with Firebug&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="figure-contents"&gt;&lt;div class="mediaobject"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Inline styles viewed with Firebug" src="http://articles.sitepoint.com/articleresources/2010-03-05-jquery-intro-part-1-earle/figures/fig_selecting_inline_styles_firebug.png" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="figure-break" /&gt;&lt;/span&gt;&lt;div class="admonition tip" style="margin-left: 0.5in; margin-right: 0.5in;"&gt;&lt;div class="notetitle"&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;tip: &lt;/strong&gt;Firebug&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;Firebug &lt;a class="indexterm" href="" name="id2939785"&gt;&lt;/a&gt;is a particularly useful tool for examining the DOM        &lt;a class="indexterm" href="" name="id2939793"&gt;&lt;/a&gt;in your browser, as well as monitoring and editing CSS,        HTML, and JavaScript (including jQuery). A debugger’s Swiss Army knife        for the Web, it will save you hours by helping you see exactly what        your browser thinks is going on. It’s available as a Mozilla Firefox        extension, or as a stand-alone JavaScript file that you can include in        your projects if you develop using another browser.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;Inline styles are a big no-no in HTML/CSS best practice, right?      That’s quite true, and this also applies in jQuery: to keep your code      clear and maintainable, it makes more sense for all the styling      information to be in the same place, in your CSS files. Then, as we’ll      soon see, you can simply toggle those styles by attaching or removing      &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; attributes to your HTML      tags.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;There are times when it &lt;span class="emphasis"&gt;&lt;em&gt;is&lt;/em&gt;&lt;/span&gt; a good idea to use      the &lt;code class="methodname"&gt;css&lt;/code&gt; jQuery method in the way we’ve just      seen. The most common application is when quickly debugging code: if you      just want to outline an element in red to make sure you’ve selected it      correctly, switching to your CSS file to add a new rule seems like a      waste of time.&lt;/span&gt;&lt;br /&gt;&lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h4 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2939863"&gt;&lt;/a&gt;Adding and Removing Classes&lt;/span&gt;&lt;/h4&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;a class="indexterm" href="" name="id2939870"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2939879"&gt;&lt;/a&gt;If we need to remove the CSS from inline style rules,        where should we put it? In a separate style sheet, of course! We can        put the styles we want in a rule in our CSS that’s targeted to a given        &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt;, and use jQuery to add or        remove that class from targeted elements in the HTML. Perhaps        unsurprisingly, jQuery provides some handy methods for manipulating        the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; attributes of DOM        elements. We’ll use the most common of these,        &lt;code class="function"&gt;addClass&lt;/code&gt;&lt;a class="indexterm" href="" name="id2939916"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2939922"&gt;&lt;/a&gt;, to move our zebra stripe styles into the CSS file        where they belong.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The &lt;code class="function"&gt;addClass&lt;/code&gt; function accepts a string        containing a &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; name as a        parameter. You can also add multiple &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt;es at the same time by separating the        &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; names with a space, just as        you do when writing HTML:&lt;/span&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$('div').addClass('class_name');&lt;br /&gt;$('div').addClass('class_name1 class_name2 class_name3');&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;We only want to add one &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/class" title="Look up the class attribute in the SitePoint HTML Reference."&gt;class&lt;/a&gt;&lt;/code&gt; name, though, which we’ll call        &lt;code class="sgmltag-attvalue"&gt;zebra&lt;/code&gt;. First, we’ll add the rule        to a new CSS file (including it with a &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/link" title="Look up the link element in the SitePoint HTML Reference."&gt;link&lt;/a&gt;&lt;/code&gt; tag in our HTML page):&lt;/span&gt;&lt;br /&gt;&lt;div class="example"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2939994"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example&amp;nbsp;10.&amp;nbsp;&lt;code class="filename"&gt;chapter_02/10_adding_classes/zebra.css&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="example-contents"&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;.zebra { &lt;br /&gt;  background-color: #dddddd;&lt;br /&gt;  color: #666666;&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="example-break" /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Then, back in our JavaScript file, we’ll modify the selector to        use jQuery’s &lt;code class="function"&gt;addClass&lt;/code&gt; method rather than        &lt;code class="function"&gt;css&lt;/code&gt;:&lt;/span&gt;&lt;br /&gt;&lt;div class="example"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2940022"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example&amp;nbsp;11.&amp;nbsp;&lt;code class="filename"&gt;chapter_02/10_adding_classes/script.js&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="example-contents"&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$('#celebs tr:even').addClass('zebra');&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="example-break" /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;The result is exactly the same, but now when we inspect the        table in Firebug, we’ll see that the inline styles are gone—replaced        by our new class definition. This is shown in &lt;a class="xref" href="http://articles.sitepoint.com/article/jquery-tutorial-select-css/3#fig_classes_firebug" title="Figure 4. Adding classes to table rows"&gt;Figure&amp;nbsp;4, “Adding classes to table rows”&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;div class="figure"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="fig_classes_firebug"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure&amp;nbsp;4.&amp;nbsp;Adding classes to table rows&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="figure-contents"&gt;&lt;div class="mediaobject"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Adding classes to table rows" src="http://articles.sitepoint.com/articleresources/2010-03-05-jquery-intro-part-1-earle/figures/fig_selecting_classes_firebug.png" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br class="figure-break" /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;That’s much better. Now, if we want to change the appearance of        the zebra stripes in the future, we can simply modify the CSS file;        this will save us hunting through our jQuery code (potentially in        multiple locations) to change the values.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;There’ll also be times when we want to remove class names from        elements (we’ll see an example of when this is necessary very soon).        The action to remove a class is conveniently known as        &lt;code class="methodname"&gt;removeClass&lt;/code&gt;&lt;a class="indexterm" href="" name="id2940096"&gt;&lt;/a&gt;&lt;a class="indexterm" href="" name="id2940102"&gt;&lt;/a&gt;. This function is used in exactly the same way as        &lt;code class="methodname"&gt;addClass&lt;/code&gt;; we just pass the (un)desired class        name as a parameter:&lt;/span&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;$('#celebs tr.zebra').removeClass('zebra');&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;It’s also possible to manipulate the &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/core-attributes/id" title="Look up the id attribute in the SitePoint HTML Reference."&gt;id&lt;/a&gt;&lt;/code&gt; attribute, or any other attribute for        that matter, using jQuery’s &lt;code class="methodname"&gt;attr&lt;/code&gt;&lt;a class="indexterm" href="" name="id2940141"&gt;&lt;/a&gt;&lt;/span&gt; method.        We’ll cover this method in more detail later in the book.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="id2940151"&gt;&lt;/a&gt;What’s Next?&lt;/span&gt;&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;Next week we’ll bring you another introductory jQuery article. We’ll    be looking at modifying the DOM itself using jQuery: adding, removing, and    changing elements. We’ll also learn some of the basics of jQuery animation    and the theory behind the concept of progressive enhancement.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If you can’t wait till next week, you can read the full contents of    both articles, as well as over 100 more pages of jQuery content, by &lt;a class="ulink" href="http://www.sitepoint.com/books/jquery1/samplechapters.php" target="_top"&gt;downloading    the sample PDF of &lt;em class="citetitle"&gt;jQuery: Novice to Ninja&lt;/em&gt;&lt;/a&gt;.    It also includes the full code archive for the entire book.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4942427404274609914-2703544944687371581?l=programmingdiscussions.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/2703544944687371581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/total-newbies-guide-to-jquery-select.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/2703544944687371581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/2703544944687371581'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/total-newbies-guide-to-jquery-select.html' title='The Total Newbie’s Guide to jQuery: Select Elements and Manipulate CSS with jQuery'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-1056274562428055698</id><published>2010-08-18T07:08:00.000-07:00</published><updated>2010-08-18T07:08:34.033-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips and Tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Speed Up Your Site! 8 ASP.NET Performance Tips (part 6)</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Lack of Indexes&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The ability to index data is one of the key benefits of storinginformation in a database. Imagine for a moment that you need to lookup a name in a telephone book. You take advantage of the fact that thelast names are sorted in alphabetic order -- it would take forever tofind a name if the entries were listed in random order. Databases takeadvantage of the way your information is sorted for the same reason.The default sort order in a table is called a clustered index.&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Of course, you may want to search for your information in severaldifferent ways. To continue with the phone book example, you may wantto look up businesses by zip code, business type, or name. The commonapproach to implementing this capability in a database is to order thedata based on the most common search order, then place additionalindexes to facilitate other search criteria. The data is sorted by theclustered index, but the database stores additional information to helpit look up rows using other criteria. This additional lookupinformation is called a non-clustered index.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;One of the most common reasons for slow queries is that the databaseis performing a table scan, which occurs when the database lacks anappropriate index to use to look up data. Asking your database toperform a table scan is equivalent to asking someone to look up aperson in a phone book that lists entries in random order. Tosummarize, proper indexes are a necessity for database performance.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Incorrect Indexes&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If indexes are good, more indexes are great, right?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Actually, no. There's a cost incurred when you add indexes to adatabase. Each time a row is added or updated, all the indexes need tobe updated, and too many indexes can slow your database down. It'simportant to select a limited number of indexes that'll give you quicklookups without slowing down your updates. We'll be talking about sometools to help you with this task later in this chapter.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Poorly Written Queries&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;It's easy to land yourself in trouble if you don't really understandSQL. SQL is not just another programming language -- it's adeclarative, set-based query language. A lot of your standardprogramming tricks don't apply here.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;We'll talk about troubleshooting query plans and poorly writtenqueries in the section called "How can I troubleshoot a slow query?"later in this chapter.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Deadlocks&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Databases use locks to prevent your data from being messed up by conflicting updates.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;For example, we can't apply a 10% discount to all of our productprices and delete all products that are priced over $100 at the sametime -- we need to process one product at a time. Locks allow us to dothis. The SQL Server engine is reasonably clever about how it usesdatabase locks -- it'll often lock portions of a table (called pages)and, sometimes, individual rows.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Yet there's always the potential for two transactions to arrive at astate where both are waiting for the freeing of a lock that'ssimultaneously held by the other transaction. This situation is calleda deadlock.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;For example, consider two queries that use the Products and Orders tables. The first query, which we'll call &lt;code&gt;ProductsThenOrders&lt;/code&gt;, uses the Products table first; the second query, &lt;code&gt;OrdersThenProducts&lt;/code&gt;, uses the Orders table first.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;ProductsThenOrders&lt;/code&gt; locks the Products table and begins to make updates. Meanwhile, &lt;code&gt;OrdersThenProducts&lt;/code&gt; locks the Orders table and performs its updates. No problems so far.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Now &lt;code&gt;ProductsThenOrders&lt;/code&gt; is ready to update the Orders table, but it can't -- the other query has it locked. Likewise, &lt;code&gt;OrdersThenProducts&lt;/code&gt; wants to update the Products table, but is also blocked for the same reason. We're deadlocked!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;When SQL Server eventually detects a deadlock, it will pick onequery as the "deadlock victim" and kill it, while the survivors arereleased. The result of this conflict resolution process is that one ofthe queries will return with an error that it was unable to complete --not the most efficient use of resources.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Deadlocks don't happen too frequently -- unless your applicationexecutes a lot of transactions. It's important to be aware of them andto fix deadlock conditions quickly. Deadlocks can be avoided by:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;minimizing transaction length&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;accessing tables in the same order in competing queries&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;In the above example, accessing the Products table first in both queries would have prevented the deadlock.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;The NOLOCK Query Optimizer Hint&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Even if you're not encountering deadlocks, locks have a definiteperformance impact. Locks restrict access to your data in such a waythat only one query can use it at any time -- an approach that's safebut slow.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;In some cases, you mightn't need to lock your rows. You mightquery historical data that isn't subject to change, or it mightn't becrucial that the data returned in the query is perfectly up to date --comments on a weblog might fall into this category.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;In these cases, you can use the &lt;code&gt;NOLOCK&lt;/code&gt; hint to tellSQL Server you want to read directly from the table without honoringany locks. Note that this only makes sense for &lt;code&gt;SELECT&lt;/code&gt;statements -- any data modification will always require a lock. Bestpractices avoid using table hints -- parameters that override thedefault behavior of a query -- when possible. However, this one isrelatively innocuous as long as you understand that you may be viewinguncommitted changes. Just don't use it when displaying criticalinformation, such as financial data.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Here's how you'd use it:&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;SELECT COUNT(1) FROM Orders WITH (NOLOCK)&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Since this statement places no locks on the data that it'sreading, other queries won't be forced to wait for the query tocomplete before they can use the &lt;code&gt;Orders&lt;/code&gt; table.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;You can read more about deadlocks in the MSDN article, &lt;a class="sublink" href="http://msdn2.microsoft.com/en-us/library/ms188246.aspx"&gt;"Analyzing Deadlocks with SQL Server Profiler."&lt;/a&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Hardware Issues&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;As with any software application, SQL Server performs at its optimum when it's running on sufficiently powerful hardware.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If upgrading your server is an option, the first thing you shouldlook at is memory, as SQL Server makes heavy use of available memory tocache frequently used data. And the cost of new memory is relativelycheap -- often cheaper than the time required to tune an underpowereddatabase server. Adding memory can compensate for slow CPU or driveaccess, since caching can significantly reduce the work that SQL Serverneeds to complete.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;After you've exhausted your memory upgrade options, the next mostcommon hardware issue is a disk read/write bottleneck. Databasehardware configuration is a large topic and falls well beyond the scopeof an ASP.NET book, but a great first step is to put your log files ona drive that's as fast possible, and is separate from the operatingsystem and database files.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Using a production database server for other tasks -- especially IIS-- is a bad idea. It's often necessary in a development environment,but it will have a performance impact in production.&lt;/span&gt;&lt;br /&gt;&lt;h5&gt;&lt;span style="font-size: small;"&gt;How can I troubleshoot a slow query?&lt;/span&gt;&lt;/h5&gt;&lt;span style="font-size: small;"&gt;Optimizing database performance is a complex topic that's thesubject of numerous very thick books, so I'm not going to pretend thatwe can make you an expert in query optimization in a few short pages.Instead, I'll focus on some of my favorite "developer to developer"tips to point you in the right direction.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Solution&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Before you begin to look for a solution, it's important to verifythe problem at hand. You can then begin the process of elimination.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Verifying the Problem&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;First, verify that the SQL you think is being executed is actuallybeing executed. The best way to confirm this is to duplicate theproblem: run the query in SQL Server Management Studio (SSMS).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If you have any doubt about which SQL commands are being executed,run the SQL Profiler for confirmation (see the section called "How do Ispeed up my database queries?" earlier in this chapter for details onusing the SQL Profiler). This tool is especially helpful when used withapplications that make use of declarative data binding, or withframeworks that handle data access for you.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Clearing the SQL Cache when Testing in SSMS&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;SQL Server uses an intelligent caching system to enhanceperformance. If you run frequent queries against a certain table, SQLServer will recognize that fact and store the source (and result data)of those queries in its internal cache. By doing so, future matchingqueries won't need to look up this data until the next time it changes.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;This functionality, while useful, can be confusing if youconduct your tests by running your queries from SSMS -- some of yourquery information may be cached, so your queries will run faster thesecond time you execute them.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;To ensure that you make valid comparisons that don't returncached information, clear your cache each time you run the query. Thefollowing script does just this -- first it drops caches, then it callsa &lt;code&gt;CHECKPOINT&lt;/code&gt; to flush pending changes from memory to disk, and finally it clears any data that has been stored in memory:&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;DBCC FREESESSIONCACHE &amp;nbsp; &amp;nbsp; &lt;br /&gt;DBCC FREEPROCCACHE &amp;nbsp; &amp;nbsp; &lt;br /&gt;DBCC FREESYSTEMCACHE('ALL') &amp;nbsp; &amp;nbsp; &lt;br /&gt;CHECKPOINT &amp;nbsp; &amp;nbsp; &lt;br /&gt;DBCC DROPCLEANBUFFERS &amp;nbsp; &amp;nbsp; &lt;br /&gt;GO -- Your query goes here&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Once you're able to duplicate the problem in SSMS, you can dig into the query itself.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Checking for Large Result Sets&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If your query returns more rows than you expected it to, there are two main problems to look at -- cross joins and incomplete &lt;code&gt;WHERE&lt;/code&gt; clauses.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;A cross join occurs when you fail to specify a join correctly. Here's an example:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;SELECT * FROM Customers, Orders, [Order Details], Products&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;In the above query, we haven't specified how the tables should bejoined, so the SQL interpreter will attempt to return every possiblecombination. That means that our result set will include every Ordercombined with every Customer (not just the Orders that each Customermade). So this query returns about 12.5 billion rows (91 Customers ×830 Orders × 2155 Order Details × 77 Products) -- that's roughly 7.5GBof data.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;That return is obviously way out of line, considering there are only830 orders in the system. Of course, this is a slightly exaggeratedexample for demonstration purposes, but it's easy to see how a singlecross join can waste a lot of database resources (CPU and memory) anddelay network traffic between the database and web server.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;An incomplete &lt;code&gt;WHERE&lt;/code&gt; clause isn't quite as bad, but can still return more rows than you need. The following query returns 2155 rows:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;SELECT * FROM [Order Details]&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;This one, on the other hand, returns three rows:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;SELECT * FROM [Order Details] WHERE OrderID = 10252&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;ADO.NET makes it really easy to filter your data on the server, butunfortunately this feature is a double-edged sword -- it can maskproblems with a large result set. That's why it's important to verifythe problem with real, systematic measurement rather than just assumethat a &lt;code&gt;Gridview&lt;/code&gt; displaying only a handful of rows couldn't possibly be the source of the problem.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Checking the Query Plan&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If your query is indeed returning the correct number of rows, butstill takes too long, the next step is to look at the query plan, whichis a visual representation of the steps that your query takes to returnits result set.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;You can view the estimated query execution plan in SSMS if you firstselect the query, then select Display Estimated Execution Plan from theQuery menu (tor use the toolbar button or the keyboard shortcut --Ctrl-L). You'll also have the option to include the actual queryexecution plan (also available from the Query menu, the toolbar, andvia the keyboard shortcut Ctrl-M). The actual plan is a little moreaccurate than the estimated one, but requires that you actually executethe query and wait for it to complete.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Let's look at the actual execution plan for the &lt;code&gt;uspGetBillOfMaterials&lt;/code&gt;stored procedure in the AdventureWorks sample database that comes withSQL Server. Enter the following text in the SSMS query window, thenturn on the Include Actual Execution Plan option and execute the query:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;EXEC dbo.uspGetBillOfMaterials 800, '2001-01-09'&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Figure 15.16 shows the result.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.16. The execution plan for the uspGetBillOfMaterials stored procedure" height="129" src="http://i2.sitepoint.com/graphics/performance_query-plan-complete.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Figure 15.17 shows a close-up of the bottom right-hand corner of our plan.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.17. A close-up of the execution plan for the uspGetBillOfMaterials stored procedure" height="263" src="http://i2.sitepoint.com/graphics/performance_query-plan-zoom.png" width="398" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;You'll need to look for a few important things when you're analyzing an execution plan:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Thick lines&lt;/b&gt; in the execution planindicate large amounts of data being passed between steps. I was oncetroubleshooting an extremely slow summary report query that returnedonly a dozen rows. When I looked at the execution plan, I saw that someof the lines between steps were an inch thick -- this indicatedbillions of rows being passed between those steps, which were thenfiltered down to the final dozen rows displayed in the browser. Thesolution was to modify the query to ensure that the data was filteredas early as possible.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Large percentage numbers&lt;/b&gt; indicate the most expensive operations -- the value of 44% in Figure 15.17 is one example of this.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;If one of the steps on your plan contains the word "scan"&lt;/b&gt;(or, in particular, "Table Scan"), this is an indication that the SQLengine had to step through every row in a table to find the data thatit was after. This is usually associated with a high Cost value. Thereare occasions when a table scan is acceptable -- such as when you'reperforming a lookup against a very small table -- but in generalthey're best avoided.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;If you see a problem, you can troubleshoot it in SSMS: modify thequery and view the effect of your change on the execution plan.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If it looks as though your issue may be the result of an indexingproblem, the best solution is to right-click the query and selectAnalyze Query in Database Engine Tuning Advisor. The DTA will launchwith all the necessary options preselected, so all you need to do isclick the Start Analysis button. Figure 15.18 shows the results of onesuch analysis.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.18. Analyzing a query in the DTA" height="254" src="http://i2.sitepoint.com/graphics/performance_dta-recommendations.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;As you can see, the DTA has recommended two index changes and onestatistical change that should improve this query's performance by 31%.Of course, you'll need to consider the effect that these additionalindexes will have on updates to the affected tables. In this case,since the tables in this particular example are probably updated ratherinfrequently, I think that these new indexes make sense. You can applyor save these changes via the Actions menu.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Eliminating Cursors&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;You'll want to look for and eliminate any unnecessary cursors -- pointers for traversing records in the database.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Cursors let you write in a procedural style, applying logic to asingle table row at a time. While it can be tempting to drop back tothose skills that are most familiar to you in sticky situations,cursor-based queries will prevent the database engine from takingadvantage of the index optimizations and set-based operations for whichit was designed.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Resist the urge and get rid of your cursors!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;I've written a lot of SQL in ten years of professional programming,and I've yet to encounter a case where cursors were required. Irecently rewrote someone else's complex query from using cursors tostandard SQL, and the time for the resulting operation dropped fromeight hours to just over one minute.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Think about how to describe the problem as a bulk operation. Forexample, suppose your mode of thinking about a query was something likethis:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;"I'll loop through the orders table, get the product ID, then grab the price, and compare it to ..."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Instead, consider rephrasing it to something like this:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;"I want to find all orders for products that have prices greater than a certain amount ..."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Remember that you can use common table expressions (CTEs), tablevariables, and temporary tables if you're stuck. While these fallbackoptions aren't as efficient as performing a bulk operation, they atleast allow the query engine to make use of indexes.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;The Problem with &lt;code&gt;SELECT *&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Most developers will tell you that &lt;code&gt;SELECT *&lt;/code&gt; queries are bad, but for the wrong reason.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The commonly understood reason is that &lt;code&gt;SELECT *&lt;/code&gt; iswasteful because it returns columns that you don't need. While this istrue, most normalized tables don't contain that many columns, so theseextra rows usually won't have a noticeable impact on your site'sperformance unless they number in the millions.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Often, the bigger problem with &lt;code&gt;SELECT *&lt;/code&gt; is the effectit will have on the execution plan. While SQL Server primarily usesindexes to look up your data, if the index happens to contain all ofthe columns you request, it won't even need to look in the table. Thisconcept is known as index coverage.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Compare the following two queries (against the sample AdventureWorks database):&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;SELECT * FROM Production.TransactionHistoryArchive &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;WHERE ReferenceOrderID &amp;lt; 100 &amp;nbsp; &amp;nbsp; &lt;br /&gt;SELECT ReferenceOrderLineID FROM &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;Production.TransactionHistoryArchive &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;WHERE ReferenceOrderID &amp;lt; 100&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;In both cases, we're returning the same number of rows, and theSELECT * query only returns 15KB more data than the second query.However, take a look at the execution plans shown in Figure 15.19.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.19. The execution plan for two queries -- one using SELECT *, and one using the table name" height="144" src="http://i2.sitepoint.com/graphics/performance_exec-plan-comparison.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;You'll notice that the first query took 99% of the relative work forboth queries. The second query was able to look up the values in theindex via an index seek -- a search that touches on only those rowsthat qualify. The first query, however, had to scan all the rows in thetable. In this case, the fact that the requested columns were allcontained in the search index resulted in a performance difference ofnearly one hundred-fold.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;It's important to include commonly queried data in your indexes -- something that's simply not feasible if you're using &lt;code&gt;SELECT *&lt;/code&gt;. If you just query the rows you need, the DTA will be able to recommend indexes to cover them.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Accessing More Information&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;There's a plethora of resources to which you can turn when you'restuck on a really difficult SQL database issue. Here are just a few ofthem:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;The Microsoft TechNet &lt;a class="sublink" href="http://www.microsoft.com/technet/prodtechnol/sql/2005/tsprfprb.mspx#E1BAG"&gt;article on troubleshooting performance problems in SQL Server 2005&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;a class="sublink" href="http://www.sqlteam.com/"&gt;SQLTeam.com&lt;/a&gt; -- one of many SQL Server community forums&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;a class="sublink" href="http://www.sitepoint.com/launch/dbforum/"&gt;The SitePoint Databases Forum&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;&lt;span style="font-size: small;"&gt;Summary&lt;/span&gt;&lt;/h5&gt;&lt;span style="font-size: small;"&gt;Performance optimization is an iterative process -- be prepared tofollow the repetitive steps of analyzing your site's performance,tuning your application, analyzing the performance again, then tuningsome more, until your site performs the way you want it to. Prematureoptimization -- tuning without understanding what's causing theslowdown -- is likely to cause more problems than it solves.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;ASP.NET and SQL Server 2005 power some of the most popular and powerful sites upon the planet, including &lt;a class="sublink" href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt;,which serves billions of page views per day. You've got all the toolsyou need to get the maximum possible use out of your web server -- Ihope the tips in this chapter will help you to put them to work.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;That's it for this chpater of &lt;a class="sublink" href="http://www.sitepoint.com/books/aspnetant1/"&gt;&lt;i&gt;The ASP.NET 2.0 Anthology, 101 Essential Tips, Tricks &amp;amp; Hacks&lt;/i&gt;&lt;/a&gt;. Feel free to download this chapter -- along with three others -- for offline reference.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4942427404274609914-1056274562428055698?l=programmingdiscussions.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/1056274562428055698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/speed-up-your-site-8-aspnet-performance_648.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/1056274562428055698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/1056274562428055698'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/speed-up-your-site-8-aspnet-performance_648.html' title='Speed Up Your Site! 8 ASP.NET Performance Tips (part 6)'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-7335398610824477073</id><published>2010-08-18T06:52:00.000-07:00</published><updated>2010-08-18T06:52:53.328-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Video Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Speed Up Your Site! 8 ASP.NET Performance Tips (part 5)</title><content type='html'>&lt;span style="color: black; font-size: small;"&gt;&lt;/span&gt;&lt;h5 style="color: black;"&gt;&lt;span style="font-size: small;"&gt;How can I gain more control over the ASP.NET cache?&lt;/span&gt;&lt;/h5&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;As we've seen, declarative caching provides a great return oninvestment -- it's very easy to enable, and will give you someimmediate performance benefits. However, you can gain even more benefitfrom the ASP.NET cache with only a little more work.&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Solution&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;If you'd like to really take advantage of caching in ASP.NET, it'stime you met the Cache API. Declarative caching might be easy to setup, but it can only take you so far. Unlike declarative caching, whichstores and reuses rendered HTML, the Cache API allows you to store dataefficiently in your application logic or code-behind code.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The simplest way to think of the ASP.NET cache is to compare it tothe Application object. They're similar in that you can use both tostore objects or values by a string key:&lt;/span&gt;&lt;/div&gt;&lt;blockquote style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Cache["States"] = new string[] {"Alabama","Arkansas","Alaska"}; &amp;nbsp; &amp;nbsp; &lt;br /&gt;Cache["ProductData"] = GetProductDataset();&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;So what's the difference between the Application object and thecache for the storage of information? ASP.NET can remove items from thecache whenever it needs to free up memory. The cache has a limitedamount of memory to work with, so when new content is added to thecache, the cache usually has to delete some older, cached data.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Different classes of information can be stored in your cache:&lt;/span&gt;&lt;/div&gt;&lt;ul style="color: black;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Expensive data&lt;/b&gt; is information thatyou want to keep in the cache whenever possible. The term "expensive"refers to the fact that the generation of this class of data involvesvaluable resources (database or processing power).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Inexpensive data&lt;/b&gt;refers to all of the other types of information that you'd like to putin the cache if there happens to be room, but is not particularlyresource-intensive to generate.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The challenge is to prevent the inexpensive data from pushing the expensive data out of the cache.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The &lt;code&gt;Cache&lt;/code&gt; object comes with some features that give yousome control over which items are placed in the cache, and how longthey stay there. Using the &lt;code&gt;Cache&lt;/code&gt; object, you can applycustom cache dependencies, explicitly set cache expiration policies,and define callback events that fire when an item is removed from thecache (so you can decide whether you'd like to add it to the cacheagain).&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;One of my favorite features is the sliding expiration, which is asetting that lets you specify that an item should stay in the cache --as long as it has been used within a certain period of time:&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Cache.Insert("ProductData", GetProducts(), null, &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;System.Web.Caching.Cache.NoAbsoluteExpiration, &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;TimeSpan.FromMinutes(10));&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The above code tells the cache that we'd like it to keep ourProducts data set, as long as it has been used in the past ten minutes.The benefit of this approach is that frequently used data will staycached, and infrequently used data will expire and stop taking upvaluable space.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;We can customize the settings for our cache, for example, setting alonger sliding expiration timeframe on data that's more expensive (suchas that which results from a web service call). We could even add acache dependency on the results of a &lt;code&gt;GetLastUpdateTimestamp&lt;/code&gt;web service call to keep the data current if needed. Remember, though,that any data can still be removed from the cache at any time -- oursliding expiration time setting is really just a suggestion to thecache system.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Discussion&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Once you've begun to cache your data, you'll begin to see thebenefit of what are some tried and true cache access patterns. StevenSmith wrote about the cache data reference pattern in his &lt;a class="sublink" href="http://msdn2.microsoft.com/en-us/library/aa478965.aspx"&gt;excellent MSDN article&lt;/a&gt;. Here's some code that implements this pattern:&lt;/span&gt;&lt;/div&gt;&lt;blockquote style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;public DataTable GetCustomers(bool BypassCache) &amp;nbsp; &amp;nbsp; &lt;br /&gt;{ &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;string cacheKey = "CustomersDataTable"; &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;object cacheItem = Cache[cacheKey] as DataTable; &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;if((BypassCache) || (cacheItem == null)) &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;{ &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;cacheItem = GetCustomersFromDataSource(); &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;Cache.Insert(cacheKey, cacheItem, null, &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DateTime.Now.AddSeconds(GetCacheSecondsFromConfig(cacheKey), &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TimeSpan.Zero); &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;return (DataTable)cacheItem; &amp;nbsp; &amp;nbsp; &lt;br /&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Smith's article explains the technique in more detail, but the mostimportant point to note is the possibility that the object may not bein cache, or could potentially be removed at any time. The above codeis safe because it loads the cached object, checks whether the objectis null, and, if so, loads the object data and adds it back to thecache.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Another of my favorite cache patterns is one that Gavin Joyce uses on his DotNetKicks site -- the &lt;a class="sublink" href="http://weblogs.asp.net/gavinjoyce/pages/The-Reluctant-Cache-Pattern.aspx"&gt;reluctant cache pattern&lt;/a&gt;, which relies on his &lt;code&gt;ReluctantCacheHelper&lt;/code&gt; class.  This pattern prevents an application from adding to the cache information that's unlikely to be used.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;For example, when Google indexes your site, it will load every pagethat it can find. If your site implements a cache that is used by alarge number of pages, your server will perform a lot of unnecessarywork adding data to the cache, only for that data to be immediatelydropped from the cache as other pages are added. Similar to the slidingexpiration pattern, but in reverse, this pattern only adds data to thecache if it's been used a lot recently. Here's an example thatimplements this pattern:&lt;/span&gt;&lt;/div&gt;&lt;blockquote style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;public static List&lt;customer&gt; GetCustomers() { &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;string cacheKey = "Customers"; &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;int cacheDurationInSeconds = 5; // low number for demo purposes &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;object customers = HttpRuntime.Cache[cacheKey] as List&lt;customer&gt;; &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;if (customers == null) { &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;customers = CustomerDao.GetCustomers(); &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;if (new ReluctantCacheHelper(cacheKey, &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cacheDurationInSeconds, 2).ThresholdHasBeenReached) &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;{ &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRuntime.Cache.Insert(cacheKey, &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;customers, &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;null, &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DateTime.Now.AddSeconds(cacheDurationInSeconds), &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.Web.Caching.Cache.NoSlidingExpiration); &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp;return (List&lt;customer&gt;)customers; &amp;nbsp; &amp;nbsp; &lt;br /&gt;}&lt;/customer&gt;&lt;/customer&gt;&lt;/customer&gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;h5 style="color: black;"&gt;&lt;span style="font-size: small;"&gt;How do I speed up my database queries?&lt;/span&gt;&lt;/h5&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;We've looked at a few ways to optimize your ASP.NET code, but ifyour queries are slow, you'll still have a site that drags its heels.You can hide the problem to some degree if you cache your data or addservers to your web farm, but eventually you will need to deal withyour slow queries.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Of course, the best bet is to work with a good DatabaseAdministrator (DBA). We're ASP.NET developers, and while we can't helpbut learn about databases as we work with them, database administrationis not our full-time job. A good DBA is by far the best solution to adatabase problem, but sometimes, it's just not an option. If you workon a team without a DBA, or you have limited access to your DBA, youneed to do your best to solve problems when you can.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Slow Query or Slow Database?&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;It's important to decide whether you're dealing with one slow queryor a whole slow database. Is one particular page slow, or is the wholesite groaning? This solution will focus on the former; if you cannarrow your database performance problems down to individual queries,refer to the section called "How can I troubleshoot a slow query?"later in this chapter.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Solution&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Use the SQL Profiler and Database Tuning Advisor, located in the SQL Server Performance Tools folder.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Tuning a database server is hard. Initially, it can be difficult tofind out what's responsible for slowing things down. Even then, fixingone problem (for example, applying indexes to a table to improve thespeed of &lt;code&gt;SELECT&lt;/code&gt; statements) can introduce new problems (such as slower &lt;code&gt;INSERT&lt;/code&gt;s and &lt;code&gt;UPDATE&lt;/code&gt;s).&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Fortunately, the existence of the SQL Performance Tools means you don't have to bother with guesswork.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The SQL Profiler captures what's going on in your database,including which SQL statements are being executed, who's executingthem, and how long they're taking. The profiler is the first step todetermining what's actually happening on your server.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Note that the profiler captures both ad hoc and dynamic SQL. Thismeans that the profiler is especially useful when control, library, orframework code is making a call in your database -- you may not haveaccess to the ASP.NET code, but the profiler will reveal exactly whichqueries are being executed, and how long they are taking.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;It's best if you can run a profiler trace on your actual productionsystem, but this may not always be possible -- profiling a server slowsthe server down, and the site's regular users may not appreciate theextra delays. If you can't run on the production system, you can stillgain a reasonable idea of server activity on a local or developmentserver by simulating the way real users would using your site on thelive server.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Running the profiler can be a bit daunting the first time -- thereare numerous advanced settings to monitor and tweak. It's best to startout with a predefined template like the one I've chosen in Figure 15.9.The two most useful templates for general performance diagnostics arethe TSQL_Duration and Tuning templates.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.9. Selecting the TSQL_Duration template" height="259" src="http://i2.sitepoint.com/graphics/performance_sql-profiler-templates.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The TSQL_Duration template is useful for giving you a quick snapshotof the queries and stored procedures that take the longest time toexecute. Figure 15.10 shows some sample queries running against theNorthwind example database. The slowest query -- the query with thegreatest duration value -- is highlighted at the bottom of the list.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.10. Query duration times in SQL Server Profiler" height="275" src="http://i2.sitepoint.com/graphics/performance_sql-profiler-sample-queries.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;In a simple case like the one above, you may be able to deduceenough information from the TSQL_Duration trace to begin tuning aspecific query. If you're at all in doubt, however, it's best to runthe profiler with the Tuning template and analyze the results in theDatabase Tuning Advisor (also referred to as the DTA), a tool foranalyzing database performance and suggesting which tables should beindexed.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;To do this, first save your trace file from the profiler, as shown in Figure 15.11.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.11. Saving a trace file from SQL Server Profiler" height="321" src="http://i2.sitepoint.com/graphics/performance_database-tuning-advisor.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Now, we'll use the DTA to open the trace file that we just saved, asI've done in Figure 15.12, and click the Start Analysis button.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.12. Loading the trace file in the Database Tuning Advisor" height="316" src="http://i2.sitepoint.com/graphics/performance_dta-start-analysis.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;For my sample queries, DTA recommended that I apply a few indexes,to produce an estimated performance improvement of 5%, as shown inFigure 15.13. (The Northwind database is already more or less indexed;your estimated improvement should be a lot higher, with any luck.)&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.13. The index recommendations suggested by the DTA" height="321" src="http://i2.sitepoint.com/graphics/performance_dta-estimated-improvements.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;If you scroll to the right, so that the Description column isvisible, you'll see exactly which indexes and statistical changes theDTA recommends. Click on a recommendation to see a preview of thescript that will add the proposed index, as shown in Figure 15.14.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.14. Viewing a preview of the script for applying one of the recommended indexes" height="321" src="http://i2.sitepoint.com/graphics/performance_dta-script-preview.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;To implement these changes, I suggest you save the recommendations(Actions &amp;gt; Save Recommendations...), review them in SQL ServerManagement Studio (SSMS), and apply them if you feel comfortable withthem. Once you've done this, repeat your original profiling test andverify that the changes have improved your database performance.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Running the DTA with a SQL Workload Script File&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Our walkthrough of the DTA used a SQL Server Trace file for theworkload, but you can also use the DTA against a SQL script. Here's anabbreviated copy of the script I used for this walkthrough:&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Example 15.10. SampleSqlWorkload.sql (excerpt) &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp; &lt;br /&gt;USE [Northwind] &amp;nbsp; &amp;nbsp; &lt;br /&gt;GO &amp;nbsp; &amp;nbsp; &lt;br /&gt;SELECT * FROM [Order Details] od &amp;nbsp; &amp;nbsp; &lt;br /&gt;INNER JOIN Orders o on o.OrderID = od.OrderID &amp;nbsp; &amp;nbsp; &lt;br /&gt;GO &amp;nbsp; &amp;nbsp; &lt;br /&gt;SELECT * FROM [Category Sales for 1997] &amp;nbsp; &amp;nbsp; &lt;br /&gt;GO &amp;nbsp; &amp;nbsp; &lt;br /&gt;SELECT * FROM Invoices &amp;nbsp; &amp;nbsp; &lt;br /&gt;GO &amp;nbsp; &amp;nbsp; &lt;br /&gt;SELECT COUNT(OrderID) OrderCount, ShipPostalCode &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;FROM Orders &amp;nbsp; &amp;nbsp; &lt;br /&gt;GROUP BY ShipPostalCode &amp;nbsp; &amp;nbsp; &lt;br /&gt;ORDER BY COUNT(OrderID) DESC &amp;nbsp; &amp;nbsp; &lt;br /&gt;GO &amp;nbsp; &amp;nbsp; &lt;br /&gt;EXEC [Ten Most Expensive Products] &amp;nbsp; &amp;nbsp; &lt;br /&gt;GO &amp;nbsp; &amp;nbsp; &lt;br /&gt;SELECT COUNT(OrderID) OrderCount, c.CustomerID, &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;c.ContactName &amp;nbsp; &amp;nbsp; &lt;br /&gt;FROM Orders o INNER JOIN Customers c &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;ON o.CustomerID = c.CustomerID &amp;nbsp; &amp;nbsp; &lt;br /&gt;GROUP BY c.CustomerID, c.ContactName &amp;nbsp; &amp;nbsp; &lt;br /&gt;sORDER BY COUNT(OrderID) DESC &amp;nbsp; &amp;nbsp; &lt;br /&gt;GO &amp;nbsp; &amp;nbsp; &lt;br /&gt;SELECT LEN(ContactName), ContactName &amp;nbsp; &amp;nbsp; &lt;br /&gt;FROM Customers ORDER BY LEN(ContactName) DESC &amp;nbsp; &amp;nbsp; &lt;br /&gt;GO&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;The important point to note is that there are GO separatorsbetween statements, which ensures that they're executed independently.You'll want your SQL workload script file to simulate actual usage,which means that you should include repeated calls to the most commonlyused queries.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Using the Performance Dashboard&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;SQL Server includes Dynamic Management Views (DMVs) -- databaseviews that contain lots of useful management and troubleshootinginformation about your database. All the DMV views begin with theprefix &lt;code&gt;sys.dm_&lt;/code&gt;; for example: &lt;code&gt;sys.dm_index_usage_stats&lt;/code&gt;.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;SSMS includes some built-in reports that leverage SQL ServerReporting Services as well as the DMVs. You can view these reports inSSMS if you right-click a database and select Reports &amp;gt; StandardReports....&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;SQL Server SP2 includes the ability to include custom reports, and one of the first to be released is the &lt;a class="sublink" href="http://www.microsoft.com/downloads/details.aspx?familyid=1d3a4a0d-7e0c-4730-8204-e419218c1efc"&gt;Performance Dashboard&lt;/a&gt;.Once it's installed, the Performance Dashboard gives you a graphicalsnapshot that's visible in your browser, without you having to run atrace. Figure 15.15 shows the dashboard in action.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.15. Viewing a handy third-party custom report in the Performance Dashboard" height="312" src="http://i2.sitepoint.com/graphics/performance_dta-performance-dashboard.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Discussion&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;One important aspect of troubleshooting a slow database is tounderstand what's making it run slowly. There are many potential causesof slow performance, but some common problems head the list. Let's lookat a few of them.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4942427404274609914-7335398610824477073?l=programmingdiscussions.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/7335398610824477073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/speed-up-your-site-8-aspnet-performance_7480.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/7335398610824477073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/7335398610824477073'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/speed-up-your-site-8-aspnet-performance_7480.html' title='Speed Up Your Site! 8 ASP.NET Performance Tips (part 5)'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-7675516888497868419</id><published>2010-08-18T03:37:00.000-07:00</published><updated>2010-08-18T03:37:42.184-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips and Tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Speed Up Your Site! 8 ASP.NET Performance Tips (part 4)</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;h5&gt;&lt;span style="font-size: small;"&gt;How can I improve the speed of my site?&lt;/span&gt;&lt;/h5&gt;&lt;span style="font-size: small;"&gt;Most ASP.NET web servers perform a lot of unnecessarily repetitive work.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;For example, suppose you have a page with a DataGrid bound to atable called Products. Every time a user requests the Products page,ASP.NET has to:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Look up the products data in the database.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Process the page.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Databind the product data.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Render the results to HTML.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Output the results to the browser.&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size: small;"&gt;If we assume the products list changes infrequently in comparison tohow often it is requested by a user, most of that work is unnecessary.Instead of doing all that work to send the same HTML to all users, whynot just store the HTML and reuse it until the Products table changes?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;&lt;em&gt;Solution&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The ASP.NET cache provides the key to efficient storage and reuse of our HTML.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;There are several ways to use the cache; we'll focus on the easiesttricks to get you started, then point you toward some resources thatwill help you tackle more advanced ways to utilize the cache.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The simplest solution is to use the &lt;code&gt;OutputCache&lt;/code&gt;directive on your pages or user controls. For example, the followingpage will be cached for one hour (3600 seconds). You can refresh thepage all you like, but the value of &lt;code&gt;DateTime&lt;/code&gt;. Now won't change until the page is cleared from the cache. Here's the code that retrieves the current time:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Example 15.7. OutputCacheSimple.aspx (excerpt)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; CodeBehind="OutputCacheSimple.aspx.cs"&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; Inherits="chapter_15_performance.Performance.OutputCacheSimple"&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;%&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;%@ OutputCache Duration="3600" VaryByParam="none" %&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;head id="Head1" runat="server"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;title&amp;gt;Output Cache Example&amp;lt;/title&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;/head&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;body&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;form id="form1" runat="server"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;h1&amp;gt;Output Cache Example&amp;lt;/h1&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%= DateTime.Now.ToLongTimeString() %&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;/form&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;/body&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Figure 15.5 represents our page at 11:01:41 p.m.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.5. Loading a cached page for the first time" height="115" src="http://i2.sitepoint.com/graphics/performance_output-cache-example-1.png" width="355" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Figure 15.6 shows what it looks like at 11:23:01 p.m.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.6. Subsequent reloads of a cached page showing no changes to the page content" height="115" src="http://i2.sitepoint.com/graphics/performance_output-cache-example-2.png" width="355" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Notice that the time didn't change, as the page wasn't re-rendered.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Now let's look at a slightly more complex caching example:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Example 15.8. OutputCache.aspx (excerpt)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true"&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; CodeBehind="OutputCache.aspx.cs"&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; Inherits="chapter_15_performance.Performance.OutputCache" %&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;%@ OutputCache Duration="30" VaryByParam="none" %&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml" &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;head id="Head1" runat="server"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;title&amp;gt;Output Cache Example&amp;lt;/title&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;script type="text/javascript"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; var d = new Date();&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;/script&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;/head&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;body&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;form id="form1" runat="server"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;!-- Pausing 5 seconds to simulate a database hit --&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;% System.Threading.Thread.Sleep(5000); %&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;h1&amp;gt;Output Cache Example&amp;lt;/h1&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; Time written by ASP.NET:&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;%= DateTime.Now.ToLongTimeString() %&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; Time written by Javascript:&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;script type="text/javascript"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.write(d.toLocaleTimeString())&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;div id="divCached" style="margin-top:25px;width=300px;"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;script type="text/javascript"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var aspTime = new Date();&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; aspTime.setSeconds(&amp;lt;%= DateTime.Now.Second %&amp;gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If there are more than two seconds difference&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // between the ASP.NET render and the javascript&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // evaluation, the page is almost certainly cached.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(Math.abs(d - aspTime) &amp;gt; 2000)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.write('Probably Cached');&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.getElementById("divCached").style.backgroundColor =&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Coral";&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.write('Not Cached');&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.getElementById("divCached").style.backgroundColor =&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Aqua";&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;/form&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;/body&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;The above page writes out the current time according to both ASP.NET(server side, cached) and JavaScript (client side, not cached).Additionally, if the JavaScript time is more than two seconds after theASP.NET time, the page will report that it has probably been cached.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The first time this page is viewed, there's a five-second delay (dueto the call to Thread.Sleep), then the page shown in Figure 15.7 isdisplayed.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.7. The page output on first load" height="151" src="http://i2.sitepoint.com/graphics/performance_output-not-cached.png" width="356" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;But if you refresh the page within 30 seconds, you'll notice twodifferences. First, the page will return immediately. Second, it lookslike Figure 15.8.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.8. The page output 30 seconds after its initial load" height="151" src="http://i2.sitepoint.com/graphics/performance_output-probably-cached.png" width="356" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;Using &lt;code&gt;VaryByParam&lt;/code&gt; to Cache Parameterized Pages&lt;/em&gt;&lt;br /&gt;&lt;em&gt;When you start to consider which pages in your application could becached, you'll probably discover that many of them contain contentthat's 90% static. The remaining 10% of these pages is likely tocontain one or two tiny portions that vary frequently. For example,consider a page in the example Northwind database that displays cataloginformation, including products filtered by category. The category isset by a parameter in the query string, so the following two URLs willyield different results:&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;http://www.contoso.com/Northwind/Products.aspx?Category=Seafood&lt;/code&gt;&lt;br /&gt;&lt;code&gt;http://www.contoso.com/Northwind/Products.aspx?Category=Produce&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;The novice programmer might apply the following code to cache these pages:&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;%@ OutputCache Duration="30" %&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;However, if you were to apply this code you'd quickly discover aproblem -- the category filter would stop working. The first version ofthe page that was displayed would be cached, so the filtering logicwould be ignored on subsequent page views.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;That's the exact function for which the &lt;code&gt;VaryByParam&lt;/code&gt; attribute is used. In this case, we'd change the &lt;code&gt;OutputCache&lt;/code&gt; directive to the following:&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&amp;lt;%@ OutputCache Duration="30" VaryByParam="Category" %&amp;gt;&lt;/code&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;The &lt;code&gt;VaryByParam&lt;/code&gt; attribute tells the cache system tostore a different version of the page every time it sees a new valuefor Category in the URL. Once this attribute is in place, our userswill be able to access a cached copy of the page for both the Seafoodand Produce categories.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;Keep in mind that storing different versions of the page foreach parameter value isn't always the best idea -- in cases where youhave many different parameter values, you can quickly use a largeamount of memory to hold all possible variations of the page. Use &lt;code&gt;VaryByParam&lt;/code&gt; when your pages utilizes a limited number of parameter values.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Note that the number of seconds displayed in theJavaScript-generated time has updated to 59 seconds, while the ASP.NETtime still shows 39. What this discrepancy suggests is that the serveris sending the same HTML to the client for each request. Suppose thatinstead of just displaying the current time, we'd bound several &lt;code&gt;GridView&lt;/code&gt;s to the results of several expensive database queries. With caching applied to such a page, the savings would be considerable.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;You don't have to cache a page for long to see significantperformance increases -- a cache of one minute or less can improve yoursite's performance dramatically. For example, adding a cache to asimple page that just binds a &lt;code&gt;GridView&lt;/code&gt; to the Productstable in the example Northwind database will increase the performanceof that page by about 500%, and for a page that performs a complexdatabase query or processor-intensive calculation, this saving islikely to be amplified even further.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;Using Post-cache Substitution&lt;/em&gt;&lt;br /&gt;&lt;em&gt;While the &lt;code&gt;OutputCache&lt;/code&gt; directive allows you to specifythat the cache should vary with a specific parameter, it's not reallyefficient to cache a multitude of copies of one page that are nearlyall identical.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;Post-cache substitution, using the &lt;code&gt;Substitution&lt;/code&gt;control, allows you to inject dynamic content into a cached page. Theresult is that you can cache some pages that you probably thought wereunable to be cached. Read more on this subject in &lt;a class="sublink" href="http://weblogs.asp.net/scottgu/archive/2006/11/28/tip-trick-implement-donut-caching-with-the-asp-net-2-0-output-cache-substitution-feature.aspx"&gt;Scott Guthrie's article on the topic&lt;/a&gt;.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;One of the problems you might notice with this approach, however, islatency -- the time delay between the point at which your data isupdated and the moment when that same updated data reaches a user'sbrowser. In the examples we've looked at in this solution, we displayedthe same timestamp for 30 seconds after the page was rendered -- thisis great for performance, but might be a problem if your users requirethe data to always be up to date.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Fortunately, ASP.NET 2.0 has a solution to this problem, which we'll look at next.&lt;/span&gt;&lt;br /&gt;&lt;h5&gt;&lt;span style="font-size: small;"&gt;How do I refresh my cache when the data changes?&lt;/span&gt;&lt;/h5&gt;&lt;span style="font-size: small;"&gt;As we saw in the previous tip, judicious use of output caching canprovide dramatic improvements in your site's performance. Outputcaching works by saving the generated HTML for a rendered ASP.NET page.As long as the cache is valid, future requests for that page will justreturn that stored HTML, rather than processing the page again, whichmeans no page parsing, hits to the database, data binding -- any ofthose tasks that require precious bandwidth or processor cycles. Usedcorrectly, caching can improve your requests-per-second on ahigh-traffic page by a factor of 100 or more.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;For example, suppose you had a page that contained a DataGrid boundto a table called Products. Without caching, every page request wouldrequire ASP.NET to look up the product data in the database, processthe page, data bind the product data, render the results to HTML, andoutput the results to the browser.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If the page was cached, only the first request for this page wouldrequire all that work; after that, ASP.NET would just skip all the hardwork and serve up the HTML until the cache expired. The end resultwould be the same whether or not a cache was used: the same HTML wouldbe sent to the browser. However, since a lot less work and networktraffic is required to display cached HTML, the server can serve thecached page much faster and to more people.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;One problem with cached pages is that they don't pick up data thathas changed right away. To continue with the example above: if we wereto add a new product to the Products table, it wouldn't show up on thepage until the cache expired. Fortunately, ASP.NET 2.0 provides a goodmechanism to refresh your cache automatically when the underlying datachanges.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;&lt;em&gt;Solution&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The SQL Cache Dependency was created to solve this problem. A fewsteps are required to set it up, but once it's up and running, you canuse it throughout your whole application.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;Using SQL Cache Dependencies with Older Versions of SQL Server&lt;/em&gt;&lt;br /&gt;&lt;em&gt;In this book I'll only cover the steps for configuring SQL ServerCache Dependencies on SQL Server 2005; there's a wealth of informationon MSDN about how to set it up on SQL Server 2000:&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;a class="sublink" href="http://msdn2.microsoft.com/en-us/library/ms229862%28VS.80%29.aspx"&gt;ASP.NET SQL Server Registration Tool (Aspnet_regsql.exe)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;a class="sublink" href="http://msdn2.microsoft.com/en-us/library/ms178604%28VS.80%29.aspx"&gt;Caching in ASP.NET with the SqlCacheDependency Class&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;a class="sublink" href="http://msdn2.microsoft.com/en-us/library/e3w8402y%28VS.80%29.aspx"&gt;Walkthrough: Using ASP.NET Output Caching with SQL Server&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;First, you'll need to make sure you've enabled SQL Server ServiceBroker for your database. You can confirm that with the following query:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;ALTER DATABASE Northwind SET ENABLE_BROKER;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Next, you'll need to start the SQL Dependency event listener. Therecommended place to make the change that triggers this listener is inthe &lt;code&gt;Application_Start&lt;/code&gt; method of &lt;code&gt;Global.asax&lt;/code&gt;:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Example 15.9. Global.asax (excerpt) &amp;nbsp; &lt;br /&gt; &amp;nbsp; &lt;br /&gt;void Application_Start(object sender, EventArgs e) &amp;nbsp; &lt;br /&gt;{ &amp;nbsp; &lt;br /&gt; &amp;nbsp;string northwindConnection = WebConfigurationManager.ConnectionStr &amp;nbsp; &lt;br /&gt;➥ings["NorthwindConnectionString1"].ConnectionString; &amp;nbsp; &lt;br /&gt; &amp;nbsp;SqlDependency.Start(northwindConnection); &amp;nbsp; &lt;br /&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;Once the above code has been added to the &lt;code&gt;Global.asax&lt;/code&gt; file, our connection can employ an SQL Cache Dependency.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;To illustrate how an SQL Dependency is utilized, let's look at an example -- a simple &lt;code&gt;GridView&lt;/code&gt;that's bound to a table. We'll drag the good old Northwind Productstable onto a new page, then set the following two attributes in the &lt;code&gt;SqlDataSource&lt;/code&gt; control:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;EnableCaching = "True" SqlCacheDependency = &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;"NorthwindConnectionString1:Products"&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;With this simple line of code in place, the &lt;code&gt;GridView&lt;/code&gt;won't read the Products table again until it changes. As soon as theProducts table changes, though, SQL Server will notify ASP.NET to dumpthe cache, and the subsequent page request will reload the page fromthe database. The end result is that our application gains all of theperformance benefits that come with caching, but our users will neversee stale data.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4942427404274609914-7675516888497868419?l=programmingdiscussions.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/7675516888497868419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/speed-up-your-site-8-aspnet-performance_18.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/7675516888497868419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/7675516888497868419'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/speed-up-your-site-8-aspnet-performance_18.html' title='Speed Up Your Site! 8 ASP.NET Performance Tips (part 4)'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-1444472280875341776</id><published>2010-08-17T21:25:00.000-07:00</published><updated>2010-08-17T21:26:21.756-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips and Tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Speed Up Your Site! 8 ASP.NET Performance Tips (part 3)</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;h5 style="color: black;"&gt;&lt;span style="font-size: small;"&gt;How can I decrease the bandwidth that my site uses?&lt;/span&gt;&lt;/h5&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;ASP.NET abstracts a lot of traditional web development details fromthe developer. Just drag and drop a few controls on a form, set someproperties, write a little bit of code, and -- bam! -- you've got afunctioning web site.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;However, that doesn't mean the resulting HTML markup willnecessarily be efficient or small. It's not unusual to see ASP.NETpages that contain more than 100 kilobytes of markup. I recommend thatyou keep a close eye on the HTML markup that results from your ASP.NETweb pages -- to keep these file sizes in check can sometimes requireadditional effort, which is one reason we covered the topic of webstandards in Chapter 9, ASP.NET and Web Standards.&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;&lt;em&gt;Solutions&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The first rule of ASP.NET bandwidth control is to know how largeyour pages are. In Internet Explorer, the File &amp;gt; Properties dialogwill tell you how many kilobytes of HTML markup the current page hasproduced, as Figure 15.2 shows. Firefox has a similar dialog, picturedin Figure 15.3, which can be accessed by selecting Tools &amp;gt; Page Info.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.2. Viewing page information in Internet Explorer" height="480" src="http://i2.sitepoint.com/graphics/performance_ie7-file-properties.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.3. Viewing page information in Firefox" height="439" src="http://i2.sitepoint.com/graphics/performance_firefox-page-info.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="vertical" id="adz" style="color: black;"&gt;&lt;div id="google_ads_div_Articles_6_300x250"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="1" marginheight="1" marginwidth="1" name="1&amp;amp;1 Cookie" scrolling="no" src="http://om.1and1.com/postview/?ac=OM.US.USa09K17748H7072a" style="border: 1px hidden rgb(255, 255, 255); position: absolute;" width="1"&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;However, note that the Size field in Firefox reports a much smallernumber than does IE 7 -- 13,976 bytes versus 49,774 bytes. That'sbecause Firefox shows the actual number of bytes that came down overthe wire, whereas IE 7 shows the size of the page after it has beenreceived by the browser.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;How is such a discrepancy possible? Well, the ASP.NET web site usesHTTP compression to decrease the page size before sending the page.HTTP compression is a W3C standard that allows the server to provide aGZIP-compressed version of the HTML content to the client, at the costof a very minor increase in CPU time. The client receives thecompressed content, then decompresses it on the fly before renderingthe page. Right off the bat, you can see that this is just one easy wayto reduce the amount of bandwidth you use by an impressive 72% --simply flip the switch to enable HTTP compression for your web site.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;You can enable HTTP compression in two ways. The first takes placeat the web server level; the second is implemented via a custom HTTPmodule at the ASP.NET application level.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;Enabling HTTP Compression Support in IIS 6&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Use the IIS Service Manager to enable HTTP Compression in IIS 6.Right-click the node for your web site and select Properties. TheService tab contains the settings relevant to compression, as Figure15.4 shows.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;Manual Configuration is Only Necessary in IIS 6&lt;/em&gt;&lt;br /&gt;&lt;em&gt;That's right: it's only necessary to configure IIS to enable HTTPcompression in IIS 6 and earlier, as IIS 7 enables static compressionby default. Windows Server 2008 (which had yet to be released at thetime of this writing) may offer a user interface to configure dynamicHTTP compression, but Vista's IIS Manager doesn't.&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.4. Configuring HTTP compression in IIS 6" height="388" src="http://i2.sitepoint.com/graphics/performance_web-sites-properties-iis6.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The compression setting available in the GUI works; however, it onlyaffects static content, such as HTML pages and CSS files. This settingwon't do anything to compress dynamic content in ASPX pages. We mustresort to editing the metabase -- the IIS database for configurationand metadata storage -- to deploy dynamic content compression:&lt;/span&gt;&lt;/div&gt;&lt;ul style="color: black;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Open the metabase in Notepad. For IIS 6, this is located at &lt;code&gt;C:\WINDOWS\system32\inetsrv\MetaBase.xml&lt;/code&gt;. For IIS 5, the file is a binary file, so you'll need to &lt;a class="sublink" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=48364A72-D54E-46DC-AACF-E3BE887D17A6"&gt;download the Meta-data Edit tool instead&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Search for the &lt;code&gt;&lt;iiscompressionscheme&gt;&lt;/iiscompressionscheme&gt;&lt;/code&gt; tag. There should be two &lt;code&gt;&lt;iiscompressionscheme&gt;&lt;/iiscompressionscheme&gt;&lt;/code&gt;&lt;/span&gt;entries: one for deflate and one for GZIP -- the two methods ofcompression that IIS supports. By default, IIS uses GZIP; deflate israrely used.&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Search for the &lt;code&gt;HcScriptFileExtensions&lt;/code&gt;section. Add to the list aspx, asmx, php, cgi, and any other fileextensions that you want dynamically compressed. Follow the existingformat carefully -- it's return-delimited, and any extra spaces willprevent the file extensions from working. Make the same changes in bothdeflate and GZIP.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Set &lt;code&gt;HcDynamicCompressionLevel&lt;/code&gt;to level 9 (it has a default value of 0, which means "no compression").I recommend level 9, based on several reports that I've read on the Websuggesting that level 10 requires much more CPU time, while offeringonly a minimal reduction in file size over level 9. Make this changefor both deflate and GZIP.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Note that this is a global compression rule that will affect all websites. This setting is usually what you'll want, since HTTP compressionis so effective and the cost is nominal. However, some poorly codedASP.NET web sites may be incompatible with compression. In thosecircumstances, you may want to enable or disable compression on aper-site or per-folder basis -- a setting that's also supported by IIS.The easiest way to configure this setting is to use the command line &lt;code&gt;adsutil.vbs&lt;/code&gt; utility:&lt;/span&gt;&lt;/div&gt;&lt;blockquote style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;C:\Inetpub\AdminScripts\&amp;gt;adsutil.vbs set w3svc/ (site#) /root/DoStat &amp;nbsp; &lt;br /&gt;➥icCompression False &amp;nbsp; &lt;br /&gt;C:\Inetpub\AdminScripts\&amp;gt;adsutil.vbs set w3svc/ (site#) /root/DoDyna &amp;nbsp; &lt;br /&gt;➥micCompression False&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The &lt;code&gt;(site#)&lt;/code&gt; number can be obtained from the log properties dialog in the IIS server properties, and usually takes the form &lt;code&gt;W3SVCn&lt;/code&gt;, where &lt;code&gt;n&lt;/code&gt; is an arbitrary site number.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;Enabling HTTP Compression Support in an ASP.NET Application&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Perhaps you don't have control over the IIS settings on your server.Or maybe you'd just like a way to enable compression for your specificASP.NET application. That's possible too.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The open source HttpCompress library is very easy to incorporate into an ASP.NET web site. First, &lt;a class="sublink" href="http://www.blowery.org/code/HttpCompressionModule.html"&gt;download the latest version of HttpCompress&lt;/a&gt; from the official web site. &lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Place the &lt;code&gt;blowery.Web.HttpCompress.dll&lt;/code&gt; binary somewhere logical, and add a reference to it.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Next, add the following compression-specific configuration section to your site's &lt;code&gt;Web.config&lt;/code&gt;:&lt;/span&gt;&lt;/div&gt;&lt;blockquote style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Example 15.5. Web.config (excerpt) &lt;br /&gt;&lt;br /&gt;&amp;lt;configSections&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;sectionGroup name="blowery.web"&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;section name="httpCompress"&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type="blowery.Web.HttpCompress.SectionHandler,&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; blowery.Web.HttpCompress"/&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;/sectionGroup&amp;gt; &lt;br /&gt;&amp;lt;/configSections&amp;gt; &lt;br /&gt;&amp;lt;blowery.web&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;httpCompress preferredAlgorithm="gzip" compressionLevel="high"&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;excludedMimeTypes&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add type="image/png" /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add type="image/jpeg" /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add type="image/gif" /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/excludedMimeTypes&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;/httpCompress&amp;gt; &lt;br /&gt;&amp;lt;/blowery.web&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Finally, bring the actual compression HTTP module into the pipeline:&lt;/span&gt;&lt;/div&gt;&lt;blockquote style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Example 15.6. Web.config (excerpt) &lt;br /&gt;&lt;br /&gt;&amp;lt;system.web&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;httpModules&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;add name="CompressionModule"&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type="blowery.Web.HttpCompress.HttpModule,&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; blowery.web.HttpCompress"/&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;/httpModules&amp;gt; &lt;br /&gt;&amp;lt;/system.web&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Once this is in place, you should see compressed ASPX content beingreturned to the browser. To verify that this is the case, use Port80Software's convenient &lt;a class="sublink" href="http://www.port80software.com/products/httpzip/compresscheck/"&gt;Real-Time Compression Checker&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;One limitation of the HttpCompress module approach is that only ASPXcontent that forms part of your application will be compressed; the CSSand JavaScript aren't served through the ASP.NET ISAPI handler, andwill therefore remain uncompressed. As such, I recommend that youenable compression at the web server level whenever possible, so thatthese files also gain the benefits of compression.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4942427404274609914-1444472280875341776?l=programmingdiscussions.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/1444472280875341776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/speed-up-your-site-8-aspnet-performance_2383.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/1444472280875341776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/1444472280875341776'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/speed-up-your-site-8-aspnet-performance_2383.html' title='Speed Up Your Site! 8 ASP.NET Performance Tips (part 3)'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-4576793388431545679</id><published>2010-08-17T21:19:00.000-07:00</published><updated>2010-08-17T21:19:25.076-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips and Tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Speed Up Your Site! 8 ASP.NET Performance Tips (part 2)</title><content type='html'>&lt;span style="color: black; font-size: small;"&gt;&lt;/span&gt;&lt;h5 style="color: black;"&gt;&lt;span style="font-size: small;"&gt;How can I decrease the size of the view state?&lt;/span&gt;&lt;/h5&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;One convenience of ASP.NET controls is that they can preserve stateacross postbacks -- a topic we've covered in depth in Chapter 6,Maintaining State. This, of course, is a feature that comes at a price-- to implement it, we add a hidden field to the page to store thecontrol settings for transmission between the client and server, butdepending on the controls the page uses, the view state can sometimesbecome quite large.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;One obvious way to reduce the size of view state is to turn it offif you don't need it. This adjustment can be performed either at thepage level, or at the control level. If, for whatever reason, you can'tdisable the view state (for example, your page uses controls that aredependent upon the view state), there are a few other steps you cantake to at least reduce its impact on your page size.&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Solutions&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;You have two options for reducing the impact that view state has onyour page size -- either compress the view state, or store it on theserver.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Compressing the View State&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The following simple &lt;code&gt;CompressedViewStatePage&lt;/code&gt; class implements basic GZIP compression on the page's view state. It reduced the size of the &lt;code&gt;ViewState&lt;/code&gt;object on my sample page from 20,442 bytes to 6,056 bytes -- animpressive 70% reduction in size! Here's the class in all its glory:&lt;/span&gt;&lt;/div&gt;&lt;blockquote style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Example 15.3. CompressedViewStatePage.cs (excerpt) &lt;br /&gt; &lt;br /&gt;using System; &lt;br /&gt;using System.IO.Compression; &lt;br /&gt;using System.IO; &lt;br /&gt;using System.Web.UI; &lt;br /&gt;public class CompressedViewStatePage : System.Web.UI.Page &lt;br /&gt;{ &lt;br /&gt; &amp;nbsp;static public byte[] Compress(byte[] b) &lt;br /&gt; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp;MemoryStream ms = new MemoryStream(); &lt;br /&gt; &amp;nbsp; &amp;nbsp;GZipStream zs = new GZipStream(ms, CompressionMode.Compress); &lt;br /&gt; &amp;nbsp; &amp;nbsp;zs.Write(b, 0, b.Length); &lt;br /&gt; &amp;nbsp; &amp;nbsp;return ms.ToArray(); &lt;br /&gt; &amp;nbsp;} &lt;br /&gt; &amp;nbsp;static public byte[] Decompress(byte[] b) &lt;br /&gt; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp;MemoryStream ms = new MemoryStream(b.Length); &lt;br /&gt; &amp;nbsp; &amp;nbsp;ms.Write(b, 0, b.Length); &lt;br /&gt; &amp;nbsp; &amp;nbsp;// last 4 bytes of GZipStream = length of decompressed data &lt;br /&gt; &amp;nbsp; &amp;nbsp;ms.Seek(-4, SeekOrigin.Current); &lt;br /&gt; &amp;nbsp; &amp;nbsp;byte[] lb = new byte[4]; &lt;br /&gt; &amp;nbsp; &amp;nbsp;ms.Read(lb, 0, 4); &lt;br /&gt; &amp;nbsp; &amp;nbsp;int len = BitConverter.ToInt32(lb, 0); &lt;br /&gt; &amp;nbsp; &amp;nbsp;ms.Seek(0, SeekOrigin.Begin); &lt;br /&gt; &amp;nbsp; &amp;nbsp;byte[] ob = new byte[len]; &lt;br /&gt; &amp;nbsp; &amp;nbsp;GZipStream zs = new GZipStream(ms, CompressionMode.Decompress); &lt;br /&gt; &amp;nbsp; &amp;nbsp;zs.Read(ob, 0, len); &lt;br /&gt; &amp;nbsp; &amp;nbsp;return ob; &lt;br /&gt; &amp;nbsp;} &lt;br /&gt; &amp;nbsp;protected override object LoadPageStateFromPersistenceMedium() &lt;br /&gt; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp;byte[] b = Convert.FromBase64String(Request.Form["__VSTATE"]); &lt;br /&gt; &amp;nbsp; &amp;nbsp;LosFormatter lf = new LosFormatter(); &lt;br /&gt; &amp;nbsp; &amp;nbsp;return lf.Deserialize(Convert.ToBase64String(Decompress(b))); &lt;br /&gt; &amp;nbsp;} &lt;br /&gt; &amp;nbsp;protected override void SavePageStateToPersistenceMedium( &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;object state &lt;br /&gt; &amp;nbsp;) &lt;br /&gt; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp;LosFormatter lf = new LosFormatter(); &lt;br /&gt; &amp;nbsp; &amp;nbsp;StringWriter sw = new StringWriter(); &lt;br /&gt; &amp;nbsp; &amp;nbsp;lf.Serialize(sw, state); &lt;br /&gt; &amp;nbsp; &amp;nbsp;byte[] b = Convert.FromBase64String(sw.ToString()); &lt;br /&gt; &amp;nbsp; &amp;nbsp;ClientScript.RegisterHiddenField("__VSTATE", &lt;br /&gt; &amp;nbsp; &amp;nbsp;Convert.ToBase64String(Compress(b))); &lt;br /&gt; &amp;nbsp;} &lt;br /&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;To use GZIP compression, simply inherit a specific page from the class, like this:&lt;/span&gt;&lt;/div&gt;&lt;blockquote style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;public partial class MyPage : CompressedViewStatePage&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;If you're worried about the performance implications of compressingyour view state, don't be. It's far more likely that bandwidth is agreater bottleneck than CPU time on any given web server. Althoughthere are exceptions to this rule, the GZIP algorithm is blazingly faston the CPUs of today. Besides, if your server's CPU operates at 100%all the time, you have far graver problems to worry about than the sizeof a handful of pages.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;This compression algorithm could also be implemented as an HTTPmodule, which could then be applied to an entire site with a simpleWeb.config modification. I suggest you try implementing this module asan exercise, if you're keen. The &lt;a class="sublink" href="http://support.microsoft.com/kb/307996/en-us"&gt;MSDN article on building an HTTP module&lt;/a&gt; is a good place to start. &lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Storing View State on the Server&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The second option for reducing view state's impact on page size isto prevent view state data from being sent to the client altogether,and instead store the data on the server.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The following &lt;code&gt;ServerViewStatePage&lt;/code&gt; class allows us to use the Session object to store the view state:&lt;/span&gt;&lt;/div&gt;&lt;blockquote style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Example 15.4. ServerViewStatePage.cs (excerpt) &lt;br /&gt; &lt;br /&gt;using System; &lt;br /&gt;using System.Web.UI; &lt;br /&gt;using System.Configuration; &lt;br /&gt;using System.IO; &lt;br /&gt;public class ServerViewStatePage : System.Web.UI.Page &lt;br /&gt;{ &lt;br /&gt; &amp;nbsp;private const string _configKey = "ServerViewStateMode"; &lt;br /&gt; &amp;nbsp;private const string _formField = "__SERVERVIEWSTATEKEY"; &lt;br /&gt; &amp;nbsp;private string ViewStateData &lt;br /&gt; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp;get { return Request.Form[_formField]; } &lt;br /&gt; &amp;nbsp; &amp;nbsp;set { ClientScript.RegisterHiddenField(_formField, value); } &lt;br /&gt; &amp;nbsp;} &lt;br /&gt; &amp;nbsp;private string PersistenceType &lt;br /&gt; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp;get { return (ConfigurationManager.AppSettings[_configKey] &lt;br /&gt; &amp;nbsp; &amp;nbsp;?? "").ToLower(); } &lt;br /&gt; &amp;nbsp;} &lt;br /&gt; &lt;br /&gt; &amp;nbsp;private object ToObject(string viewstate) &lt;br /&gt; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp;byte[] b = Convert.FromBase64String(viewstate); &lt;br /&gt; &amp;nbsp; &amp;nbsp;LosFormatter lf = new LosFormatter(); &lt;br /&gt; &amp;nbsp; &amp;nbsp;return lf.Deserialize(Convert.ToBase64String(b)); &lt;br /&gt; &amp;nbsp;} &lt;br /&gt; &amp;nbsp;private string ToBase64String(object state) &lt;br /&gt; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp;LosFormatter lf = new LosFormatter(); &lt;br /&gt; &amp;nbsp; &amp;nbsp;StringWriter sw = new StringWriter(); &lt;br /&gt; &amp;nbsp; &amp;nbsp;lf.Serialize(sw, state); &lt;br /&gt; &amp;nbsp; &amp;nbsp;byte[] b = Convert.FromBase64String(sw.ToString()); &lt;br /&gt; &amp;nbsp; &amp;nbsp;return Convert.ToBase64String(b); &lt;br /&gt; &amp;nbsp;} &lt;br /&gt; &amp;nbsp;private string ToSession(string value) &lt;br /&gt; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp;string key = Guid.NewGuid().ToString(); &lt;br /&gt; &amp;nbsp; &amp;nbsp;Session.Add(key, value); &lt;br /&gt; &amp;nbsp; &amp;nbsp;return key; &lt;br /&gt; &amp;nbsp;} &lt;br /&gt; &amp;nbsp;private string FromSession(string key) &lt;br /&gt; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp;string value = Convert.ToString(Session[key]); &lt;br /&gt; &amp;nbsp; &amp;nbsp;Session.Remove(key); &lt;br /&gt; &amp;nbsp; &amp;nbsp;return value; &lt;br /&gt; &amp;nbsp;} &lt;br /&gt; &amp;nbsp;protected override object LoadPageStateFromPersistenceMedium() &lt;br /&gt; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp;switch (PersistenceType) &lt;br /&gt; &amp;nbsp; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp;case "session": &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ToObject(FromSession(ViewStateData)); &lt;br /&gt; &amp;nbsp; &amp;nbsp;default: &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;return base.LoadPageStateFromPersistenceMedium(); &lt;br /&gt; &amp;nbsp; &amp;nbsp;} &lt;br /&gt; &amp;nbsp;} &lt;br /&gt; &amp;nbsp;protected override void SavePageStateToPersistenceMedium( &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;object ViewStateObject &lt;br /&gt; &amp;nbsp;) &lt;br /&gt; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp;switch (PersistenceType) &lt;br /&gt; &amp;nbsp; &amp;nbsp;{ &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;case "session": &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ViewStateData = ToSession(ToBase64String(ViewStateObject)); &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break; &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;default: &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;base.SavePageStateToPersistenceMedium(ViewStateObject); &lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break; &lt;br /&gt; &amp;nbsp; &amp;nbsp;} &lt;br /&gt; &amp;nbsp;} &lt;br /&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;To use &lt;code&gt;ServerViewStatePage&lt;/code&gt;, simply inherit a specific page from this class, like this:&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;public partial class MyPage : ServerViewStatePage&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;This class is configured via a single setting in &lt;code&gt;Web.config&lt;/code&gt;: &lt;code&gt;ServerViewStateMode&lt;/code&gt;. Once you've configured this setting, you'll notice that the &lt;code&gt;ViewState&lt;/code&gt;object disappears from the page -- in its place is a simple ID that'sused to look up the contents of the page's view state on the server, inthe &lt;code&gt;Session&lt;/code&gt; object. If you feel uncomfortable storing view state in &lt;code&gt;Session&lt;/code&gt;,this class could easily be extended to store view state wherever youlike -- in the file system, in the ASP.NET cache, or in a database.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;As usual, there's no free lunch here. The decision to push viewstate to the server and store it in Session has its own drawbacks. Forexample, the Session object could be lost if the IIS worker processrecycles (a loss that does occur every so often in IIS, unless you'vedisabled this default behavior). Furthermore, any change to theunderlying application files (such as editing &lt;code&gt;Web.config&lt;/code&gt;,or adding new binaries to the bin folder of your application) will alsocause the web application to recycle and Session data to be lost. Andif you use more than one web server (such as in a web farm environment)you'll need to manage any shared session state that's stored in adatabase.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4942427404274609914-4576793388431545679?l=programmingdiscussions.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/4576793388431545679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/speed-up-your-site-8-aspnet-performance_17.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/4576793388431545679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/4576793388431545679'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/speed-up-your-site-8-aspnet-performance_17.html' title='Speed Up Your Site! 8 ASP.NET Performance Tips (part 2)'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-3362675132436601196</id><published>2010-08-17T21:11:00.000-07:00</published><updated>2010-08-17T21:14:15.349-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Speed Up Your Site! 8 ASP.NET Performance Tips (part 1)</title><content type='html'>&lt;span style="color: black; font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Now that you've added the finishing touches to your web siteand unleashed it onto the world, fame, fortune, and success will surelyfollow -- won't it?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Unfortunately, your web application's success can lead to somethingless desirable -- performance and scaling problems. On a traditionaldesktop application, one thousand users translate to one thousandclient computers chugging away, sharing the load of running yourapplication. The application is effectively spread among all the users'machines. When it comes to a web application, though, those samethousand users are usually serviced by a single machine -- your webserver.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Success can come at a cost for web applications: a cost in bandwidthand server hardware. However, there are a few clever ways you canreduce -- and sometimes eliminate -- these problems. We'll take a lookat some of the different approaches to improving the performance of anASP.NET site in this chapter, which has been extracted from &lt;a class="sublink" href="http://www.sitepoint.com/books/aspnetant1/"&gt;&lt;i&gt;The ASP.NET 2.0 Anthology, 101 Essential Tips, Tricks &amp;amp; Hacks&lt;/i&gt;&lt;/a&gt;. Feel free to download this chapter -- along with three others -- for offline reference.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;h5 style="color: black;"&gt;&lt;span style="font-size: small;"&gt;How do I determine what to optimize?&lt;/span&gt;&lt;/h5&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;You want your web application to be the best, right? Like all of us,by "best" you mean "fastest." And what better way to create a blazinglyfast application than to optimize everything? Optimize, optimize,optimize -- right? Wrong.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Premature optimization refers to the fixing of a performance problembefore you understand the problem, or before there even is a problem,and it's a bad idea.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;That's not to say that you should write sloppy, inefficient code. Mypoint is that you should trust the ASP.NET Framework, and make use ofthe features that make it such a terrific environment in which todevelop, until you hit a problem. Once you hit a problem, you shouldtake the time to understand what that problem is, and only then shouldyou start to look at how best to address it. &lt;a class="sublink" href="http://www.flounder.com/optimization.htm"&gt;Dr. Joseph M. Newcomer's essay, "Optimization: Your Worst Enemy,"&lt;/a&gt; gives a fascinating overview of the perils of optimizing in the dark. &lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The tips in this chapter propose fairly lightweight solutions forsome common performance issues. I've steered away from dramaticchanges, because I don't want you to end up doubling your developmentor maintenance time in order to shave a meagre 2% off your page loadtime. While it is possible to bypass the in-built ASP.NET Pagemechanism completely (by using Response.Write, or building anASHX-based sites), I'm not a fan of these approaches. The ASP.NETsystem as a whole has been tuned and improved for more than half adecade, and it's reasonably fast straight out of the box. There's agood chance that trying to improve on it will result in a slower andless maintainable web site.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;So, with all that out of the way, let's assume that some of your pages are running slowly. How do you figure out what to fix?&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;Solution&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Isolate the bottleneck in your site by measuring the actual speed ofthe site. This exercise can be performed using logs, databaseprofiling, and tracing.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;We've discussed the task of logging using log4net in Chapter 13,Handling Errors. If you suspect that the database is the cause of theslowdown (for example, you know that your application makes use of somelarge queries), you can either step through the page in debug mode tosee whether the database calls are taking a long time to return, or youcan use the SQL Server Profiler discussed in the section called "How doI speed up my database queries?" later in this chapter. For a verybasic analysis of what's going on in your pages, you can use theASP.NET trace; while it's not nearly as good as a full-featured loggingsystem, it's easy to implement and will provide you with plenty oftiming information.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;The first step in using the trace is to get into the habit of addingtrace statements. Write to the trace whenever you think there'ssomething you might want to see when you debug future problems. Tracingdoesn't have any real performance impact on your site until it'senabled in the &lt;code&gt;Web.config&lt;/code&gt;, and when you need to troubleshoot a problem, you'll be glad it's there.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;There's more information on tracing in Chapter 13, Handling Errors,but the general idea is that you can write to the Trace object likethis:&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;Trace.Write("Here's a trace message.");&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Tracing is disabled by default; when you want your &lt;code&gt;Trace.Write&lt;/code&gt; statements to actually do something, you'll need to turn tracing on in the &lt;code&gt;Web.config&lt;/code&gt; file, as follows:&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;trace enabled="true"&gt;&lt;/trace&gt;&lt;/system.web&gt;&lt;/configuration&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;trace enabled="true"&gt;Example 15.1. Web.config (excerpt)&lt;/trace&gt;&lt;/system.web&gt;&lt;/configuration&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;trace enabled="true"&gt;&lt;/trace&gt;&lt;/system.web&gt;&lt;/configuration&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;trace enabled="true"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;/trace&gt;&lt;/system.web&gt;&lt;/configuration&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;trace enabled="true"&gt;&amp;lt;configuration&amp;gt;&lt;/trace&gt;&lt;/system.web&gt;&lt;/configuration&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;trace enabled="true"&gt;&amp;nbsp;&amp;lt;system.web&amp;gt;&lt;/trace&gt;&lt;/system.web&gt;&lt;/configuration&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;trace enabled="true"&gt;&amp;nbsp;&amp;nbsp; &amp;lt;trace enabled="true"&lt;/trace&gt;&lt;/system.web&gt;&lt;/configuration&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;trace enabled="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mostRecent="true"&lt;/trace&gt;&lt;/system.web&gt;&lt;/configuration&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;trace enabled="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; localOnly="true"/&amp;gt;&lt;/trace&gt;&lt;/system.web&gt;&lt;/configuration&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;trace enabled="true"&gt;&amp;nbsp;&amp;lt;/system.web&amp;gt;&lt;/trace&gt;&lt;/system.web&gt;&lt;/configuration&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;trace enabled="true"&gt;&amp;lt;/configuration&amp;gt;&lt;/trace&gt;&lt;/system.web&gt;&lt;/configuration&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;trace enabled="true"&gt;&lt;/trace&gt;&lt;/system.web&gt;&lt;/configuration&gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;trace enabled="true"&gt; &amp;nbsp;&lt;/trace&gt; &lt;br /&gt;&lt;/system.web&gt;&lt;/configuration&gt;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;In this solution, we'll look at a sample page that performs a fewdifferent actions -- it makes a call to a web service, retrieves somedata from a database, and throws an exception. Each function that we'lluse writes a trace message when it begins and ends, via astraightforward utility method called &lt;code&gt;writeTrace&lt;/code&gt;.However, it has one slightly complex aspect -- it uses theSystem.Diagnostics object to figure out the method name, so we don'thave to pass it in. The code for our sample page is as follows:&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;Example 15.2. Trace.aspx.cs (excerpt)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;using System;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;using System.Web;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;public partial class _Default : System.Web.UI.Page&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;protected void Page_Load(object sender, EventArgs e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; hitAWebservice();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; getSomeData();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; doSomeProcessing();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; breakSomething();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; displayTheResults();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;private void getSomeData()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; writeTrace(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; simulateWaiting(8000);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; writeTrace(false);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;private void hitAWebservice()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; writeTrace(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; Trace.Write("A message to demonstrate tracing.");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; simulateWaiting(2000);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; writeTrace(false);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;private void doSomeProcessing()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; writeTrace(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; simulateWaiting(1000);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; writeTrace(false);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;private void displayTheResults()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; writeTrace(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; simulateWaiting(500);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; writeTrace(false);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;private void breakSomething()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; writeTrace(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int superBig = int.MaxValue;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; superBig += 1;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; catch (Exception ex)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Trace.Warn("Exception", "Oops", ex);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;private void writeTrace(bool enteringFunction)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; if (!Trace.IsEnabled)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; return;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; string callingFunctionName = "Undetermined method";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; string action = enteringFunction ? "Entering" : "Exiting";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Determine the name of the calling function.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.StackTrace stackTrace =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new System.Diagnostics.StackTrace();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; callingFunctionName =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stackTrace.GetFrame(1).GetMethod().Name;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; catch { }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; Trace.Write(action, callingFunctionName);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;/// Wait a bit.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;/// &amp;lt;param name="waitTime"&amp;gt;Time in milliseconds to wait.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;private void simulateWaiting(int waitTime)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; System.Threading.Thread.Sleep(waitTime);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Right, we've got our trace statements in place. Now, let's assumethat this page is taking abnormally long to load, and we'd like to getto the bottom of the problem. With tracing enabled, we can simply loadthe page, then browse to &lt;code&gt;Trace.axd&lt;/code&gt; within our web site; it's at &lt;code&gt;http://localhost:1209/MySite/Trace.axd&lt;/code&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Figure 15.1 shows the first part of the Trace.axd output that was returned from the previous code.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Figure 15.1. Trace output for our sample page" height="282" src="http://i2.sitepoint.com/graphics/performance_trace-output.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Table 15.1 shows the relevant portion of the trace output.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Right away, we can see which aspect of our page load is taking the majority of time -- &lt;code&gt;getSomeData&lt;/code&gt;takes eight seconds to execute. Without this information, we might haveassumed the web service call was at fault and spent valuable timesolving the wrong problem. This example shows how, armed with some realinformation, we can begin to fix the right problem.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Snapshot of Trace Output for our Sample Page" height="211" src="http://i2.sitepoint.com/graphics/1584_table.thumb.png" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4942427404274609914-3362675132436601196?l=programmingdiscussions.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingdiscussions.blogspot.com/feeds/3362675132436601196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/speed-up-your-site-8-aspnet-performance.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/3362675132436601196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4942427404274609914/posts/default/3362675132436601196'/><link rel='alternate' type='text/html' href='http://programmingdiscussions.blogspot.com/2010/08/speed-up-your-site-8-aspnet-performance.html' title='Speed Up Your Site! 8 ASP.NET Performance Tips (part 1)'/><author><name>Laura Wilson</name><uri>http://www.blogger.com/profile/18128357619167106654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_RqHMIJJFdDU/TQDxWolgHBI/AAAAAAAAASM/V1NvNStt624/S220/48e2d4ad_img259819963.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4942427404274609914.post-7647721908691653439</id><published>2010-08-17T00:02:00.000-07:00</published><updated>2010-08-17T00:06:42.207-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips and Tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='Source code'/><title type='text'>Adding Markers to a Map Using the Google Maps API and jQuery</title><content type='html'>&lt;div style="color: black; font-family: inherit; text-align: right;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;img alt="" src="http://articles.sitepoint.com/articleresources/2010-02-09-google-maps-mona/figures/feature.png" style="float: right;" /&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;The Google Maps API provides a sophisticated way for developers and  webmasters to add custom interactive maps to their websites. Version 3 of  the API, released in May of 2009, represents a complete overhaul of the API  in response to several years worth of user feedback on the previous  version.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;In this tutorial we’ll cover a few of the API’s simpler features by  showing you how to add a map with a set of location markers to a website.  Each marker will have an associated info bubble with the name and address of  the location. What’s more, we’ll be loading the location data via Ajax, so  this can be used as the first step towards developing a more sophisticated  map-based application.&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="color: black; font-family: inherit;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black; font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;For example, if your site’s contact page shows the position of all  your retail locations on a map, you could filter them dynamically (say,  based on which ones offered certain features or were open on a given day) by  sending those parameters to the server and displaying markers on the map  based on the returned XML.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;Before we start, you should have at least a basic understanding of  jQuery. To learn more about any of the classes and methods we’ll be using,  you can consult the &lt;a class="ulink" href="http://code.google.com/apis/maps/documentation/v3/reference.html" target="_top"&gt;Google  Maps API reference&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;In this tutorial we’re going to create:&lt;/span&gt;&lt;/div&gt;&lt;div class="itemizedlist" style="color: black; font-family: inherit;"&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;an HTML file called &lt;code class="filename"&gt;markers.html&lt;/code&gt;, which will      be used to display the map and markers&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;an XML file called &lt;code class="filename"&gt;markers.xml&lt;/code&gt;, which      contains data enclosed in &lt;code class="sgmltag-element"&gt;name&lt;/code&gt;,      &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/address" title="Look up the address element in the SitePoint HTML Reference."&gt;address&lt;/a&gt;&lt;/code&gt;, &lt;code class="sgmltag-element"&gt;lat&lt;/code&gt;, and &lt;code class="sgmltag-element"&gt;lng&lt;/code&gt; tags&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;a JavaScript file called &lt;code class="filename"&gt;markers.js&lt;/code&gt;, where      we’ll put the code to load in the data and create the map&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="color: black; font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;You can &lt;a class="ulink" href="http://sitepoint-examples.s3.amazonaws.com/gmaps/markers.zip" target="_top"&gt;download  the complete source code here&lt;/a&gt; to follow along.&lt;/span&gt;&lt;/div&gt;&lt;div class="section" lang="en" style="color: black; font-family: inherit;"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=4942427404274609914" name="id2847414"&gt;&lt;/a&gt;Data Format&lt;/span&gt;&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;Before we start writing code, it’s best to examine the format of the    XML data we’ll be using to load our location data.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The coordinates and information for each marker we want to place on    our map will be contained in an XML file. This makes it easy to change it,    or have it generated automatically by a server-side script pulling the    information from a database. The XML is formatted as follows:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;lt;markers&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &amp;lt;marker&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;VODAFONE&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;address&amp;gt;near Ghumaghumalu Restaurant, Marripalem, Visakhapatnam&amp;lt;/address&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lat&amp;gt;17.74033553&amp;lt;/lat&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lng&amp;gt;83.25067267&amp;lt;/lng&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &amp;lt;/marker&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &amp;lt;marker&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &amp;lt;name&amp;gt;VODAFONE&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;address&amp;gt;near Viswa Teja School, Thatichetlapalem, Visakhapatnam&amp;lt;/address&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lat&amp;gt;17.73254774&amp;lt;/lat&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lng&amp;gt;83.29195094&amp;lt;/lng&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &amp;lt;/marker&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &amp;amp;#8942;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;lt;/markers&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;The root element is &lt;code class="sgmltag-element"&gt;markers&lt;/code&gt;, and    it contains a series of &lt;code class="sgmltag-element"&gt;marker&lt;/code&gt;    elements, each containing a text address, latitude, and longitude.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Before we can load this XML and use it to place markers on our map,    we first need to include the Google Maps JavaScript and the jQuery library    in our HTML page.&lt;/span&gt;&lt;/div&gt;&lt;div class="section" lang="en" style="color: black; font-family: inherit;"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=4942427404274609914" name="id4153068"&gt;&lt;/a&gt;jQuery and the Maps API&lt;/span&gt;&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;The two libraries we’ll be relying on for our functionality are,    unsurprisingly, jQuery and the Google Maps API library itself. As far as    jQuery is concerned, you can simply download the latest version from the    jQuery home page and include it in your HTML page as follows:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&amp;lt;script type="text/javascript" src="js/jquery-1.4.1.min.js"&amp;gt;&amp;lt;/script&amp;gt; &lt;/span&gt;&lt;/blockquote&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;&lt;script src="js/jquery-1.4.1.min.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;For the Google Maps code, we can link directly to the Google    servers:&lt;/span&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;&lt;script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;The &lt;code class="literal"&gt;sensor=false&lt;/code&gt; parameter specifies that we    don’t want to use a sensor (like a GPS locator) to determine the user’s    location.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Now that we have our basic libraries, we can start building our    functionality.&lt;/span&gt;&lt;/div&gt;&lt;div class="section" lang="en" style="color: black; font-family: inherit;"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=4942427404274609914" name="id4153120"&gt;&lt;/a&gt;Outlining the Script&lt;/span&gt;&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;Let’s start with the skeleton of our map code:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre class="programlisting"&gt;&lt;span style="font-size: small;"&gt;var MYMAP = {&lt;br /&gt;  bounds: null,&lt;br /&gt;  map: null&lt;br /&gt;}&lt;br /&gt;MYMAP.init = function(latLng, selector) {&lt;br /&gt;  ⋮&lt;br /&gt;}&lt;br /&gt;MYMAP.placeMarkers = function(filename) {&lt;br /&gt;  ⋮&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;We’re packaging all our map functionality inside a JavaScript object    called &lt;code class="varname"&gt;MYMAP&lt;/code&gt;, which will help to avoid potential    conflicts with other scripts on the page. The object contains two    variables and two functions. The &lt;code class="ref-term"&gt;&lt;a href="http://reference.sitepoint.com/html/map" title="Look up the map element in the SitePoint HTML Reference."&gt;map&lt;/a&gt;&lt;/code&gt; variable will    store a reference to the Google Map object we’ll create, an
