<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0"><channel><title>Steve Wellens </title><link>http://weblogs.asp.net/stevewellens/default.aspx</link><description>&lt;br /&gt;This Blog is dedicated to programming in the .Net enviroment</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/SteveWellens" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Why SQL Updates Fail – Three Reasons</title><link>http://weblogs.asp.net/stevewellens/archive/2009/10/16/why-sql-updates-fail-three-reasons.aspx</link><pubDate>Fri, 16 Oct 2009 14:20:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7231446</guid><dc:creator>SGWellens</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7231446</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/10/16/why-sql-updates-fail-three-reasons.aspx#comments</comments><description>&lt;P&gt;"The SQL command ran, there's no error message but nothing changed! What's going on? Do you think it's a virus? Maybe there's a bug in .NET!" &lt;/P&gt;
&lt;P&gt;The junior programmer was almost in tears when he came to me for help. Proud and confident in his abilities and faced with failure on what should have been an easy task, the poor little fellow's puffed up ego collapsed like a house of cards. I patted him gently on the shoulder and said soothingly, "It's because you're an idiot." &lt;/P&gt;
&lt;P&gt;OK, I didn't really say that. &lt;/P&gt;
&lt;P&gt;Actually, having an SQL update statement not change any records and not produce an error is expected and desirable behavior: &lt;/P&gt;
&lt;P style="MARGIN-LEFT: 36pt"&gt;If you run an update to add a late fee to all outstanding accounts over 2 weeks late and there are no late accounts….the update will succeed, no records will be modified and there will be no error message. This is as it should be. &lt;/P&gt;
&lt;P&gt;When an update does not produce an error and no records are modified, it's because &lt;EM&gt;the WHERE clause did not locate any records to update. &lt;/EM&gt;Sometimes this is OK, other times it is a mistake. &lt;/P&gt;
&lt;P&gt;Here are three ways this can happen by mistake: &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Case Sensitivity Misses: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;If the collating sequence of the database or column is case sensitive, the text in the column may not match the text in the WHERE clause: &lt;STRONG&gt;Z123 &lt;/STRONG&gt;does NOT equal &lt;STRONG&gt;z123&lt;/STRONG&gt;. In SQL Server the default is case insensitive. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Space Padded Data: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;The field type in the database may space pad the data. In SQL Server, if a column type is char(6) or nchar(6) and &lt;SPAN style="FONT-FAMILY: Courier New"&gt;'ABC'&lt;/SPAN&gt; is saved, what is actually put in the table is &lt;SPAN style="FONT-FAMILY: Courier New"&gt;'ABC&amp;nbsp;&amp;nbsp;&amp;nbsp;'&lt;/SPAN&gt; (note the 3 spaces after ABC). A search for &lt;SPAN style="FONT-FAMILY: Courier New"&gt;'ABC'&lt;/SPAN&gt; will fail because &lt;SPAN style="FONT-FAMILY: Courier New"&gt;'ABC' &lt;/SPAN&gt;does not equal &lt;SPAN style="FONT-FAMILY: Courier New"&gt;'ABC&amp;nbsp;&amp;nbsp;&amp;nbsp;'&lt;/SPAN&gt;. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Dates with Extraneous Times Stamps &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;DateTime columns have two components (Date and Time…duh). If you are searching a DateTime column either the data or the search criteria may include a timestamp that causes the search to fail: &lt;/P&gt;
&lt;P style="MARGIN-LEFT: 36pt"&gt;&lt;STRONG&gt;12-31-2000 &lt;SPAN style="TEXT-DECORATION: underline"&gt;12:23:45 AM&lt;/SPAN&gt;&lt;/STRONG&gt; does not equal &lt;STRONG&gt;12-31-2000 &lt;SPAN style="TEXT-DECORATION: underline"&gt;12:00:00 AM&lt;/SPAN&gt;&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;When storing dates, it is a best practice to truncate the time of DateTime fields so the times are zero (or 12:00:00 AM). &lt;/P&gt;
&lt;P&gt;Here is an SQL statement to scrub existing data: &lt;/P&gt;
&lt;P style="MARGIN-LEFT: 36pt"&gt;UPDATE MyTable SET MyDate = dateadd(dd, datediff(dd, 0, MyDate), 0) &lt;/P&gt;
&lt;P&gt;When searching for records you can set the search criteria to include only the date by using the Date property of the DateTime structure: &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DateTime SearchDate = DateTime.Now.&lt;STRONG&gt;Date&lt;/STRONG&gt;; &lt;/P&gt;
&lt;P&gt;Note: SQL Server 2008 has new data types of just DATE and TIME. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Bonus: Floating Point Numbers: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This is extremely rare but if you have floating point numbers in the data and expect to use an exact WHERE clause to retrieve and update data, good luck. As everyone knows who's taken Numerical Analysis 1001: &lt;/P&gt;
&lt;P style="MARGIN-LEFT: 36pt"&gt;&lt;STRONG&gt;1.50000000000&lt;/STRONG&gt; does not equal &lt;STRONG&gt;1.49999999999 &lt;/STRONG&gt;&lt;/P&gt;
&lt;P style="MARGIN-LEFT: 36pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Final: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;If you are unsure of what is going to be updated in a statement, it is easy to replace the UPDATE with a SELECT and check what is actually being retrieved. &lt;/P&gt;
&lt;P&gt;I hope this helps someone. &lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7231446" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/SQL+Database/default.aspx">SQL Database</category></item><item><title>Twin Cities Code Camp – October 24, 2009</title><link>http://weblogs.asp.net/stevewellens/archive/2009/10/14/twin-cities-code-camp-october-24-2009.aspx</link><pubDate>Wed, 14 Oct 2009 15:29:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7229802</guid><dc:creator>SGWellens</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7229802</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/10/14/twin-cities-code-camp-october-24-2009.aspx#comments</comments><description>&lt;P&gt;The seventh &lt;STRONG&gt;Twin Cities Code Camp&lt;/STRONG&gt; will be held Saturday, October 24, 2009 from 8:00 AM to 5:30 PM on the University of Minnesota Campus. &lt;/P&gt;
&lt;P&gt;For a list of sessions and a schedule, go here: &lt;A href="http://www.twincitiescodecamp.com/TCCC/Fall2009/Schedule.aspx" mce_href="http://www.twincitiescodecamp.com/TCCC/Fall2009/Schedule.aspx"&gt;http://www.twincitiescodecamp.com/TCCC/Fall2009/Schedule.aspx&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;To sign up, go here: &lt;A href="http://www.nhmn.com/Courses/CrsDetail.aspx?C=NHTCCodeCampVII" mce_href="http://www.nhmn.com/Courses/CrsDetail.aspx?C=NHTCCodeCampVII"&gt;http://www.nhmn.com/Courses/CrsDetail.aspx?C=NHTCCodeCampVII&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Hey, what else are you going to do on a Saturday in late October in Minnesota…it'll be too cold to play golf! &lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7229802" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Code+Camp/default.aspx">Code Camp</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/community+News/default.aspx">community News</category></item><item><title>CompareValidator’s Hidden Gem (It does data type validation)</title><link>http://weblogs.asp.net/stevewellens/archive/2009/09/27/comparevalidator-s-hidden-gem-it-does-data-type-validation.aspx</link><pubDate>Mon, 28 Sep 2009 01:12:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7218568</guid><dc:creator>SGWellens</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7218568</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/09/27/comparevalidator-s-hidden-gem-it-does-data-type-validation.aspx#comments</comments><description>&lt;P&gt;Man is small and the .NET environment is vast. After years of working in the .NET environment, you can still find new and amazing features. A user on the Asp.Net forums posted this feature I had never discovered…so I thought I'd pass it along. &lt;/P&gt;
&lt;P&gt;The CompareValidator is used to compare the &lt;STRONG&gt;&lt;EM&gt;value&lt;/EM&gt;&lt;/STRONG&gt; of data in a textbox but it can also validate the &lt;STRONG&gt;&lt;EM&gt;type&lt;/EM&gt;&lt;/STRONG&gt; of data entered into a textbox. &lt;/P&gt;
&lt;P&gt;It can validate these types:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;String &lt;/LI&gt;
&lt;LI&gt;Integer &lt;/LI&gt;
&lt;LI&gt;Date &lt;/LI&gt;
&lt;LI&gt;Double &lt;/LI&gt;
&lt;LI&gt;Currency &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;You have to set the Operator attribute to DataTypeCheck and the Type attribute to one of the above values. &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Here's a link with the details: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.basecomparevalidator.type.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.basecomparevalidator.type.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.basecomparevalidator.type.aspx&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Here's an example: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;TextBox&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="TextBoxInteger"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;TextBox&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;CompareValidator&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="CompareValidator1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;ControlToValidate&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="TextBoxInteger"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;Operator&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="DataTypeCheck"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;Type&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Integer"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;ErrorMessage&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Please enter an integer"&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;br&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&lt;/SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;TextBox&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="TextBoxDate"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;TextBox&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;CompareValidator&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="CompareValidator2"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;ControlToValidate&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="TextBoxDate"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;Operator&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="DataTypeCheck"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;Type&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Date"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;ErrorMessage&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Please enter a valid Date"&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;!--EndFragment--&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I hope someone finds this useful. &lt;/P&gt;
&lt;P&gt;Steve Wellens&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7218568" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/CompareValidator/default.aspx">CompareValidator</category></item><item><title>Debugging XML Transforms (XSLT) with Visual Studio</title><link>http://weblogs.asp.net/stevewellens/archive/2009/09/01/debugging-xml-transforms-xslt-with-visual-studio.aspx</link><pubDate>Wed, 02 Sep 2009 00:30:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7187965</guid><dc:creator>SGWellens</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7187965</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/09/01/debugging-xml-transforms-xslt-with-visual-studio.aspx#comments</comments><description>&lt;P&gt;&lt;STRONG&gt;XSLT&lt;/STRONG&gt; stands for Extensible Stylesheet Language Transformations. &lt;/P&gt;
&lt;P&gt;There is so much to learn in our technical world… and so little time….and for some of us, even fewer brain cells. Alas, such is the life of a nerd/dweeb/geek. &lt;/P&gt;
&lt;P&gt;The latest technology I spent brain cells on is XML Transforms. You've probably seen those mysterious little files with the XSLT extensions that do magically wondrous things to XML files. &lt;/P&gt;
&lt;P&gt;For traditional developers, XSLT is weird because it's not a traditional procedural language: "Do A, if successful then do B". XSLT uses "templates" with XPATH to select a group of nodes and then formats the selected nodes in the template body. To delve deeper into the document, XSLT uses sub-templates in a recursive tree-like fashion. However, these sub-templates are disjointed hunks of text in the XSLT document so it's difficult to visually comprehend what is going on…at least to an untrained eye. &lt;/P&gt;
&lt;P&gt;This post isn't going to explain how XSLT transforms work—it's going to explain how to run them under the Visual Studio Debugger and watch them do their magic. FYI: I only tried this with VS 2008. &lt;/P&gt;
&lt;P&gt;For more information on XSLT, go to the WC3 website &lt;A href="http://www.w3schools.com/xsl/" mce_href="http://www.w3schools.com/xsl/"&gt;here&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Here is the XML input file we are going to work with: &lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;lt;?xml version="1.0" standalone="yes"?&amp;gt;&lt;BR&gt;&amp;lt;Golfers&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;Golfer &amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ID&amp;gt;1&amp;lt;/ID&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;Bobby Jones&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Birthday&amp;gt;1902-03-17&amp;lt;/Birthday&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/Golfer&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;Golfer&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ID&amp;gt;2&amp;lt;/ID&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;Sam Snead&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Birthday&amp;gt;1912-05-27&amp;lt;/Birthday&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/Golfer&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;Golfer&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ID&amp;gt;3&amp;lt;/ID&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;Tiger Woods&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Birthday&amp;gt;1975-12-30&amp;lt;/Birthday&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/Golfer&amp;gt;&lt;BR&gt;&amp;lt;/Golfers&amp;gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Here is the XSLT file we are going to transform it with: &lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;BR&gt;&amp;lt;xsl:stylesheet xmlns:xsl="&lt;A href="http://www.w3.org/1999/XSL/Transform"&gt;http://www.w3.org/1999/XSL/Transform&lt;/A&gt;" version="1.0"&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;xsl:output method="xml"&amp;nbsp;&amp;nbsp; indent="yes"/&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;lt;xsl:template match="/Golfers"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Golfers&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:apply-templates select="Golfer"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Golfers&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/xsl:template&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;lt;xsl:template match="Golfer"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:element name="Golfer"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name="ID" &amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:value-of select="ID"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:attribute&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name="Name" &amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:value-of select="Name"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:attribute&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:attribute name="Birthday" &amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:value-of select="Birthday"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:attribute&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:element&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/xsl:template&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/P&gt;
&lt;P&gt;The transform file will turn the XML elements into attributes. Why do this? Because the .Net DataSet and DataTable classes seems to prefer XML attributes when reading XML files. And, because after studying XML for a long time, I've come to prefer sub-elements when there is a one-to-many relationship and to prefer attributes when there one-to-one relationship between the elements. &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;To start, first open up the XSLT file in Visual Studio: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;The XML tool bar should appear: &lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/XMLToolBar.jpg" mce_src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/XMLToolBar.jpg"&gt;&lt;/P&gt;
&lt;P&gt;If it doesn't appear, right click on the toolbar area and turn it on: &lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/ToolBarMenu.jpg" mce_src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/ToolBarMenu.jpg"&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Put a breakpoint in the XSLT file (F9 or use the mouse or use the Debug menu): &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/XSLTBreakPoint.jpg" mce_src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/XSLTBreakPoint.jpg"&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Click the Debug XSLT button:&lt;/STRONG&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/DebugXSLTButton.jpg" mce_src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/DebugXSLTButton.jpg"&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;The first time you run it, an open file dialog will prompt you: "Choose Input XML Document." &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Note:&lt;/STRONG&gt; Subsequently when you run it, the input file will open automatically*. &lt;/P&gt;
&lt;P&gt;The standard Debug toolbar will appear. With the toolbar you can start stepping through the transform code. Two synchronized windows will be open: &lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/TwoWindows.jpg" mce_src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/TwoWindows.jpg"&gt;&lt;/P&gt;
&lt;P&gt;In the image above, I've clicked 'step' several times. You can see in the right window that the second XML node is being processed. &lt;/P&gt;
&lt;P&gt;If you go to the Debug menu and select Locals, you can get more information about what is happening: &lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/Locals.jpg" mce_src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/Locals.jpg"&gt;&lt;/P&gt;
&lt;P&gt;You can do watches and other debugging things while the code is paused. You can see the output file being built in the window behind the input XML window. &lt;/P&gt;
&lt;P&gt;When it's all done the new XML file will look like this: &lt;/P&gt;
&lt;P&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;BR&gt;&amp;lt;Golfers&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;Golfer ID="1" Name="Bobby Jones" Birthday="1902-03-17" /&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;Golfer ID="2" Name="Sam Snead" Birthday="1912-05-27" /&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;Golfer ID="3" Name="Tiger Woods" Birthday="1975-12-30" /&amp;gt;&lt;BR&gt;&amp;lt;/Golfers&amp;gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;As my Canadian friends would say:&lt;/STRONG&gt; "That's pretty cool, eh?" &lt;/P&gt;
&lt;P&gt;*To override the automatic opening of the XML input file, right click the XSLT file and select properties. You can edit the input and output file paths and names: &lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/XSLTFileProperties.jpg" mce_src="http://weblogs.asp.net/blogs/stevewellens/2008_Sep/XSLTFileProperties.jpg"&gt;&lt;/P&gt;
&lt;P&gt;That's it. Who knew the Microsoft boys and girls would go to such depths to provide such a powerful tool.&amp;nbsp; It&amp;nbsp;was a pleasant discovery. &lt;/P&gt;
&lt;P&gt;I hope someone finds this useful. &lt;/P&gt;
&lt;P&gt;Steve Wellens&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7187965" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/XML/default.aspx">XML</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/XSLT/default.aspx">XSLT</category></item><item><title>How to Fill a ListBox/DropDownList from an Enum</title><link>http://weblogs.asp.net/stevewellens/archive/2009/08/19/how-to-fill-a-listbox-dropdownlist-from-an-enum.aspx</link><pubDate>Wed, 19 Aug 2009 16:57:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7173835</guid><dc:creator>SGWellens</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7173835</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/08/19/how-to-fill-a-listbox-dropdownlist-from-an-enum.aspx#comments</comments><description>&lt;P&gt;There was a question about this on the Asp.Net forums and after a quick search I didn't find a good generic function so I thought I'd supply one. &lt;/P&gt;
&lt;P&gt;Note: I wanted this to be as broad and useful as possible, so the second parameter is a ListControl which both the ListBox and DropDownList inherit from. &lt;/P&gt;
&lt;P&gt;I also made sure the function would handle enums that had non-contiguous values that didn't necessarily start at zero. &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;The function: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: green"&gt;// ---- EnumToListBox ------------------------------------&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: green"&gt;//&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: green"&gt;// Fills List controls (ListBox, DropDownList) with the text &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: green"&gt;// and value of enums&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: green"&gt;//&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: green"&gt;// Usage:&amp;nbsp; EnumToListBox(typeof(MyEnum), ListBox1);&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; EnumToListBox(&lt;SPAN style="COLOR: #2b91af"&gt;Type&lt;/SPAN&gt; EnumType, &lt;SPAN style="COLOR: #2b91af"&gt;ListControl&lt;/SPAN&gt; TheListBox)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;Array&lt;/SPAN&gt; Values = System.&lt;SPAN style="COLOR: #2b91af"&gt;Enum&lt;/SPAN&gt;.GetValues(EnumType);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;foreach&lt;/SPAN&gt; (&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; Value &lt;SPAN style="COLOR: blue"&gt;in&lt;/SPAN&gt; Values)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; Display = &lt;SPAN style="COLOR: #2b91af"&gt;Enum&lt;/SPAN&gt;.GetName(EnumType, Value);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;ListItem&lt;/SPAN&gt; Item = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;ListItem&lt;/SPAN&gt;(Display, Value.ToString());&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TheListBox.Items.Add(Item);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Usage:&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I tested with an existing enum and a custom enum: &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;enum&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;CustomColors&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; BLACK = -1,&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; RED = 7,&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; GREEN = 14,&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; UNKNOWN = -13&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Button1_Click(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; EnumToListBox(&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;DayOfWeek&lt;/SPAN&gt;), DropDownList1);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; EnumToListBox(&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;CustomColors&lt;/SPAN&gt;), ListBox1);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;Note: I initially tried to get the order of the items in the ListBox to match the order of the items in the enum but both the Enum.GetValues and Enum.GetNames functions return the items sorted by the value of the enum. So if you want the enums sorted a certain way, the values of the enums must be sorted that way. I think this is reasonable; how the enums are physically sorted in the source code shouldn't necessarily have any meaning. &lt;/P&gt;
&lt;P&gt;I hope someone finds this useful. &lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7173835" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/enum/default.aspx">enum</category></item><item><title>Speed Up the Visual Studio Toolbox</title><link>http://weblogs.asp.net/stevewellens/archive/2009/07/23/speed-up-the-visual-studio-toolbox.aspx</link><pubDate>Thu, 23 Jul 2009 13:19:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7153386</guid><dc:creator>SGWellens</dc:creator><slash:comments>8</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7153386</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/07/23/speed-up-the-visual-studio-toolbox.aspx#comments</comments><description>&lt;P&gt;There are plenty of tips out on the web that I see no need to repeat here. But this one made such a remarkable difference on my box that I had to post it…. &lt;/P&gt;
&lt;P&gt;I use the Auto-Hide property on the Toolbox to preserve screen real-estate. After adding the Ajax control toolkit to my environment, the Visual Studio Toolbox started to really drag. Instead of popping up quickly, the hard disk would churn for several seconds and the Toolbox would struggle, agonizingly and with apparently great reluctance, to appear. &lt;/P&gt;
&lt;P&gt;When it did eventually appear, random sections of the Toolbox would be open. It didn't remember which tab was last used. Assuming the logic is in a background thread, I can only assume the thread was poorly written. If it was tested, the test results were ignored. &lt;/P&gt;
&lt;P&gt;Thank goodness for the TooboxAutoPopulate setting. &lt;/P&gt;
&lt;P&gt;Tools-&amp;gt;Options-&amp;gt;Windows Forms Designer-&amp;gt;General&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;IMG style="WIDTH: 644px; HEIGHT: 376px" src="http://weblogs.asp.net/blogs/stevewellens/2009_Jul/AutoToolBoxPopulate.png" width=644 height=376 mce_src="http://weblogs.asp.net/blogs/stevewellens/2009_Jul/AutoToolBoxPopulate.png"&gt;&lt;/P&gt;
&lt;P&gt;Setting AutoToolboxPopulate to False brought my machine back from the abyss of lost productivity caused by slow, clunky, energy-sapping GUI delays. Although the setting is under Windows Forms Designer, it is just as effective for ASP.Net developers (it's the same Toolbox). &lt;/P&gt;
&lt;P&gt;I hope someone finds this helpful. &lt;/P&gt;
&lt;P&gt;Steve Wellens&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7153386" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ToolBox/default.aspx">ToolBox</category></item><item><title>What’s the Deal with Interfaces?</title><link>http://weblogs.asp.net/stevewellens/archive/2009/07/17/what-s-the-deal-with-interfaces.aspx</link><pubDate>Sat, 18 Jul 2009 00:15:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7149475</guid><dc:creator>SGWellens</dc:creator><slash:comments>8</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7149475</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/07/17/what-s-the-deal-with-interfaces.aspx#comments</comments><description>&lt;P&gt;This post is for beginners. &lt;/P&gt;
&lt;P&gt;Many beginners struggle with the concept of an Interface. Over on the Asp.Net forums, where I moderate, the question is asked a surprising number of times. I'm going to try to describe and explain the concept of an &lt;STRONG&gt;Interface&lt;/STRONG&gt;…simply and concisely. &lt;/P&gt;
&lt;P&gt;Let's say we are going to program a game and the game needs a random number generator. &lt;/P&gt;
&lt;P&gt;We want to try different random number generators because all random number generators are not created equal. To make it easy to switch number generators, we will use an Interface. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;The Interface: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;So, here is the (simple as possible) Interface for our Random Number Generator: &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;interface&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;IRandomNumberGen&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; GetNextNumber();&amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;Notes: &lt;/P&gt;
&lt;P&gt;The &lt;STRONG&gt;public&lt;/STRONG&gt; keyword is not needed (or even allowed) on the GetNextNumber() method. An interface declares &lt;EM&gt;access&lt;/EM&gt; methods so by default they must be public. A private method in an interface makes no sense...and causes an error.&lt;/P&gt;
&lt;P&gt;An Interface cannot contain fields. Doing so causes an error.&lt;/P&gt;
&lt;P&gt;Hmmm&lt;EM&gt;,&lt;/EM&gt; it seems &lt;EM&gt;an Interface is a collection of empty functions that are implicitly public.&lt;/EM&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Derive some Classes from the Interface: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Here are two Random Number Generators each inheriting from our Interface. &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;RandomNumberCoinFlip&lt;/SPAN&gt; : &lt;SPAN style="COLOR: #2b91af"&gt;IRandomNumberGen&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; GetNextNumber()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// flip a coin for each bit of the number&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; 1;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;String&lt;/SPAN&gt; CoinType; &lt;SPAN style="COLOR: green"&gt;// penny, nickel, dime, etc.&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;RandomNumberOuija&lt;/SPAN&gt;&amp;nbsp; : &lt;SPAN style="COLOR: #2b91af"&gt;IRandomNumberGen&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; GetNextNumber()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Use a Ouija board to get a number&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; 2;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Notes: &lt;/P&gt;
&lt;P&gt;Both classes implement the GetNextNumber() function. One class has an additional field…but that's OK; it doesn't matter: &lt;/P&gt;
&lt;P style="MARGIN-LEFT: 36pt"&gt;As long as a class implements the functions in the Interface, it can do anything else it pleases. But a class derived from an Interface must implement the functions in the Interface. &lt;/P&gt;
&lt;P&gt;So big deal, what have we accomplished? &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Here are the Classes in Use: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Button1_Click(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;IRandomNumberGen&lt;/SPAN&gt; Generator;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Generator = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;RandomNumberCoinFlip&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Response.Write(Generator.GetNextNumber() + &lt;SPAN style="COLOR: #a31515"&gt;"&amp;lt;br /&amp;gt;"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Generator = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;RandomNumberOuija&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Response.Write(Generator.GetNextNumber() + &lt;SPAN style="COLOR: #a31515"&gt;"&amp;lt;br /&amp;gt;"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;!--EndFragment--&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Notes:&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The Generator reference can be assigned to any object created from a class derived from the IRandomNumberGen Interface and it can call the GetNextNumber() method. It doesn't know or care about any part of the class except the&amp;nbsp;methods it expects to be there. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Here’s another usage example:&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; MakeAMove(&lt;SPAN style="COLOR: #2b91af"&gt;IRandomNumberGen&lt;/SPAN&gt; NumberGenerator)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; Number = NumberGenerator.GetNextNumber();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// do something with Random Number&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Button1_Click(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; MakeAMove(&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;RandomNumberCoinFlip&lt;/SPAN&gt;());&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; MakeAMove(&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;RandomNumberOuija&lt;/SPAN&gt;());&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;!--EndFragment--&gt;Notes:&lt;/P&gt;
&lt;P&gt;This shows a&amp;nbsp;function that takes an Interface as a parameter.&amp;nbsp; Any object derived from the Interface can be passed to the function.&lt;/P&gt;
&lt;P&gt;That's cool but the same thing could be accomplished with an abstract base class and virtual functions. So what's the deal with Interfaces? &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Multiple-Inheritance is not Supported in .Net….Except for Interfaces! &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Here is one more class that implements the Interface. In addition to IRandomNumberGen, it implements IDisposable. &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;RandomNumberDeckOfCards&lt;/SPAN&gt; :&amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;IRandomNumberGen&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #2b91af"&gt;IDisposable&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; GetNextNumber()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Shuffle deck, pick a card&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; 3;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Dispose()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// free up deck &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;And here it is being used: &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Button1_Click(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;IRandomNumberGen&lt;/SPAN&gt; Generator;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Generator = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;RandomNumberDeckOfCards&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Response.Write(Generator.GetNextNumber() + &lt;SPAN style="COLOR: #a31515"&gt;"&amp;lt;br /&amp;gt;"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;IDisposable&lt;/SPAN&gt; Disposer = Generator &lt;SPAN style="COLOR: blue"&gt;as&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;IDisposable&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Disposer.Dispose();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;!--EndFragment--&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Notes: &lt;/P&gt;
&lt;P&gt;As before, an IRandomNumberGen reference can be assigned to the object and the GetNextNumber() method called. &lt;/P&gt;
&lt;P&gt;In addition, an IDisposable reference can be assigned (with a cast) to the object since it implements IDisposable and the Dispose() method can be called. &lt;/P&gt;
&lt;P&gt;In the above code, the two Interface references, Generator and Disposer, &lt;EM&gt;both point to the same object&lt;/EM&gt;. They have different 'views' of the same object. And that, is the deal with interfaces. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Finale: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;I know there are thousands of articles around explaining this concept which is odd because once understood, the concept is trivial. But sometimes one explanation "fits the brain" better than another explanation. I hope this explanation fits someone's brain. &lt;/P&gt;
&lt;P&gt;Steve Wellens&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7149475" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Interface/default.aspx">Interface</category></item><item><title>Serializing and Deserializing Objects…to and from…XML</title><link>http://weblogs.asp.net/stevewellens/archive/2009/07/02/serializing-and-deserializing-objects-to-and-from-xml.aspx</link><pubDate>Thu, 02 Jul 2009 16:00:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7138336</guid><dc:creator>SGWellens</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7138336</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/07/02/serializing-and-deserializing-objects-to-and-from-xml.aspx#comments</comments><description>&lt;P&gt;Over on the Asp.Net forums I recently had the opportunity* to help a few lost souls by showing them how to serialize objects to XML and deserialize the XML back into&amp;nbsp;objects. Since the question has come up more than once, I decided to BLOG it so I could refer similar questions in the future&amp;nbsp;to this&amp;nbsp;post.&lt;/P&gt;
&lt;P&gt;*I use the word opportunity because by helping others I am forced to think hard about the technology and to think even harder about how to communicate the technology. It makes me better at what I do. All right then, enough after-school-special-feel-good-about-yourself-I'm-ok-you're-ok fluffy nonsense… on with the code: &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;Here is a simple class I'm going to work with.&lt;/SPAN&gt; &lt;/STRONG&gt;It has both properties and fields: &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;MyClass&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// old school property&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; _Age;&amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; Age&amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt; { &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; _Age; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;set&lt;/SPAN&gt; { _Age = &lt;SPAN style="COLOR: blue"&gt;value&lt;/SPAN&gt;; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// new school property&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;bool&lt;/SPAN&gt; Citizen { &lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;; &lt;SPAN style="COLOR: blue"&gt;set&lt;/SPAN&gt;; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// there's nothing wrong with using fields&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; Name;&amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Here are the two functions to Serialize and Deserialize an object: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; ---- SerializeAnObject -----------------------------&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; Serializes an object to an XML string&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;param name="AnObject"&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;The Object to serialize&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;returns&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;XML string&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;/returns&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; SerializeAnObject(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; AnObject)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;XmlDocument&lt;/SPAN&gt; XmlDoc = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;XmlDocument&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;XmlSerializer&lt;/SPAN&gt; Xml_Serializer = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;XmlSerializer&lt;/SPAN&gt;(AnObject.GetType()); &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;MemoryStream&lt;/SPAN&gt; MemStream = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;MemoryStream&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;try&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; { &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Xml_Serializer.Serialize(MemStream, AnObject); &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MemStream.Position = 0; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; XmlDoc.Load(MemStream); &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; XmlDoc.InnerXml; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;finally&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; { &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MemStream.Close(); &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; ---- DeSerializeAnObject ------------------------------&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; DeSerialize an object&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;param name="XmlOfAnObject"&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;The XML string&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;param name="ObjectType"&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;The type of object&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;returns&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;A deserialized object...must be cast to correct type&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;/returns&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;Object&lt;/SPAN&gt; DeSerializeAnObject(&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; XmlOfAnObject, &lt;SPAN style="COLOR: #2b91af"&gt;Type&lt;/SPAN&gt; ObjectType)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;StringReader&lt;/SPAN&gt; StrReader = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;StringReader&lt;/SPAN&gt;(XmlOfAnObject);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;XmlSerializer&lt;/SPAN&gt; Xml_Serializer = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;XmlSerializer&lt;/SPAN&gt;(ObjectType);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;XmlTextReader&lt;/SPAN&gt; XmlReader = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;XmlTextReader&lt;/SPAN&gt;(StrReader);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;try&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;Object&lt;/SPAN&gt; AnObject = Xml_Serializer.Deserialize(XmlReader);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; AnObject;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;finally&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; XmlReader.Close();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; StrReader.Close();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;BR&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Here is some sample code showing how to use the functions. &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Note: I keep these&amp;nbsp;functions (and other functions) in a class I call MiscUtilities. You will have to modify the code…depending on where you place the functions. &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Button1_Click(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// create and initialize an object&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;MyClass&lt;/SPAN&gt; Test = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;MyClass&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Test.Age = 18;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Test.Name = &lt;SPAN style="COLOR: #a31515"&gt;"Rocky Balboa"&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Test.Citizen = &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;//&amp;nbsp; Serialize it&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;String&lt;/SPAN&gt; XML;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; XML = &lt;SPAN style="COLOR: #2b91af"&gt;MiscUtilities&lt;/SPAN&gt;.SerializeAnObject(Test);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Deserialize it&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;MyClass&lt;/SPAN&gt; Test2;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Test2 = &lt;SPAN style="COLOR: #2b91af"&gt;MiscUtilities&lt;/SPAN&gt;.DeSerializeAnObject(XML, &lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;MyClass&lt;/SPAN&gt;)) &lt;SPAN style="COLOR: blue"&gt;as&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;MyClass&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// TODO:&amp;nbsp; Get a cup of coffee and bask in the glory of rock solid code.&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Here is what the XML string looks like (after formatting): &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;?&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;xml&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;version&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;1.0&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;?&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;MyClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;xmlns:xsi&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;xmlns:xsd&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;http://www.w3.org/2001/XMLSchema&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;Rocky Balboa&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Age&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;18&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Age&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Citizen&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;true&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Citizen&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;MyClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;There &lt;EM&gt;are&lt;/EM&gt; limitations: XmlSerializer does not serialize private fields, methods, indexers or read-only fields. &lt;/P&gt;
&lt;P&gt;Once you have the XML string, you can email it, store it in a database, save it to disk, or…print a copy of it and have your mom tape it to the refrigerator next to the turkey picture you made in the second grade by tracing around your hand with a Crayola crayon. &lt;/P&gt;
&lt;P&gt;I hope someone finds this useful. &lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7138336" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/XML/default.aspx">XML</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Serialize/default.aspx">Serialize</category></item><item><title>AH, Ah, ah, ah…Staying Alive…Staying Alive</title><link>http://weblogs.asp.net/stevewellens/archive/2009/06/09/ah-ah-ah-ah-staying-alive-staying-alive.aspx</link><pubDate>Tue, 09 Jun 2009 22:31:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7115212</guid><dc:creator>SGWellens</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7115212</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/06/09/ah-ah-ah-ah-staying-alive-staying-alive.aspx#comments</comments><description>&lt;P&gt;Sometimes you want your web page to 'stay alive'. That is, if a user is filling out a complicated form, you do not want the session to time out before they are finished. The user could get very angry and rightfully so: You might even get yelled at! &lt;/P&gt;
&lt;P&gt;It's not simply a matter of increasing the session timeout to a very large value. If you do that, the sessions would be left active in the server memory for hours—long after the visitors have left the site. Increasing the session timeout IS a solution… but not necessarily a &lt;EM&gt;good&lt;/EM&gt; solution. &lt;/P&gt;
&lt;P&gt;The goal is that the session should stay active as long as the web page is open on the client machine …even if there are no post backs to reset the session timer. When the web page is closed, the session should time out normally. &lt;/P&gt;
&lt;P&gt;I implemented a solution for this: The client will "ping" the server at intervals of less than the session timeout which will reset the session timer. This is known as the &lt;STRONG&gt;Heartbeat&lt;/STRONG&gt; design pattern (I couldn't find a decent site/page to link to). &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Miscellaneous Setup Stuff: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;For testing purposes, I set the Session Timeout to two minutes in &lt;STRONG&gt;web.config&lt;/STRONG&gt;: &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;system.web&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;sessionState&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;timeout&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;2&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;sessionState&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;To trace what is happening, I used a utility function called ODS (it's in a class called MiscUtilities): &lt;/PRE&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; ---- ODS ---------------------------------------&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; Output Debug String with time stamp.&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; ODS(&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; Msg)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;String&lt;/SPAN&gt; Out = &lt;SPAN style="COLOR: #2b91af"&gt;String&lt;/SPAN&gt;.Format(&lt;SPAN style="COLOR: #a31515"&gt;"{0}&amp;nbsp; {1}"&lt;/SPAN&gt;, &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;                       &lt;SPAN style="COLOR: #2b91af"&gt;DateTime&lt;/SPAN&gt;.Now.ToString(&lt;SPAN style="COLOR: #a31515"&gt;"hh:mm:ss.ff"&lt;/SPAN&gt;), Msg);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; System.Diagnostics.&lt;SPAN style="COLOR: #2b91af"&gt;Debug&lt;/SPAN&gt;.WriteLine(Out);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;!--EndFragment--&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;To watch the Session State events, I added debugging strings to the &lt;STRONG&gt;global.asax &lt;/STRONG&gt;file: &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="BACKGROUND: #ffee62"&gt;&amp;lt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;@&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;Application&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Language&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="C#"&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND: #ffee62"&gt;%&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;script&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;RunAt&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Application_Start(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;MiscUtilities&lt;/SPAN&gt;.ODS(&lt;SPAN style="COLOR: #a31515"&gt;"****ApplicationStart"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Session_Start(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;MiscUtilities&lt;/SPAN&gt;.ODS(&lt;SPAN style="COLOR: #a31515"&gt;"Session_Start"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Session_End(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;MiscUtilities&lt;/SPAN&gt;.ODS(&lt;SPAN style="COLOR: #a31515"&gt;"Session_End"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Here are the details: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;We need a method at the &lt;STRONG&gt;server&lt;/STRONG&gt; for the client to call. We use a &lt;STRONG&gt;WebMethod. &lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;There must be a ScriptManager on the page. &lt;/LI&gt;
&lt;LI&gt;The ScriptManager must have EnablePageMethods set to true. &lt;/LI&gt;
&lt;LI&gt;The WebMethod must be public and static. &lt;/LI&gt;
&lt;LI&gt;The WebMethod must have the EnableSession attribute set to true. &lt;/LI&gt;&lt;/OL&gt;&lt;SPAN style="FONT-FAMILY: Courier New; FONT-SIZE: 10pt"&gt;&lt;SPAN style="COLOR: blue"&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;ScriptManager&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="ScriptManager1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;&lt;STRONG&gt;EnablePageMethods&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;STRONG&gt;="true&lt;/STRONG&gt;"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;ScriptManager&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;partial&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;_Default&lt;/SPAN&gt; : System.Web.UI.&lt;SPAN style="COLOR: #2b91af"&gt;Page&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; [&lt;SPAN style="COLOR: #2b91af"&gt;WebMethod&lt;/SPAN&gt;(EnableSession=&lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt; ) ]&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; PokePage()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// called by client to refresh session&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;MiscUtilities&lt;/SPAN&gt;.ODS(&lt;SPAN style="COLOR: #a31515"&gt;"Server: I am poked"&lt;/SPAN&gt;);&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P style="BACKGROUND: white"&gt;&lt;!--EndFragment--&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="BACKGROUND: white"&gt;We need JavaScript at the &lt;STRONG&gt;client&lt;/STRONG&gt; to call the server function at fixed intervals: &lt;/P&gt;&lt;SPAN style="FONT-FAMILY: Courier New; FONT-SIZE: 10pt"&gt;&lt;SPAN style="COLOR: blue"&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;script&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;type&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="text/javascript"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;var&lt;/SPAN&gt; HeartBeatTimer;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;function&lt;/SPAN&gt; StartHeartBeat()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// pulse every 10 seconds&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (HeartBeatTimer == &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; HeartBeatTimer = setInterval(&lt;SPAN style="COLOR: #a31515"&gt;"HeartBeat()"&lt;/SPAN&gt;, 1000 * 10);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;function&lt;/SPAN&gt; HeartBeat()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// note: ScriptManger must have: EnablePageMethods="true"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Sys.Debug.trace(&lt;SPAN style="COLOR: #a31515"&gt;"Client: Poke Server"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PageMethods.PokePage();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;/DIV&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;body&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;id&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="MyBody"&lt;/SPAN&gt;&amp;nbsp; &lt;SPAN style="COLOR: red"&gt;onload&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="StartHeartBeat();"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P style="BACKGROUND: white"&gt;&lt;!--EndFragment--&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="BACKGROUND: white"&gt;Here is what the output looks like &lt;STRONG&gt;without&lt;/STRONG&gt; the heartbeat: &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P style="BACKGROUND: white"&gt;10:22:43.03&amp;nbsp; ****ApplicationStart&lt;BR&gt;10:22:45.13&amp;nbsp; Session_Start&lt;BR&gt;10:25:00.00&amp;nbsp; Session_End&amp;nbsp;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P style="BACKGROUND: white"&gt;Here is the output &lt;STRONG&gt;with&lt;/STRONG&gt; the heartbeat: &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P style="BACKGROUND: white"&gt;10:26:06.10&amp;nbsp; ****ApplicationStart&lt;BR&gt;10:26:08.05&amp;nbsp; Session_Start&lt;BR&gt;Client: Poke Server&lt;BR&gt;10:26:18.93&amp;nbsp; Server: I am poked&lt;BR&gt;Client: Poke Server&lt;BR&gt;10:26:28.95&amp;nbsp; Server: I am poked&lt;BR&gt;Client: Poke Server&lt;BR&gt;10:26:38.96&amp;nbsp; Server: I am poked&lt;BR&gt;Client: Poke Server&lt;BR&gt;10:26:48.98&amp;nbsp; Server: I am poked&lt;/P&gt;
&lt;P style="BACKGROUND: white"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . . . (lines deleted)&lt;/P&gt;
&lt;P style="BACKGROUND: white"&gt;Client: Poke Server&lt;BR&gt;10:29:59.45&amp;nbsp; Server: I am poked&lt;BR&gt;Client: Poke Server&lt;BR&gt;10:30:09.47&amp;nbsp; Server: I am poked&lt;BR&gt;Client: Poke Server&lt;BR&gt;10:30:19.48&amp;nbsp; Server: I am poked&lt;/P&gt;
&lt;P style="BACKGROUND: white"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . . . (lines deleted)&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P style="BACKGROUND: white"&gt;It looks like the session is staying alive while the client is idle: Excellent! &lt;/P&gt;
&lt;P style="BACKGROUND: white"&gt;I hope someone finds this useful. &lt;/P&gt;
&lt;P style="BACKGROUND: white"&gt;Steve Wellens &lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7115212" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Session+State/default.aspx">Session State</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/WebMethod/default.aspx">WebMethod</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Session+Timeout/default.aspx">Session Timeout</category></item><item><title>Why goto Still Exists in C#</title><link>http://weblogs.asp.net/stevewellens/archive/2009/06/01/why-goto-still-exists-in-c.aspx</link><pubDate>Mon, 01 Jun 2009 18:36:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7105242</guid><dc:creator>SGWellens</dc:creator><slash:comments>20</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7105242</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/06/01/why-goto-still-exists-in-c.aspx#comments</comments><description>&lt;P&gt;Developers, Software Engineers, and Programmers are logical, rational, reasonable people right? Sure they are…until you disagree with something they believe in. Then they can become the most enflamed, outraged, foaming-at-the-mouth, intolerant, lunatics you've ever had the pleasure of meeting. &lt;/P&gt;
&lt;P&gt;Take for instance the &lt;STRONG&gt;goto&lt;/STRONG&gt; command. It can create emotions as intense as those raised during the ancient 'tabs versus spaces' debates or whether or not curly braces should be aligned in columns. (For the record, developers who use tabs and don't line up curly braces also kick puppies and do not practice good hygiene). &lt;/P&gt;
&lt;P&gt;You can program for years and never use a &lt;STRONG&gt;goto&lt;/STRONG&gt;. However, there are times when a goto can make the code simpler and that…is a very good thing. &lt;/P&gt;
&lt;P&gt;Here's a scenario: You are working on a multi-threaded real-time program. You can't use the debugger because stepping through the code would mess up the timings and interactions between the threads. You also need something to help diagnose problems in the field.&amp;nbsp; A runtime log that can be turned on and off is used. &lt;EM&gt;The requirement is that every function will log its entry and exit point.&lt;/EM&gt; That way if something goes wrong, the log will show what function failed and where it failed. &lt;/P&gt;
&lt;P&gt;In one area of the program, you need to perform several steps in sequence. If any step fails, the remaining steps must not execute. &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Here's the first attempt:&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: green"&gt;// Do Process using nested if statements&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; DoProcess1()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; LOG(&lt;SPAN style="COLOR: #a31515"&gt;"DoProcess Started..."&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Step1() == &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Step2() == &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Step3() == &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Step4() == &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Step5() == &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&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;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Step6() == &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&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; Step7();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; LOG(&lt;SPAN style="COLOR: #a31515"&gt;"DoProcess Finished"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;!--EndFragment--&gt;Sure it works but getting code to work is only the first step. Creating clear, maintainable code is the goal. If the code can be simplified, you are not done. &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Second attempt, use a flag variable: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: green"&gt;// Do Process using a success flag&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; DoProcess2()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; LOG(&lt;SPAN style="COLOR: #a31515"&gt;"DoProcess Started..."&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;bool&lt;/SPAN&gt; Success;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Success = Step1();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Success == &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Success = Step2();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Success == &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Success = Step3();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Success == &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Success = Step4();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Success == &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Success = Step5();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Success == &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Success = Step6();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Success == &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Success = Step7();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; LOG(&lt;SPAN style="COLOR: #a31515"&gt;"DoProcess Finished"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;!--EndFragment--&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;That's better but it can be simplified further: &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Third attempt with goto: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: green"&gt;// DoProcess using goto&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; DoProcess3()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; LOG(&lt;SPAN style="COLOR: #a31515"&gt;"DoProcess Started..."&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Step1() == &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;goto&lt;/SPAN&gt; EXIT;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Step2() == &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;goto&lt;/SPAN&gt; EXIT;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Step3() == &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;goto&lt;/SPAN&gt; EXIT;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Step4() == &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;goto&lt;/SPAN&gt; EXIT;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Step5() == &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;goto&lt;/SPAN&gt; EXIT;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Step6() == &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;goto&lt;/SPAN&gt; EXIT;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Step7() == &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;goto&lt;/SPAN&gt; EXIT;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;EXIT:&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; LOG(&lt;SPAN style="COLOR: #a31515"&gt;"DoProcess Finished"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;!--EndFragment--&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;The creation, assigning and checking of a variable has been eliminated. It also runs faster but the speed improvement is insignificant and not a reason for using a goto. &lt;/P&gt;
&lt;P&gt;The example is trivial, however in real life, being able to jump to the end of complicated functions can dramatically reduce the complexity of code. &lt;/P&gt;
&lt;P&gt;Before you disagree with the inclusion of the goto in the C# language, remember you are disagreeing with the people who created the language. &lt;STRONG&gt;&lt;EM&gt;You are also disagreeing with Steve McConnel the author of "Code Complete". Here's his chapter on &lt;/EM&gt;&lt;/STRONG&gt;&lt;A href="http://www.stevemcconnell.com/ccgoto.htm" mce_href="http://www.stevemcconnell.com/ccgoto.htm"&gt;&lt;STRONG&gt;&lt;EM&gt;gotos&lt;/EM&gt;&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt;&lt;EM&gt;. &lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;In my career, I've only used a goto once and I had to present the code to a code-review group of four developers. When I showed the code with and without the goto, they unanimously agreed without any discussion that goto was…the way to go. Pun intended. &lt;/P&gt;
&lt;P&gt;I hope someone finds this helpful. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;[Update: July 3, 2009]&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Here are two more examples of when a goto is helpful. The first is from Charles Petzold’s book “.Net Book Zero” a free pdf book available at &lt;A href="http://www.charlespetzold.com/"&gt;http://www.charlespetzold.com/&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;A switch “fall through” is illegal in C# (this causes a compiler error):&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;switch&lt;/SPAN&gt; (a) &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{ &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;case&lt;/SPAN&gt; 3: &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; b = 7; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;case&lt;/SPAN&gt; 4: &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c = 3; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;break&lt;/SPAN&gt;; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;default&lt;/SPAN&gt;: &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; b = 2; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c = 4; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;break&lt;/SPAN&gt;; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;!--EndFragment--&gt;To get it to work you can use a goto: &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;switch&lt;/SPAN&gt; (a) &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{ &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;case&lt;/SPAN&gt; 3: &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; b = 7;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;goto&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;case&lt;/SPAN&gt; 4;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;case&lt;/SPAN&gt; 4: &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c = 3; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;break&lt;/SPAN&gt;; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;default&lt;/SPAN&gt;: &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; b = 2; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c = 4; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;break&lt;/SPAN&gt;; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;&amp;nbsp;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;This example shows better how to cleanly get out of&amp;nbsp;nested loops/code.&amp;nbsp; The task is to search a three dimensional array and check for a null value: &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;bool&lt;/SPAN&gt; GetData()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;String&lt;/SPAN&gt;[,,] Data = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;String&lt;/SPAN&gt;[5, 5, 5];&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// ....code to fill in array here&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;for&lt;/SPAN&gt; (&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; x = 0; x &amp;lt; 5; x++)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;for&lt;/SPAN&gt; (&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; y = 0; y &amp;lt; 5; y++)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;for&lt;/SPAN&gt; (&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; z = 0; z &amp;lt; 5; z++)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Data[x, y, z] == &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;goto&lt;/SPAN&gt; NULL_FOUND;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;NULL_FOUND:&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Response.Write(&lt;SPAN style="COLOR: #a31515"&gt;"Invalid Data"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;Steve Wellens&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7105242" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/goto/default.aspx">goto</category></item><item><title>Quick and Dirty Automatic Page Navigator</title><link>http://weblogs.asp.net/stevewellens/archive/2009/05/14/quick-and-dirty-automatic-page-navigator.aspx</link><pubDate>Thu, 14 May 2009 21:39:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7087424</guid><dc:creator>SGWellens</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7087424</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/05/14/quick-and-dirty-automatic-page-navigator.aspx#comments</comments><description>&lt;P&gt;Over on the Asp.Net forums, a user asked how to store an ordered list of pages in an Xml file so he could use it to control the navigation of a group of pages on his web site. It was for a 'Wizard' where the user needed to go through the pages in sequence…no jumping directly to a page. He wanted it to be easily editable. &lt;/P&gt;
&lt;P&gt;I thought about it and decided that Xml was overkill. There is no hierarchical data structure required. A simple text file would suffice (although it's not as sexy&amp;nbsp;as Xml is) and there are more text editors than Xml editors….long live Notepad! &lt;/P&gt;
&lt;P&gt;I thought about it some more and realized that once the contents of the text file was read in, it should be cached so that each page with the navigation control didn't have to reread it. &lt;/P&gt;
&lt;P&gt;Yet more thought: Why put the list of pages in a separate file? If you are going to make a navigation control, why not put the list into the control where it's used? True, it's not a generic control in a traditional sense, but if you are going to have to edit the list of pages anyway, why not do it in the control? &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Quick and dirty can be bad, but simple is always good…yah?&lt;/EM&gt; &lt;/P&gt;
&lt;P&gt;Well one thing led to another and I ended up writing a page navigation user control: &lt;/P&gt;
&lt;P&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;IMG src="http://weblogs.asp.net/blogs/stevewellens/2009_May/QuickAndDirtyNavigation.png" mce_src="http://weblogs.asp.net/blogs/stevewellens/2009_May/QuickAndDirtyNavigation.png"&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Features: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Pages are easily removed and added to the array of strings in the control (edit the file).&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The array of strings (pages) is static so there is only one copy in memory. &lt;/P&gt;
&lt;P&gt;Navigation is automatic. &lt;/P&gt;
&lt;P&gt;The Prev and Next buttons are automatically enabled and disabled. &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Usage: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Edit the list of pages in the control. &lt;/P&gt;
&lt;P&gt;Drop the User Control on each page to be navigated...or drop it on a Master Page. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Here's the UC_Navigator.ascx file (UC is for User Control).&amp;nbsp; It's basically two buttons in a div.&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="BACKGROUND: #ffee62"&gt;&amp;lt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;@&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;Control&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Language&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="C#"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;AutoEventWireup&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="true"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;CodeFile&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="UC_Navigator.ascx.cs"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;Inherits&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="UserControls_UC_Navigator"&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND: #ffee62"&gt;%&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;div&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;style&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;border-style&lt;/SPAN&gt;:&lt;SPAN style="COLOR: blue"&gt;ridge&lt;/SPAN&gt;; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: red"&gt;border-width&lt;/SPAN&gt;:&lt;SPAN style="COLOR: blue"&gt;medium&lt;/SPAN&gt;;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: red"&gt;padding&lt;/SPAN&gt;: &lt;SPAN style="COLOR: blue"&gt;5px&lt;/SPAN&gt;; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: red"&gt;background-color&lt;/SPAN&gt;:&lt;SPAN style="COLOR: blue"&gt;#808080&lt;/SPAN&gt;;&amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: red"&gt;text-align&lt;/SPAN&gt;:&lt;SPAN style="COLOR: blue"&gt;center&lt;/SPAN&gt;; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: red"&gt;width&lt;/SPAN&gt;: &lt;SPAN style="COLOR: blue"&gt;134px&lt;/SPAN&gt;; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: red"&gt;vertical-align&lt;/SPAN&gt;: &lt;SPAN style="COLOR: blue"&gt;middle&lt;/SPAN&gt;;&lt;SPAN style="COLOR: blue"&gt;"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Button&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="ButtonPrev"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;OnClick&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="ButtonPrev_Click"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Text&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Prev"&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Button&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="ButtonNext"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;OnClick&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="ButtonNext_Click"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Text&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Next"&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;div&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;&lt;STRONG&gt;Here's the code-behind file: &lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt; System;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt; System.Collections.Generic;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt; System.Web;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt; System.Web.UI;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt; System.Web.UI.WebControls;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt; System.IO;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;partial&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;UserControls_UC_Navigator&lt;/SPAN&gt; : System.Web.UI.&lt;SPAN style="COLOR: #2b91af"&gt;UserControl&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// list of pages to navigate - in order&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// page names must be in lower case&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;String&lt;/SPAN&gt;[] Pages =&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #a31515"&gt;"default.aspx"&lt;/SPAN&gt;,&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #a31515"&gt;"child1.aspx"&lt;/SPAN&gt;,&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #a31515"&gt;"exportcalendar.aspx"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; };&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;enum&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;DIRECTION&lt;/SPAN&gt; { PREV, NEXT }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// ---- Page_Load ----------------------------&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;//&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Disable Prev/Next buttons when appropriate&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Page_Load(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; CurrentIndex = GetCurrentIndex();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (CurrentIndex == 0)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ButtonPrev.Enabled = &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (CurrentIndex == Pages.Length - 1)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ButtonNext.Enabled = &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// ---- GetCurrentIndex ----------------------------------&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;//&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Gets the index of the current page &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// (from the array of Pages)&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;//&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// returns -1 if the Page isn't in the Pages array&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; GetCurrentIndex()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;String&lt;/SPAN&gt; CurrentPage;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// get the current page the User Control is on (from parent page)&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CurrentPage = Parent.BindingContainer.TemplateControl.AppRelativeVirtualPath;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// get filename only and force lower case&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CurrentPage = &lt;SPAN style="COLOR: #2b91af"&gt;Path&lt;/SPAN&gt;.GetFileName(CurrentPage).ToLower();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// get the index from the page array&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; CurrentIndex = &lt;SPAN style="COLOR: #2b91af"&gt;Array&lt;/SPAN&gt;.IndexOf(Pages, CurrentPage);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; CurrentIndex;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// ---- MoveToPage ---------------------------------&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;//&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Moves to previous, or next page if possible&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; MoveToPage(&lt;SPAN style="COLOR: #2b91af"&gt;DIRECTION&lt;/SPAN&gt; Direction)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; CurrentIndex = GetCurrentIndex();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Direction == &lt;SPAN style="COLOR: #2b91af"&gt;DIRECTION&lt;/SPAN&gt;.PREV)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (CurrentIndex == 0)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// can't move before first page&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;//Response.Redirect(Pages[CurrentIndex - 1]);&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Server.Transfer(Pages[CurrentIndex - 1]);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Direction == &lt;SPAN style="COLOR: #2b91af"&gt;DIRECTION&lt;/SPAN&gt;.NEXT)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (CurrentIndex == Pages.Length - 1)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// can't move after last page&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;//Response.Redirect(Pages[CurrentIndex + 1]);&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Server.Transfer(Pages[CurrentIndex + 1]);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// ---- Navigation buttons ---------------------------&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; ButtonPrev_Click(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MoveToPage(&lt;SPAN style="COLOR: #2b91af"&gt;DIRECTION&lt;/SPAN&gt;.PREV);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; ButtonNext_Click(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MoveToPage(&lt;SPAN style="COLOR: #2b91af"&gt;DIRECTION&lt;/SPAN&gt;.NEXT);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;A few problems I had on the way: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Getting the current page the user control was on took a bit of digging around. I ended up using the AppRelativeVirtualPath property. It works for normal pages and child-of-master pages. &lt;/P&gt;
&lt;P&gt;The first time AppRelativeVirtualPath was accessed, it returned the page in mixed case: subsequently it returned the page in all lower case. I decided to make everything lower case (remember the article &lt;STRONG&gt;is&lt;/STRONG&gt; prefaced with Quick and Dirty &lt;SPAN style="FONT-FAMILY: Wingdings"&gt;J&lt;/SPAN&gt;).&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I wasn't sure which to use, Response.Redirect(…) or Server.Transfer(…). Both worked so I left them both in (one is commented out). &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;STRONG&gt;Possible Enhancements: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;I like the Spartan functional look…plain gray buttons. You could however, "sexy up" the control with CSS and graphics. For sure dude, this ain't purty: &lt;/P&gt;
&lt;P&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; &lt;IMG style="WIDTH: 183px; HEIGHT: 65px" src="http://weblogs.asp.net/blogs/stevewellens/2009_May/QuickAndDirtyNavigation.png" width=183 height=65 mce_src="http://weblogs.asp.net/blogs/stevewellens/2009_May/QuickAndDirtyNavigation.png"&gt;&lt;/P&gt;
&lt;P&gt;Adding First and Last buttons would be trivial. &lt;/P&gt;
&lt;P&gt;You could make the control more "generic" by keeping the list of pages in a separate file or a database and reading them in once (do it in a static constructor). &lt;/P&gt;
&lt;P&gt;You could add a property to switch between using Response.Redirect(…) and Server.Transfer(…) methods. &lt;/P&gt;
&lt;P&gt;You can download the code &lt;A href="http://weblogs.asp.net/blogs/stevewellens/2009_May/UC_Navigator.zip" mce_href="http://weblogs.asp.net/blogs/stevewellens/2009_May/UC_Navigator.zip"&gt;Here.&lt;/A&gt;&amp;nbsp;&amp;nbsp; My pithy advice:&amp;nbsp; Think before you type.&lt;/P&gt;
&lt;P&gt;I hope someone finds this useful. &lt;/P&gt;
&lt;P&gt;Steve Wellens &lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7087424" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/User+Control/default.aspx">User Control</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Navigation/default.aspx">Navigation</category></item><item><title>jQuery…Worst Practices</title><link>http://weblogs.asp.net/stevewellens/archive/2009/05/09/jquery-three-worst-practices.aspx</link><pubDate>Sat, 09 May 2009 11:01:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7073992</guid><dc:creator>SGWellens</dc:creator><slash:comments>31</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7073992</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/05/09/jquery-three-worst-practices.aspx#comments</comments><description>&lt;P&gt;jQuery and Regular Expressions have a lot in common: They are both amazingly powerful and they are both as ugly as a knife fight between two obese street-whores in a garbage-strewn alley. &lt;/P&gt;
&lt;P&gt;There isn't much hope for Regular Expressions. They are what they are. I use a freeware program called &lt;A href="http://www.ultrapico.com/" mce_href="http://www.ultrapico.com/"&gt;Expresso&lt;/A&gt; which can parse regular expressions and provide text descriptions for them. &lt;/P&gt;
&lt;P&gt;But for jQuery, there is hope. You can use this powerful tool and still create code that is readable and maintainable. It takes a bit more work, and a bit more thought, but it is worth it. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Caveat:&lt;/STRONG&gt; I am not a jQuery expert; I am not a JavaScript expert. Not even close. But I know the difference between good code and bad code: Good code is easy to understand. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;Worst Practice #1:&lt;/SPAN&gt;&amp;nbsp; Hooking up event handlers dynamically when there is no need. &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;In the document ready event, some developers search for a DOM object and connect an event handler to it as follows: &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;script&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;type&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="text/javascript"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; $(document).ready(&lt;SPAN style="COLOR: blue"&gt;function&lt;/SPAN&gt;()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $(&lt;SPAN style="COLOR: #a31515"&gt;"#Button1"&lt;/SPAN&gt;).click(&lt;SPAN style="COLOR: blue"&gt;function&lt;/SPAN&gt;(event)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; alert(&lt;SPAN style="COLOR: #a31515"&gt;"You Clicked Me!"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; });&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;script&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/BLOCKQUOTE&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;Why add indirection? Why move the event hookup away from the object? It is much more straightforward and object oriented to do it the "old fashioned" standard way: &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Button&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Button1"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;Text&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="MyButton"&lt;/SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;OnClientClick&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="alert('You Clicked Me!');"&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Of course, there are reasons for doing it with jQuery.&amp;nbsp; You might want to change event handlers dynamically depending on some condition in the page.&amp;nbsp; If you need to assign a common event handler to several objects on a page, it makes sense to do it in one place. As a matter of fact, that's the beauty of jQuery.&amp;nbsp; But for a single event on a single control….NO. &lt;/P&gt;
&lt;P&gt;Just because you &lt;EM&gt;can&lt;/EM&gt; do something doesn't mean you should do it. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;Worst Practice #2:&lt;/SPAN&gt;&amp;nbsp; Chaining the results. &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;A touted feature of jQuery is the ability to chain results as in this example: &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;$(&lt;SPAN style="COLOR: #a31515"&gt;"div.highlight"&lt;/SPAN&gt;).css(&lt;SPAN style="COLOR: #a31515"&gt;"color"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"yellow"&lt;/SPAN&gt;).css(&lt;SPAN style="COLOR: #a31515"&gt;"background-color"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"black"&lt;/SPAN&gt;).css(&lt;SPAN style="COLOR: #a31515"&gt;"width"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"50px"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Let's make it more readable and more maintainable. It's easier to work with many short lines than a single monolithic monstrosity: &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;var&lt;/SPAN&gt; Divs = $(&lt;SPAN style="COLOR: #a31515"&gt;"div.highlight"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;Divs.css(&lt;SPAN style="COLOR: #a31515"&gt;"color"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"yellow"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;Divs.css(&lt;SPAN style="COLOR: #a31515"&gt;"background-color"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"black"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;Divs.css(&lt;SPAN style="COLOR: #a31515"&gt;"width"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"50px"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;/DIV&gt;&lt;/BLOCKQUOTE&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;Isn't that better? In the real world, hopefully you would use a CSS class to format the divs. &lt;/P&gt;
&lt;P&gt;By the way, &lt;EM&gt;putting everything on one line does not make it run faster&lt;/EM&gt;.&amp;nbsp; This is so important I'm going to repeat it:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;Putting everything on one line does not make it run faster&lt;/STRONG&gt;.&amp;nbsp; &lt;/EM&gt;Don't believe me? Here's proof: &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;$(document).ready(&lt;SPAN style="COLOR: blue"&gt;function&lt;/SPAN&gt;()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;for&lt;/SPAN&gt; (i = 0; i &amp;lt; 1000; i++)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Test1();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Test2();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;});&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;function&lt;/SPAN&gt; Test1()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; $(&lt;SPAN style="COLOR: #a31515"&gt;"div.highlight"&lt;/SPAN&gt;).css(&lt;SPAN style="COLOR: #a31515"&gt;"color"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"yellow"&lt;/SPAN&gt;).css(&lt;SPAN style="COLOR: #a31515"&gt;"background-color"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"black"&lt;/SPAN&gt;).css(&lt;SPAN style="COLOR: #a31515"&gt;"width"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"50px"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;function&lt;/SPAN&gt; Test2()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;var&lt;/SPAN&gt; Divs = $(&lt;SPAN style="COLOR: #a31515"&gt;"div.highlight"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Divs.css(&lt;SPAN style="COLOR: #a31515"&gt;"color"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"yellow"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Divs.css(&lt;SPAN style="COLOR: #a31515"&gt;"background-color"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"black"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Divs.css(&lt;SPAN style="COLOR: #a31515"&gt;"width"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"50px"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;!--EndFragment--&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Here are the results from the IE 8 Profiler:&amp;nbsp;&amp;nbsp;The one-line code took longer.&amp;nbsp; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/stevewellens/2009_May/ProfilerOutput.png" mce_src="http://weblogs.asp.net/blogs/stevewellens/2009_May/ProfilerOutput.png"&gt;&lt;/P&gt;
&lt;P&gt;If you run the test several times, the&amp;nbsp;results vary slightly but the conclusion is that &lt;EM&gt;there is no performance gain chaining lines together&lt;/EM&gt;...there is only a loss of maintainable code.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN style="TEXT-DECORATION: underline"&gt;Worst Practice #3:&lt;/SPAN&gt;&amp;nbsp; Lack of comments. &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;jQuery is cryptic. If any code ever screamed out for comments it is jQuery code. Let's raise the professionalism of the above code: &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: green"&gt;// get all the Divs with the highlight class and&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: green"&gt;// format them and set their width&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;var&lt;/SPAN&gt; Divs = $(&lt;SPAN style="COLOR: #a31515"&gt;"div.highlight"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;Divs.css(&lt;SPAN style="COLOR: #a31515"&gt;"color"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"yellow"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;Divs.css(&lt;SPAN style="COLOR: #a31515"&gt;"background-color"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"black"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;Divs.css(&lt;SPAN style="COLOR: #a31515"&gt;"width"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"30px"&lt;/SPAN&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;!--EndFragment--&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Isn't that better than the original cryptic single-line? It doesn't take that much extra effort to produce good code. &lt;/P&gt;
&lt;HR&gt;

&lt;P&gt;If you work with technically proficient developers, you'd better not write sloppy code or you'll find yourself reviewing documentation in a tiny cubicle next to a loud-voiced sales person who uses their speaker phone for everything…including checking voice mail. &lt;/P&gt;
&lt;P&gt;If you work for a large, non-technical company, chances are that no one gives a rat's ass what you do and you can get away with writing sloppy code. &lt;/P&gt;
&lt;P&gt;If you work by yourself in a small company, no one is going to be evaluating your code and you can get away with writing sloppy code. &lt;/P&gt;
&lt;P&gt;However, hopefully, a sense of self-pride will compel you to write &lt;EM&gt;&lt;STRONG&gt;good&lt;/STRONG&gt;&lt;/EM&gt; code….not just code that 'works'. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;In summary&lt;/STRONG&gt;, jQuery is great. It can save a lot of time in initial development. But if you don't take care, the productivity gains will be lost by having code that is difficult to understand and therefore difficult to&amp;nbsp;maintain. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;SPAN style="FONT-FAMILY: Courier New; FONT-SIZE: 10pt"&gt;
&lt;BLOCKQUOTE&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: green"&gt;// send friendly message to all jQuery Developers &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;$(&lt;SPAN style="COLOR: #a31515"&gt;"jQuery.Developers"&lt;/SPAN&gt;).HappyProgramming();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/BLOCKQUOTE&gt;&lt;/SPAN&gt;
&lt;P&gt;Steve Wellens&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7073992" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/JQuery/default.aspx">JQuery</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Profiler/default.aspx">Profiler</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>Using Session State in a Web Service</title><link>http://weblogs.asp.net/stevewellens/archive/2009/04/05/using-session-state-in-a-web-service.aspx</link><pubDate>Mon, 06 Apr 2009 02:21:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7028289</guid><dc:creator>SGWellens</dc:creator><slash:comments>13</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7028289</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/04/05/using-session-state-in-a-web-service.aspx#comments</comments><description>&lt;P&gt;Usually, when you think of a Web Service, you think …make the call, get the response, and get on with the task at hand. These "one shot" calls are the norm in Web Services but there may be times when you need a little more. You may need the Web Service to remember states between calls. &lt;/P&gt;
&lt;P&gt;As an example, I wrote a Web Service that had to perform a lengthy operation. I didn't want to lock up the client by making a synchronous call, so once the job was started, the call returned. Every few seconds, on a timer, the client would call a GetStatus function in the Web Service to get the status of the running job. When the status was retrieved, a progress bar on the client was updated. It worked well. &lt;/P&gt;
&lt;P&gt;There is support for using Session State in Web Services but it doesn't work "out-of-the-box". &lt;/P&gt;
&lt;P&gt;This article assumes you know how to create and call a Web Service. &lt;/P&gt;
&lt;P&gt;First we need a Web Service. I created a basic Web Service and then modified the supplied HelloWorld function that is created by default: &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt; System;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt; System.Collections.Generic;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt; System.Web;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt; System.Web.Services;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;namespace&lt;/SPAN&gt; DemoWebService&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; [&lt;SPAN style="COLOR: #2b91af"&gt;WebService&lt;/SPAN&gt;(Namespace = &lt;SPAN style="COLOR: #a31515"&gt;"http://tempuri.org/"&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; [&lt;SPAN style="COLOR: #2b91af"&gt;WebServiceBinding&lt;/SPAN&gt;(ConformsTo = &lt;SPAN style="COLOR: #2b91af"&gt;WsiProfiles&lt;/SPAN&gt;.BasicProfile1_1)]&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; [System.ComponentModel.&lt;SPAN style="COLOR: #2b91af"&gt;ToolboxItem&lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;MyDemo&lt;/SPAN&gt; : System.Web.Services.&lt;SPAN style="COLOR: #2b91af"&gt;WebService&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;SPAN style="COLOR: #2b91af"&gt;WebMethod&lt;/SPAN&gt; (EnableSession = &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; HelloWorld()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// get the Count out of Session State&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;? Count = (&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;?)Session[&lt;SPAN style="COLOR: #a31515"&gt;"Count"&lt;/SPAN&gt;];&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Count == &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Count = 0;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// increment and store the count&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Count++;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Session[&lt;SPAN style="COLOR: #a31515"&gt;"Count"&lt;/SPAN&gt;] = Count;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;"Hello World - Call Number: "&lt;/SPAN&gt; + Count.ToString();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;&lt;STRONG&gt;Note: &lt;/STRONG&gt;The key thing to do is add (&lt;STRONG&gt;EnableSession&lt;/STRONG&gt; = True) to the &lt;STRONG&gt;WebMethod&lt;/STRONG&gt; tag. The rest of the code simply keeps track of how many times each client has called the Web Service method. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Side Note:&lt;/STRONG&gt; I am using a Nullable Type to simplify the retrieving of Count from the Session collection. &lt;/P&gt;
&lt;P style="MARGIN-LEFT: 36pt"&gt;Here's the old school way: &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; Count;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Session[&lt;SPAN style="COLOR: #a31515"&gt;"Count"&lt;/SPAN&gt;] == &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Count = 0;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;else&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Count = (&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;)Session[&lt;SPAN style="COLOR: #a31515"&gt;"Count"&lt;/SPAN&gt;];&lt;/PRE&gt;&lt;/DIV&gt;&lt;/BLOCKQUOTE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P style="MARGIN-LEFT: 36pt"&gt;Here's the new school way...&lt;STRONG&gt;Nullable Type&lt;/STRONG&gt;...is better, yah? &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;? Count = (&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;?)Session[&lt;SPAN style="COLOR: #a31515"&gt;"Count"&lt;/SPAN&gt;];&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (Count == &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Count = 0;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/BLOCKQUOTE&gt;&lt;/BLOCKQUOTE&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;Ok, now the client. You've built the Web Service. You've added the Web Service to the client project (right-click the project and select "Add Web Reference…"). A proxy class has been created. &lt;/P&gt;
&lt;P&gt;In a button click event, we instantiate the proxy class, call our function and update a label. This is going to be great…it's going to be so easy… &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Button1_Click(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// instantiate the proxy and call our function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; localhost.&lt;SPAN style="COLOR: #2b91af"&gt;MyDemo&lt;/SPAN&gt; MyService = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; localhost.&lt;SPAN style="COLOR: #2b91af"&gt;MyDemo&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Label1.Text += MyService.HelloWorld() + &lt;SPAN style="COLOR: #a31515"&gt;"&amp;lt;br /&amp;gt;"&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;&lt;PRE&gt;&lt;PRE&gt;We click the button a few times, but instead counting, we get this: &lt;/PRE&gt;&lt;/PRE&gt;
&lt;P style="MARGIN-LEFT: 36pt"&gt;&lt;SPAN style="FONT-SIZE: 12pt"&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;Hello World - Call Number: 1 &lt;BR&gt;Hello World - Call Number: 1 &lt;BR&gt;Hello World - Call Number: 1 &lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Explanation: &lt;/STRONG&gt;When an object is put into the Session collection, Asp.Net gives the caller an indentifying cookie behind the scenes…the SessionID. This is like when you check your coat at an expensive restaurant (I've heard) and you get a coat check ticket. When you go to get your coat back, you must have the ticket. &lt;EM&gt;So why isn't the proxy storing the SessionID as a cookie?&lt;/EM&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Key Point: &lt;/STRONG&gt;The proxy generated doesn't have a CookieContainer. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Solution:&lt;/STRONG&gt; Create a CookieContainer in the proxy (it already has a reference for it) &lt;/P&gt;
&lt;P&gt;Here's the modified code:&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Button1_Click(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// instantiate the proxy &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; localhost.&lt;SPAN style="COLOR: #2b91af"&gt;MyDemo&lt;/SPAN&gt; MyService = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; localhost.&lt;SPAN style="COLOR: #2b91af"&gt;MyDemo&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// create a container for the SessionID cookie&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; MyService.CookieContainer = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;CookieContainer&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// call the Web Service function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Label1.Text += MyService.HelloWorld() + &lt;SPAN style="COLOR: #a31515"&gt;"&amp;lt;br /&amp;gt;"&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;All right, problem solved. This is great…it's going to be so easy… Fire up the web page, click the button a few times, and… &lt;/P&gt;
&lt;P style="MARGIN-LEFT: 36pt"&gt;&lt;SPAN style="FONT-SIZE: 12pt"&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;Hello World - Call Number: 1 &lt;BR&gt;Hello World - Call Number: 1 &lt;BR&gt;Hello World - Call Number: 1 &lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN-LEFT: 36pt"&gt;&lt;/SPAN&gt;@#%* Why does life have to be so hard? &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Explanation&lt;/STRONG&gt;: When the proxy went out of scope, it was uninstantiated and ceased to exist. The CookieContainer also ceased to exist. And our cookie, the SessionID…a.k.a. coat check ticket…was lost. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Key Point:&lt;/STRONG&gt; The proxy has to remain in existence between calls to the Web Service. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Solution:&lt;/STRONG&gt; Keep the proxy around. In a Windows Forms application this is easy. Make the proxy global or static…just don't put it on the stack. For a Web Application it's a bit trickier, we put the proxy into the Session collection. &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Button1_Click(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; localhost.&lt;SPAN style="COLOR: #2b91af"&gt;MyDemo&lt;/SPAN&gt; MyService;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// try to get the proxy from Session state&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; MyService = Session[&lt;SPAN style="COLOR: #a31515"&gt;"MyService"&lt;/SPAN&gt;] &lt;SPAN style="COLOR: blue"&gt;as&lt;/SPAN&gt; localhost.&lt;SPAN style="COLOR: #2b91af"&gt;MyDemo&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (MyService == &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// create the proxy&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MyService = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; localhost.&lt;SPAN style="COLOR: #2b91af"&gt;MyDemo&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// create a container for the SessionID cookie&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MyService.CookieContainer = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;CookieContainer&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// store it in Session for next usage&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Session[&lt;SPAN style="COLOR: #a31515"&gt;"MyService"&lt;/SPAN&gt;] = MyService;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// call the Web Service function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; Label1.Text += MyService.HelloWorld() + &lt;SPAN style="COLOR: #a31515"&gt;"&amp;lt;br /&amp;gt;"&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&amp;nbsp;&amp;nbsp;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;All right, we hope the problem is solved because this is getting tiring. Fire up the web page, click the button a few times and… &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Hello World - Call Number: 1&lt;BR&gt;Hello World - Call Number: 2&lt;BR&gt;Hello World - Call Number: 3&lt;BR&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Ah, the sweet bliss of working code. &lt;/P&gt;
&lt;P&gt;I hope you found this informative and helpful. &lt;/P&gt;
&lt;P&gt;Steve Wellens &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;[Update:]&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;If you use "Add Web Service" instead of "Add Web Reference" in VS2008, the proxy generated works with out any fooling around. &amp;nbsp;However, the proxy can only be consumed by .Net 3.0 and higher applications.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7028289" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Web+Service/default.aspx">Web Service</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Session+State/default.aspx">Session State</category></item><item><title>IE 8 - IP Address Mapping Accelerator</title><link>http://weblogs.asp.net/stevewellens/archive/2009/04/01/ie-8-ip-address-mapping-accelerator.aspx</link><pubDate>Wed, 01 Apr 2009 15:38:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7020524</guid><dc:creator>SGWellens</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7020524</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/04/01/ie-8-ip-address-mapping-accelerator.aspx#comments</comments><description>&lt;P&gt;On the ASP.NET forums where I moderate, the poster's IP address is displayed at the bottom of the post. Often I am curious and paste the poster's IP address into an IP locator web page to find out where they are posting from. This was tedious. &lt;/P&gt;
&lt;P&gt;Once I installed Internet Explorer 8 and saw what accelerators could do, I decided to write one to do the work for me. It wasn't too hard. &lt;/P&gt;
&lt;P&gt;Here is what the accelerator text looks like (it's just an XML file): &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;?&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;xml&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;version&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;1.0&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;utf-8&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;?&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:openServiceDescription&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;xmlns:os&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;http://www.microsoft.com/schemas/openservicedescription/1.0&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:homepageUrl&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;http://www.infosniper.net&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:homepageUrl&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:display&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:name&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;Map IP Address with Info Sniper&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:name&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:icon&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;http://www.infosniper.net/favicon.ico&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:icon&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt; &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:display&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:activity&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;category&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;Map&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:activityAction&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;context&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;selection&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:execute&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;method&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;action&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;http://www.infosniper.net/?ip_address={selection}&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; /&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:activityAction&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:activity&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;os:openServiceDescription&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;!--EndFragment--&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;To install an accelerator, you have to launch it from a web page. This is annoying. I tried to make the URL a local file but that did not work. I ended up with this: &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;
&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;button&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;id&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="myButton"&lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &lt;SPAN style="COLOR: red"&gt;onclick&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="window.external.AddService('http://weblogs.asp.net/blogs/stevewellens/Accelerators/InfoSniperAccelerator.xml')"&amp;gt;&lt;/SPAN&gt;&amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; Add Info Sniper Accelerator&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;button&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The button rendered:&amp;nbsp;&amp;nbsp;&lt;BUTTON id=myButton onclick="window.external.AddService('http://weblogs.asp.net/blogs/stevewellens/Accelerators/InfoSniperAccelerator.xml')"&gt;Add Info Sniper Accelerator&lt;/BUTTON&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is what it looks like in action. Highlight the IP address, right click and… &lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;IMG style="WIDTH: 354px; HEIGHT: 275px" border=1 src="http://weblogs.asp.net/blogs/stevewellens/2009_Apr/IPMapInAction.png" width=354 height=275 mce_src="http://weblogs.asp.net/blogs/stevewellens/2009_Apr/IPMapInAction.png"&gt;&lt;/P&gt;
&lt;P&gt;Here is part of the resulting InfoSniper web page: &lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/stevewellens/2009_Apr/InfoSniperPage.png" mce_src="http://weblogs.asp.net/blogs/stevewellens/2009_Apr/InfoSniperPage.png"&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you want to install this accelerator click this button:&amp;nbsp;&lt;BUTTON id=myButton onclick="window.external.AddService('http://weblogs.asp.net/blogs/stevewellens/Accelerators/InfoSniperAccelerator.xml')"&gt;Add Info Sniper Accelerator&lt;/BUTTON&gt; &lt;/P&gt;
&lt;P&gt;Here are some Microsoft's accelerators: &lt;A href="http://ie.microsoft.com/activities/en-en/Default.aspx" mce_href="http://ie.microsoft.com/activities/en-en/Default.aspx"&gt;http://ie.microsoft.com/activities/en-en/Default.aspx&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Here is the Developer's Guide: &lt;A href="http://msdn.microsoft.com/en-us/library/cc289775(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/cc289775(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/cc289775(VS.85).aspx&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;I hope someone finds this useful. &lt;/P&gt;
&lt;P&gt;Steve Wellens &lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7020524" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/IE8/default.aspx">IE8</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Accelerators/default.aspx">Accelerators</category></item><item><title>Master Page, Child Pages:  Dynamic Communication Flexibility</title><link>http://weblogs.asp.net/stevewellens/archive/2009/03/27/master-page-child-pages-dynamic-communication-flexibility.aspx</link><pubDate>Fri, 27 Mar 2009 18:56:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7008036</guid><dc:creator>SGWellens</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://weblogs.asp.net/stevewellens/rsscomments.aspx?PostID=7008036</wfw:commentRss><comments>http://weblogs.asp.net/stevewellens/archive/2009/03/27/master-page-child-pages-dynamic-communication-flexibility.aspx#comments</comments><description>&lt;P&gt;Over on the ASP.NET forums, where I am a moderator, a user asked a question concerning Master Pages. I thought it was an interesting enough question to spend a little time on it and write a BLOG entry (golf season hasn't started in my state yet). &lt;/P&gt;
&lt;P&gt;The question was how to have "static" buttons on a Master Page call functions in child pages when clicked. As usual, I wanted the simplest possible way to accomplish the goal. &lt;/P&gt;
&lt;P&gt;The first thing to do is create a Master Page with three "Aux" buttons. I used a simple table to keep the buttons at the top of the form and they are all disabled by default. It will be up to the child pages to enable them as needed. &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="BACKGROUND: #ffee62"&gt;&amp;lt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;@&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;Master&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Language&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="C#"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;AutoEventWireup&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="true"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;CodeFile&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="MasterPage.master.cs"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Inherits&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="MasterPage"&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND: #ffee62"&gt;%&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;!&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;DOCTYPE&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;html&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;PUBLIC&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;"-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;html&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;xmlns&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="http://www.w3.org/1999/xhtml"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;head&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;title&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;title&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;head&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;body&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;form&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;id&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="form1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;table&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;tr&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;td&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Button&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="_AuxButton1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Text&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Aux 1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Enabled&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="false"&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Button&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="_AuxButton2"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Text&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Aux 2"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Enabled&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="false"&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Button&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="_AuxButton3"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Text&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Aux 3"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Enabled&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="false"&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;td&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;tr&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;tr&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;td&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;div&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;style&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;background-color&lt;/SPAN&gt;: &lt;SPAN style="COLOR: blue"&gt;#00FFFF"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;br&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; This is Placeholder1:&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;ContentPlaceHolder&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="ContentPlaceHolder1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;ContentPlaceHolder&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;div&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;td&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;tr&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;table&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;form&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;body&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;html&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;Next, we expose the Master Page buttons as properties so the external entities, aka child pages, can have access to them: &lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;partial&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;MasterPage&lt;/SPAN&gt; : System.Web.UI.&lt;SPAN style="COLOR: #2b91af"&gt;MasterPage&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Page_Load(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// expose the Aux buttons&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;Button&lt;/SPAN&gt; AuxButton1&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt; { &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; _AuxButton1; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;Button&lt;/SPAN&gt; AuxButton2&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt; { &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; _AuxButton2; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;Button&lt;/SPAN&gt; AuxButton3&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt; { &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; _AuxButton3; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;!--EndFragment--&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;That's it for the Master Page. In the child page, we've set the MasterPageFile but there is one more thing we do to make life simpler: We set the &lt;STRONG&gt;MasterType&lt;/STRONG&gt; property so the child pages "knows about" the type of Master Page: &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="BACKGROUND: #ffee62"&gt;&amp;lt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;@&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;Page&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Language&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="C#"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;MasterPageFile&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="~/MasterPage.master"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;AutoEventWireup&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="true"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: red"&gt;CodeFile&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Child1.aspx.cs"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Inherits&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Child1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Title&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Untitled Page"&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND: #ffee62"&gt;%&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="BACKGROUND: #ffee62"&gt;&amp;lt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;@&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;MasterType&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;TypeName&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="MasterPage"&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND: #ffee62"&gt;%&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Content&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Content1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ContentPlaceHolderID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="ContentPlaceHolder1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Server"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; This is child content&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;br&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Label&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Label1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Text&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Label"&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Label&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;br&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Label&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Label2"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Text&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Label"&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Label&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Content&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Then, in the child page's Page_Load function, we hookup the buttons: &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&lt;DIV style="FONT-FAMILY: Courier New; BACKGROUND: white; COLOR: black; FONT-SIZE: 9pt"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;partial&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;Child1&lt;/SPAN&gt; : System.Web.UI.&lt;SPAN style="COLOR: #2b91af"&gt;Page&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Page_Load(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// hook up our events to the master pages buttons&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Master.AuxButton1.Click += Aux1_Click;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Master.AuxButton2.Click += Aux2_Click;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// by default, the buttons are disabled, if we are&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// going to use them, enable them&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Master.AuxButton1.Enabled = &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Master.AuxButton2.Enabled = &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// custom button text&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Master.AuxButton2.Text = &lt;SPAN style="COLOR: #a31515"&gt;"Click me!"&lt;/SPAN&gt;;&amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// functions called from Master Page&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Aux1_Click(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Label1.Text = &lt;SPAN style="COLOR: #a31515"&gt;"Aux1Clicked!"&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Aux2_Click(&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; sender, &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Label2.Text = &lt;SPAN style="COLOR: #a31515"&gt;"Aux2 has been clicked!"&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;
&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;
&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Here is what the browser looks like after we've clicked the aux buttons: &lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://weblogs.asp.net/blogs/stevewellens/2009_Mar/MasterChildCommunication.png" mce_src="http://weblogs.asp.net/blogs/stevewellens/2009_Mar/MasterChildCommunication.png"&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Aux button 3 remains disabled because we did not connect it to any function. &lt;/LI&gt;
&lt;LI&gt;Aux button 2 has custom text we applied. &lt;/LI&gt;
&lt;LI&gt;The two Child Page label controls have been updated from the Master Page. &lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I hope someone finds this useful. &lt;/P&gt;
&lt;P&gt;Steve Wellens&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7008036" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stevewellens/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stevewellens/archive/tags/Master+Pages/default.aspx">Master Pages</category></item></channel></rss>
