<?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:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Reamped.NET</title>
    <description>XML Thingey... It's a Technical Term</description>
    <link>http://blog.reamped.net/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.Net Syndication Generator 1.0.0.0 (http://dotnetblogengine.net/)</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://blog.reamped.net/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Ira</dc:creator>
    <dc:title>Reamped.NET</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ReampedNET" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Avoiding The Database Deployment Nightmare</title>
      <description>&lt;p&gt;So, I have written before about &lt;a href="http://blog.reamped.net/post/2008/05/Using-Database-Projects-for-Visual-Studio.aspx" target="_blank"&gt;how to put your database into version control using database projects in Visual Studio&lt;/a&gt;. Even while having the scripts in the solution, there can be times when you can't exactly remember what you changed and needs to go out with your project deployment to the production database. Deploying files is easy because of tools like &lt;a href="http://winmerge.org/" target="_blank"&gt;WinMerge&lt;/a&gt;, however deploying things to a database can get quite complicated. You could script both schemas and use &lt;a href="http://winmerge.org/" target="_blank"&gt;WinMerge&lt;/a&gt; to see the differences between the development database and the production database. But even doing that, you will still have to write a custom script to get the production database schema up to date.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Enter xSql&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://www.xsqlsoftware.com/"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="xSQLLogoWithStripesSmall3" align="right" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/AvoidingTheDatabaseDeploymentNightmare_EF79/xSQLLogoWithStripesSmall3_084e10cc-4078-49eb-89c9-daea5b34bb78.jpg" width="140" height="44" /&gt;&lt;/a&gt; This is where a tool such as &lt;a href="http://www.xsqlsoftware.com/Product/Sql_Schema_Compare.aspx" target="_blank"&gt;xSQL Object&lt;/a&gt; can be extremely helpful. All that need be done is set up the connections, run the comparison, and then you can visually see what has changed between your development and live databases! No need to remember what you changed or any of that, just run the comparison and execute the change script. It will even allow you to save database snapshots before running your change scripts. You can see an excellent &lt;a href="http://www.xsqlsoftware.com/Tour.aspx?ProdId=xSQLObject&amp;amp;idx=-1" target="_blank"&gt;walkthrough&lt;/a&gt; &lt;a href="http://www.xsqlsoftware.com/Tour.aspx?ProdId=xSQLObject&amp;amp;idx=-1" target="_blank"&gt;here&lt;/a&gt;. &lt;a href="http://www.xsqlsoftware.com/Product/Sql_Schema_Compare.aspx" target="_blank"&gt;xSQL Object&lt;/a&gt; also comes in a bundle with another one of their products, &lt;a href="http://www.xsqlsoftware.com/Product/Sql_Data_Compare.aspx" target="_blank"&gt;xSQL Data&lt;/a&gt; or by it's self. &lt;a href="http://www.xsqlsoftware.com/Product/Sql_Data_Compare.aspx" target="_blank"&gt;xSQL Data&lt;/a&gt; allows you to compare data differences between two databases.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;The Best Part&lt;/h3&gt;  &lt;p&gt;All the goodness of the &lt;a href="http://www.xsqlsoftware.com/LiteEdition.aspx" target="_blank"&gt;xSQL Bundle (xSQL Object and xSQL Data) Lite Edition&lt;/a&gt; comes at a very affordable price &lt;strong&gt;FREE&lt;/strong&gt;! If you only use SQL express edition then you can get the full bundle lite edition and it will work without any restrictions at all! However, if you need to use it against other versions of SQL Server it does have the following limitations:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;up to 25 tables&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;up to 40 views&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;up to 40 stored procedures&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;up to 40 functions&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If you are using it against a small database then you shouldn't have any problems. Now if you have databases larger than this and are using SQL Server editions other than express, the product costs $399.00 for a single user license. BUT, after downloading it I was sent an email offering 30% off if I purchased the product within 7 days of the download. That brings the cost down to &lt;strong&gt;$280&lt;/strong&gt;! Not too bad when you compare it with the prices of other comparable tools. So I ask you to go to the website and check it out if you haven't already! &lt;a href="http://www.xsqlsoftware.com" target="_blank"&gt;http://www.xsqlsoftware.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Update&lt;/h3&gt;  &lt;p&gt;After contacting the company about licensing, I was shown another one of their great tools. A little while back I wrote a post titled &lt;a href="http://blog.reamped.net/post/2009/04/Finding-Text-in-SQL-Server-Stored-Procedures.aspx"&gt;Finding Text in SQL Server Stored Procedures&lt;/a&gt;. They have a tool called &lt;a href="http://www.xsqlsoftware.com/Product/Sql_Database_Object_Search.aspx" target="_blank"&gt;xSQL Object Search&lt;/a&gt; that allows you to search for all object types, through the names and definitions, for strings. It will also do a search using regular expressions! Pretty powerful stuff for a &lt;strong&gt;FREE &lt;/strong&gt;tool! Check it out here: &lt;a href="http://www.xsqlsoftware.com/Product/Sql_Database_Object_Search.aspx" target="_blank"&gt;xSQL Object Search&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Happy Deployments!&lt;/p&gt;  &lt;p&gt;-Ira&lt;/p&gt;  &lt;p&gt;&lt;a target="_blank" href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2009/06/Avoiding-The-Database-Deployment-Nightmare.aspx&amp;amp;title=Avoiding The Database Deployment Nightmare"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2009/06/Avoiding-The-Database-Deployment-Nightmare.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/al0CHimqgukWVTBkGAvn0D5c1Rc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/al0CHimqgukWVTBkGAvn0D5c1Rc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/al0CHimqgukWVTBkGAvn0D5c1Rc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/al0CHimqgukWVTBkGAvn0D5c1Rc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=5x8m6Ilx0eA:8MFGISlBeeU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=5x8m6Ilx0eA:8MFGISlBeeU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?i=5x8m6Ilx0eA:8MFGISlBeeU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=5x8m6Ilx0eA:8MFGISlBeeU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?i=5x8m6Ilx0eA:8MFGISlBeeU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=5x8m6Ilx0eA:8MFGISlBeeU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?i=5x8m6Ilx0eA:8MFGISlBeeU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=5x8m6Ilx0eA:8MFGISlBeeU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/5x8m6Ilx0eA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/5x8m6Ilx0eA/post.aspx</link>
      <author>ira</author>
      <comments>http://blog.reamped.net/post/2009/06/Avoiding-The-Database-Deployment-Nightmare.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=d5807b66-5f21-470d-bb2f-772c8a4360a1</guid>
      <pubDate>Thu, 18 Jun 2009 19:38:18 -0400</pubDate>
      <category>Database</category>
      <category>SQL</category>
      <category>Deployment</category>
      <dc:publisher>ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=d5807b66-5f21-470d-bb2f-772c8a4360a1</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=d5807b66-5f21-470d-bb2f-772c8a4360a1</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2009/06/Avoiding-The-Database-Deployment-Nightmare.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=d5807b66-5f21-470d-bb2f-772c8a4360a1</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=d5807b66-5f21-470d-bb2f-772c8a4360a1</feedburner:origLink></item>
    <item>
      <title>How To: Clean Up ASP.NET JavaScript Tags</title>
      <description>&lt;p&gt;In April of '08, I wrote a post about &lt;a href="http://blog.reamped.net/post/2008/04/Clean-Up-ASPNETs-Head-Tag-With-ControlAdapters.aspx"&gt;cleaning up the ASP.NET head tag using control adapters&lt;/a&gt;. I've got some great feedback from it, and I'm glad that I'm not the only one that is horrified when looking at the source of an ASP.NET rendered web page. From the comments of that article I was recently asked how to clean up JavaScript tags. With the code from the project download of the article as-is, when I just slap some script tags in the head tag I get something that looks like this rendered:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="5-4-2009 6-20-48 PM" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/HowToCleanUpASP.NETJavaScriptTags_10559/5-4-2009%206-20-48%20PM_1.png" width="610" height="540" /&gt; &lt;/p&gt;  &lt;p&gt;However, sometimes you are adding JavaScript from your code behind. In this case I do it like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;protected void &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Page_Load&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;object &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;sender&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;EventArgs &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;e&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;)
{
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;string &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;pageScript &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a31515"&gt;@&amp;quot;function CallMeOnWindowLoad() {
    alert('I have been called!');
}

window.onload = function() {
    CallMeOnWindowLoad();
}
&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;;
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Page&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ClientScript&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;RegisterClientScriptBlock&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;this&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;GetType&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(), &lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;LoadScript&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, 
        &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;pageScript&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;true&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
}&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;If you look, you can see where I'm using the string literal &amp;quot;@&amp;quot; to tell ASP.NET to render it &lt;strong&gt;exactly &lt;/strong&gt;like I am putting it in. Take note of the CrLf after the final &amp;quot;}&amp;quot; of my script. This will break any new script or the end script tag to a new line. I also use the Page.ClientScript.RegisterScripBlock method. The arguments are very simple, but take note of the last argument. This boolean value tells ASP.NET to wrap the script inside of a &amp;quot;script&amp;quot; tag. Using this method will render it like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/HowToCleanUpASP.NETJavaScriptTags_10559/5-4-2009%207-10-04%20PM_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="5-4-2009 7-10-04 PM" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/HowToCleanUpASP.NETJavaScriptTags_10559/5-4-2009%207-10-04%20PM_thumb.png" width="372" height="308" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Hope this helps!&lt;/p&gt;

&lt;p&gt;-Ira&lt;/p&gt;

&lt;p&gt;&lt;a target="_blank" href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2009/05/How-To-Clean-Up-ASPNET-JavaScript-Tags.aspx&amp;amp;title=How To: Clean Up ASP.NET JavaScript Tags"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2009/05/How-To-Clean-Up-ASPNET-JavaScript-Tags.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jIp36q1nm1wuHH3QdB8LL1LXwYw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jIp36q1nm1wuHH3QdB8LL1LXwYw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jIp36q1nm1wuHH3QdB8LL1LXwYw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jIp36q1nm1wuHH3QdB8LL1LXwYw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=TgMlfBUFaoE:4AJAzRZrjVw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=TgMlfBUFaoE:4AJAzRZrjVw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?i=TgMlfBUFaoE:4AJAzRZrjVw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=TgMlfBUFaoE:4AJAzRZrjVw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?i=TgMlfBUFaoE:4AJAzRZrjVw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=TgMlfBUFaoE:4AJAzRZrjVw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?i=TgMlfBUFaoE:4AJAzRZrjVw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=TgMlfBUFaoE:4AJAzRZrjVw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/TgMlfBUFaoE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/TgMlfBUFaoE/post.aspx</link>
      <author>ira</author>
      <comments>http://blog.reamped.net/post/2009/05/How-To-Clean-Up-ASPNET-JavaScript-Tags.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=8e0a00a0-a548-4f82-98a8-37550a9da9ec</guid>
      <pubDate>Mon, 04 May 2009 19:13:00 -0400</pubDate>
      <category>ASP.NET</category>
      <category>C#</category>
      <category>JavaScript</category>
      <dc:publisher>ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=8e0a00a0-a548-4f82-98a8-37550a9da9ec</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=8e0a00a0-a548-4f82-98a8-37550a9da9ec</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2009/05/How-To-Clean-Up-ASPNET-JavaScript-Tags.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=8e0a00a0-a548-4f82-98a8-37550a9da9ec</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=8e0a00a0-a548-4f82-98a8-37550a9da9ec</feedburner:origLink></item>
    <item>
      <title>The HttpWebRequest and Using Client Certificates</title>
      <description>&lt;p&gt;So you may have found yourself in a similar situation, needing to make a TCP/IP request to a 3rd party API possibly using SSL. Well, that is a quite simple task. It can however, be complicated if this 3rd party requires the use of certificates for communication to its API server. I found myself in some sort of certificate hell where I had the certificate, added it to the request and somehow it still wasn't working. If you know what I'm talking about and had as many hurdles as I did, my condolences to you. I will try to explain in this article how I started, the problems I ran into and then the overall solution that ended up working for me. &lt;/p&gt;  &lt;p&gt;To start with, you should have some kind of certificate. Most likely a *.pfx or *.p12 file. This can also come with a private key or password for the certificate's encryption. This is what a standard WebRequest over SSL might look like:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;public string &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;GetData&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;string &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;inputData&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;)
{
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//will hold the result
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;string &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;result &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;string&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Empty&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;;
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//build the request object
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;HttpWebRequest &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;request &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= (&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;HttpWebRequest&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;)&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;WebRequest&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Create&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&lt;a href="https://someapi.com/"&gt;https://someapi.com/&lt;/a&gt;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//write the input data (aka post) to a byte array
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;byte&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;[] &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;requestBytes &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;new &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;ASCIIEncoding&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;().&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;GetBytes&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;inputData&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//get the request stream to write the post to
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;Stream &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;requestStream &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;request&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;GetRequestStream&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;();
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//write the post to the request stream
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;requestStream&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Write&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;requestBytes&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #e6ffff"&gt;0&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;requestBytes&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Length&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//build a response object to hold the response
    //submit the request by calling get response
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;HttpWebResponse &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;response &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= (&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;HttpWebResponse&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;)&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;request&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;GetResponse&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;();
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//get the response stream to read the response from
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;Stream &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;responseStream &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;response&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;GetResponseStream&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;();
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//now read it out to our result
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;using &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;StreamReader &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;rdr &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;new &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;StreamReader&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;responseStream&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;))
    {
        &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//set the result to the contents of the stream
        &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;result &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;rdr&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ReadToEnd&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;();
    }
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//return
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;return &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;result&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;;
}&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;The example above is missing the portion where you add the certificate to the request. You may receive a 403 Forbidden error from the server if a certificate is required to make the request to the API server. A simple way of adding a certificate to the request would be like so:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//add certificate to the request
&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;request&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ClientCertificates&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Add&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;new &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;X509Certificate&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a31515"&gt;@&amp;quot;C:\certs\Some Cert.p12&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a31515"&gt;@&amp;quot;SecretP@$$w0rd&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;));&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;The X509Certificate class is found in the System.Security.Cryptography.X509Certificates namespace. Simply add a new certificate to the client certificates before calling for the response, and it &lt;strong&gt;should&lt;/strong&gt; be sent with the request. However, you may encounter an exception with the message &amp;quot;The system cannot find the file specified&amp;quot;. I encountered this error after I got the application off my local machine and onto the development server. After doing some research I stumbled upon this &lt;a href="http://support.microsoft.com/kb/948154"&gt;kb article&lt;/a&gt;. This article opened my eyes to how using certificates is a little more complicated than I initially thought. Turns out the problem was that the user trying to access the certificate does not have a profile loaded.&lt;/p&gt;

&lt;p&gt;After stepping through the article, installing the certificate to the local machine's personal certificate store, and then granting rights to the certificate using the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=c42e27ac-3409-40e9-8667-c748e422833f&amp;amp;displaylang=en"&gt;WinHttpCertCfg.exe&lt;/a&gt; tool, and putting in a little more code found in the kb article, I was well on my way. The article describes how to use C# to open a certificate store and use the certificate directly out of the store. This presents a bit more elegant, and in my opinion more secure, way of getting to and using the certificate.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//add it in a better way
&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;X509Store &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;certStore &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;new &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;X509Store&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;My&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #2b91af"&gt;StoreLocation&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;LocalMachine&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;certStore&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Open&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #2b91af"&gt;OpenFlags&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ReadOnly &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;| &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #2b91af"&gt;OpenFlags&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;OpenExistingOnly&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;X509Certificate2 &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;cert &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;certStore&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Certificates&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Find&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #2b91af"&gt;X509FindType&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;FindBySubjectName&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;My cert subject&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;false&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;)[&lt;/span&gt;&lt;span style="background: #e6ffff"&gt;0&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;];
&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;certStore&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Close&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;();
&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;request&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ClientCertificates&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Add&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;cert&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;This method will not only give access to the certificate regardless of having a loaded profile, but it also takes the certificate's private key password out of the code and/or configuration. This snippet above took me out of the certificate hell that was crushing my life for a couple days! &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Putting it all together:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;public string &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;GetData&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;string &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;inputData&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;)
{
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//will hold the result
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;string &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;result &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;string&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Empty&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;;
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//build the request object
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;HttpWebRequest &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;request &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= (&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;HttpWebRequest&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;)&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;WebRequest&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Create&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;https://someapi.com/&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//add certificate to the request
    //request.ClientCertificates.Add(new X509Certificate(@&amp;quot;C:\certs\Some Cert.p12&amp;quot;, @&amp;quot;SecretP@$$w0rd&amp;quot;));
    //add it in a better way
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;X509Store &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;certStore &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;new &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;X509Store&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;My&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #2b91af"&gt;StoreLocation&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;LocalMachine&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;certStore&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Open&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #2b91af"&gt;OpenFlags&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ReadOnly &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;| &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #2b91af"&gt;OpenFlags&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;OpenExistingOnly&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;X509Certificate2 &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;cert &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;certStore&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Certificates&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Find&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #2b91af"&gt;X509FindType&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;FindBySubjectName&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;My cert subject&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;false&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;)[&lt;/span&gt;&lt;span style="background: #e6ffff"&gt;0&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;];
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;certStore&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Close&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;();
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;request&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ClientCertificates&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Add&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;cert&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//write the input data (aka post) to a byte array
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;byte&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;[] &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;requestBytes &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;new &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;ASCIIEncoding&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;().&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;GetBytes&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;inputData&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//get the request stream to write the post to
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;Stream &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;requestStream &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;request&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;GetRequestStream&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;();
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//write the post to the request stream
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;requestStream&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Write&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;requestBytes&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #e6ffff"&gt;0&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;requestBytes&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Length&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//build a response object to hold the response
    //submit the request by calling get response
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;HttpWebResponse &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;response &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= (&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;HttpWebResponse&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;)&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;request&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;GetResponse&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;();
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//get the response stream to read the response from
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;Stream &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;responseStream &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;response&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;GetResponseStream&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;();
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//now read it out to our result
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;using &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;StreamReader &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;rdr &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;new &lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a65300"&gt;StreamReader&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;responseStream&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;))
    {
        &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//set the result to the contents of the stream
        &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;result &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;rdr&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ReadToEnd&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;();
    }
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: green"&gt;//return
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;return &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;result&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;;
}&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Hope this helps!&lt;/p&gt;

&lt;p&gt;-Ira&lt;/p&gt;

&lt;p&gt;&lt;a target="_blank" href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2009/04/The-HttpWebRequest-and-Using-Client-Certificates.aspx&amp;amp;title=The HttpWebRequest and Using Client Certificates"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2009/04/The-HttpWebRequest-and-Using-Client-Certificates.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_qjEgyqzfqWP-YNINlRX6LIO8Fo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_qjEgyqzfqWP-YNINlRX6LIO8Fo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_qjEgyqzfqWP-YNINlRX6LIO8Fo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_qjEgyqzfqWP-YNINlRX6LIO8Fo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=rM6dh9lQuk4:4d14xki4Chk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=rM6dh9lQuk4:4d14xki4Chk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?i=rM6dh9lQuk4:4d14xki4Chk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=rM6dh9lQuk4:4d14xki4Chk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?i=rM6dh9lQuk4:4d14xki4Chk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=rM6dh9lQuk4:4d14xki4Chk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?i=rM6dh9lQuk4:4d14xki4Chk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=rM6dh9lQuk4:4d14xki4Chk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/rM6dh9lQuk4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/rM6dh9lQuk4/post.aspx</link>
      <author>ira</author>
      <comments>http://blog.reamped.net/post/2009/04/The-HttpWebRequest-and-Using-Client-Certificates.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=aa0f0dbb-9e36-49ef-bc53-f74dbdc95cc1</guid>
      <pubDate>Mon, 27 Apr 2009 18:33:12 -0400</pubDate>
      <category>C#</category>
      <dc:publisher>ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=aa0f0dbb-9e36-49ef-bc53-f74dbdc95cc1</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=aa0f0dbb-9e36-49ef-bc53-f74dbdc95cc1</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2009/04/The-HttpWebRequest-and-Using-Client-Certificates.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=aa0f0dbb-9e36-49ef-bc53-f74dbdc95cc1</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=aa0f0dbb-9e36-49ef-bc53-f74dbdc95cc1</feedburner:origLink></item>
    <item>
      <title>Finding Text in SQL Server Stored Procedures</title>
      <description>&lt;p&gt;So, I'm sure you have been met with a similar scenario during development. You know the one that you have to rename a column or even drop a column in the database. This can be quite annoying if you are doing stored procedure based data access for your application. Once you change the column on the table, you have to figure out which stored procedures reference the column. They aren't always tough to find most of the time, but sometimes you are dealing with a column that may be referenced in many stored procedures. Well thanks to my boss Cliff's research and knowledge sharing, your search can be as easy as ours!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The query:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;USE &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Northwind 
GO 

&lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;DECLARE &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;@SearchText &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;AS VARCHAR&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #e6ffff"&gt;50&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;) 
&lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;SET &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;@SearchText &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #ffffe6"&gt;'CustomerID' 

&lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;SELECT 
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ROUTINE_NAME&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, 
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ROUTINE_DEFINITION 
&lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;FROM &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;INFORMATION_SCHEMA&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ROUTINES 
&lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;WHERE &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ROUTINE_NAME &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;LIKE &lt;/span&gt;&lt;span style="background: #ffffe6"&gt;'%' &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;+ &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;@SearchText &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;+ &lt;/span&gt;&lt;span style="background: #ffffe6"&gt;'%' 
&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;OR &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ROUTINE_DEFINITION &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;LIKE &lt;/span&gt;&lt;span style="background: #ffffe6"&gt;'%' &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;+ &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;@SearchText &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;+ &lt;/span&gt;&lt;span style="background: #ffffe6"&gt;'%'
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;This query will return all the names and routine definitions of stored procedures that contain certain text. It is not really bound by column names but I needed a true development scenario. Run the query with what you are looking for and presto! All the stored procedures you will need to modify.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Hope this helps!&lt;/p&gt;

&lt;p&gt;-Ira&lt;/p&gt;

&lt;p&gt;&lt;a target="_blank" href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2009/04/Finding-Text-in-SQL-Server-Stored-Procedures.aspx&amp;amp;title=Finding Text in SQL Server Stored Procedures"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2009/04/Finding-Text-in-SQL-Server-Stored-Procedures.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mllV6LF6d8leSFru2PxxeG3qe9U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mllV6LF6d8leSFru2PxxeG3qe9U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mllV6LF6d8leSFru2PxxeG3qe9U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mllV6LF6d8leSFru2PxxeG3qe9U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=4Cc9SfJyQoc:Gus3wnSlGf4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=4Cc9SfJyQoc:Gus3wnSlGf4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?i=4Cc9SfJyQoc:Gus3wnSlGf4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=4Cc9SfJyQoc:Gus3wnSlGf4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?i=4Cc9SfJyQoc:Gus3wnSlGf4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=4Cc9SfJyQoc:Gus3wnSlGf4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?i=4Cc9SfJyQoc:Gus3wnSlGf4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ReampedNET?a=4Cc9SfJyQoc:Gus3wnSlGf4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ReampedNET?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/4Cc9SfJyQoc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/4Cc9SfJyQoc/post.aspx</link>
      <author>ira</author>
      <comments>http://blog.reamped.net/post/2009/04/Finding-Text-in-SQL-Server-Stored-Procedures.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=b8e6a975-bcad-4d9d-bf2e-633c96a7304a</guid>
      <pubDate>Sun, 12 Apr 2009 20:01:00 -0400</pubDate>
      <category>Database</category>
      <category>SQL</category>
      <dc:publisher>ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=b8e6a975-bcad-4d9d-bf2e-633c96a7304a</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=b8e6a975-bcad-4d9d-bf2e-633c96a7304a</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2009/04/Finding-Text-in-SQL-Server-Stored-Procedures.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=b8e6a975-bcad-4d9d-bf2e-633c96a7304a</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=b8e6a975-bcad-4d9d-bf2e-633c96a7304a</feedburner:origLink></item>
    <item>
      <title>Top Posts of 2008</title>
      <description>&lt;p&gt;In a look back at what I have put up this year, here are the posts that have been most frequently visited:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://blog.reamped.net/post/2008/08/LINQ-Distinct-a-DataTable-and-the-IEqualityComparerT.aspx"&gt;LINQ Distinct, a DataTable and the IEqualityComparer&amp;lt;T&amp;gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.reamped.net/post/2008/05/Using-Database-Projects-for-Visual-Studio.aspx"&gt;Using Database Projects for Visual Studio&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.reamped.net/post/2008/02/Custom-Entity-Classes-Using-LINQ-to-SQL-Part-1---DataObjects.aspx"&gt;Custom Entity Classes Using LINQ to SQL (Series)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.reamped.net/post/2008/03/Implementing-Interfaces-ICloneable-and-IComparable.aspx"&gt;Implementing Interfaces: ICloneable and IComparable&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.reamped.net/post/2008/09/ASPNET-Ajax2c-JQuery-amp3b-JSON-Date-Serialization.aspx"&gt;ASP.NET Ajax, JQuery &amp;amp; JSON Date Serialization&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;There you have it! I hope that these articles have helped. I have had a lot of fun this year, my first year blogging. It is very humbling giving back to the community that has helped me out so much. I would also like to thank those who have contacted me about other .NET issues via the contact form. If you need some help too, feel free to contact me and I will try to lend a helping hand.&lt;/p&gt;  &lt;p&gt;All in all, thank you to anyone reading, and I hope you have a great new year!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;-Ira&lt;/p&gt;  &lt;p&gt;&lt;a target="_blank" href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2008/12/Top-Posts-of-2008.aspx&amp;amp;title=Top Posts of 2008"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2008/12/Top-Posts-of-2008.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bH46tWhdt4IFVM5aS7pd8TO2D9Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bH46tWhdt4IFVM5aS7pd8TO2D9Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bH46tWhdt4IFVM5aS7pd8TO2D9Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bH46tWhdt4IFVM5aS7pd8TO2D9Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=ng67rv8p"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=EmjYoZDJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=EmjYoZDJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=ZRUCREjT"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=ZRUCREjT" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=GKqhLj1m"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=GKqhLj1m" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=uQryC6QM"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/T1r9Cc2kK_Y" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/T1r9Cc2kK_Y/post.aspx</link>
      <author>Ira</author>
      <comments>http://blog.reamped.net/post/2008/12/Top-Posts-of-2008.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=ab7daadd-7505-4e58-b74a-dc13a29199e2</guid>
      <pubDate>Wed, 31 Dec 2008 17:27:32 -0400</pubDate>
      <category>Other</category>
      <dc:publisher>Ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=ab7daadd-7505-4e58-b74a-dc13a29199e2</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=ab7daadd-7505-4e58-b74a-dc13a29199e2</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2008/12/Top-Posts-of-2008.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=ab7daadd-7505-4e58-b74a-dc13a29199e2</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=ab7daadd-7505-4e58-b74a-dc13a29199e2</feedburner:origLink></item>
    <item>
      <title>SQL Server Side Paging With A Validated Dynamic Order By</title>
      <description>&lt;p&gt;So this is what it has come to anymore. Everyone is all about server side paging via SQL Server. As well they should be! It is so much faster and more efficient than having ADO or ADO.NET bring back a ton of records and then chop it to page it. However, there has always been some problems when trying to accomplish this task, especially using a SQL database that is pre 2005.&lt;/p&gt;  &lt;p&gt;This task is easier to accomplish in SQL 2005 and 2008 using the ROW_NUMBER() function. The part that gets flaky is having a dynamic order by clause in your SQL statement. Unfortunately, the only way to accomplish this is to write some dynamic SQL. In doing so, It can be hard to tell if the order by parameter received by the stored procedure is a valid one for the table you are selecting from.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Solution      &lt;br /&gt;&lt;/strong&gt;Enter the &amp;quot;IsValidOrderBy&amp;quot; user-defined function. This is a little function that will tell you if the column and order in the dynamic order by parameter is a valid one for the select statement you are running.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-size: 10pt; background: #f8f8f8; color: black; font-family: consolas, monaco, courier new"&gt;   &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;CREATE FUNCTION &lt;/span&gt;&lt;span style="color: maroon"&gt;[dbo]&lt;/span&gt;.&lt;span style="color: maroon"&gt;[udf_OrderByExists] &lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;@TableName &lt;/span&gt;&lt;span style="color: navy"&gt;NVARCHAR&lt;/span&gt;(&lt;span style="background: #e6ffff"&gt;50&lt;/span&gt;),&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;@OrderBy &lt;/span&gt;&lt;span style="color: navy"&gt;NVARCHAR&lt;/span&gt;(&lt;span style="background: #e6ffff"&gt;50&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: navy"&gt;RETURNS BIT&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;AS&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;BEGIN&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;DECLARE &lt;/span&gt;&lt;span style="color: maroon"&gt;@Result &lt;/span&gt;&lt;span style="color: navy"&gt;BIT&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;SET &lt;/span&gt;&lt;span style="color: maroon"&gt;@Result &lt;/span&gt;= &lt;span style="background: #e6ffff"&gt;0&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;DECLARE &lt;/span&gt;&lt;span style="color: maroon"&gt;@TableColumns &lt;/span&gt;&lt;span style="color: navy"&gt;TABLE&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; (&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;[ColumnNameAndSort] &lt;/span&gt;&lt;span style="color: navy"&gt;NVARCHAR&lt;/span&gt;(&lt;span style="background: #e6ffff"&gt;100&lt;/span&gt;) &lt;span style="color: navy"&gt;NOT NULL&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; )&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;INSERT INTO &lt;/span&gt;&lt;span style="color: maroon"&gt;@TableColumns&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;SELECT &lt;/span&gt;&lt;span style="color: maroon"&gt;[Name] &lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;FROM &lt;/span&gt;&lt;span style="color: maroon"&gt;syscolumns &lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;WHERE &lt;/span&gt;&lt;span style="color: maroon"&gt;ID &lt;/span&gt;= &lt;span style="color: navy"&gt;OBJECT_ID&lt;/span&gt;(&lt;span style="color: maroon"&gt;@TableName&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;INSERT INTO &lt;/span&gt;&lt;span style="color: maroon"&gt;@TableColumns&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;SELECT &lt;/span&gt;&lt;span style="color: maroon"&gt;[Name] &lt;/span&gt;+ &lt;span style="background: #ffffe6"&gt;' ASC' &lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;FROM &lt;/span&gt;&lt;span style="color: maroon"&gt;syscolumns &lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;WHERE &lt;/span&gt;&lt;span style="color: maroon"&gt;ID &lt;/span&gt;= &lt;span style="color: navy"&gt;OBJECT_ID&lt;/span&gt;(&lt;span style="color: maroon"&gt;@TableName&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;INSERT INTO &lt;/span&gt;&lt;span style="color: maroon"&gt;@TableColumns&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;SELECT &lt;/span&gt;&lt;span style="color: maroon"&gt;[Name] &lt;/span&gt;+ &lt;span style="background: #ffffe6"&gt;' DESC' &lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;FROM &lt;/span&gt;&lt;span style="color: maroon"&gt;syscolumns &lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;WHERE &lt;/span&gt;&lt;span style="color: maroon"&gt;ID &lt;/span&gt;= &lt;span style="color: navy"&gt;OBJECT_ID&lt;/span&gt;(&lt;span style="color: maroon"&gt;@TableName&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;IF EXISTS&lt;/span&gt;(&lt;span style="color: navy"&gt;SELECT &lt;/span&gt;&lt;span style="color: maroon"&gt;[ColumnNameAndSort] &lt;/span&gt;&lt;span style="color: navy"&gt;FROM &lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;@TableColumns &lt;/span&gt;&lt;span style="color: navy"&gt;WHERE &lt;/span&gt;&lt;span style="color: maroon"&gt;[ColumnNameAndSort] &lt;/span&gt;= &lt;span style="color: maroon"&gt;@OrderBy&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;SET &lt;/span&gt;&lt;span style="color: maroon"&gt;@Result &lt;/span&gt;= &lt;span style="background: #e6ffff"&gt;1&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;RETURN &lt;/span&gt;&lt;span style="color: maroon"&gt;@Result&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;END&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;
  &lt;br /&gt;Here you can see that we are taking 2 inputs. The first one being the table name you are selecting from, and the second being the order by clause received by the stored procedure. The function will then return a bit telling you if the column and order was found for the table you are selecting from.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 
    &lt;br /&gt;&lt;/strong&gt;A simple example of using this user defined function would be selecting from a table of products. In that case, your stored procedure could look like so&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="font-size: 10pt; background: #f8f8f8; color: black; font-family: consolas, monaco, courier new"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;CREATE PROCEDURE &lt;/span&gt;&lt;span style="color: maroon"&gt;[dbo]&lt;/span&gt;.&lt;span style="color: maroon"&gt;[usp_GetProductsPaged]&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;@SortExpression &lt;/span&gt;&lt;span style="color: navy"&gt;NVARCHAR&lt;/span&gt;(&lt;span style="background: #e6ffff"&gt;50&lt;/span&gt;),&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;@PageIndex &lt;/span&gt;&lt;span style="color: navy"&gt;INT&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;@PageSize &lt;/span&gt;&lt;span style="color: navy"&gt;INT&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;AS&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: green"&gt;-- SET NOCOUNT ON added to prevent extra result sets from&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: green"&gt;-- interfering with SELECT statements.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;SET NOCOUNT ON&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;IF &lt;/span&gt;((&lt;span style="color: navy"&gt;SELECT &lt;/span&gt;&lt;span style="color: maroon"&gt;[dbo]&lt;/span&gt;.&lt;span style="color: maroon"&gt;[udf_OrderByExists]&lt;/span&gt;(&lt;span style="background: #ffffe6"&gt;'dbo.Products'&lt;/span&gt;, &lt;span style="color: maroon"&gt;@SortExpression&lt;/span&gt;)) = &lt;span style="background: #e6ffff"&gt;0&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;SET &lt;/span&gt;&lt;span style="color: maroon"&gt;@SortExpression &lt;/span&gt;= &lt;span style="background: #ffffe6"&gt;'Name'&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;DECLARE &lt;/span&gt;&lt;span style="color: maroon"&gt;@sql &lt;/span&gt;&lt;span style="color: navy"&gt;AS NVARCHAR&lt;/span&gt;(&lt;span style="color: navy"&gt;MAX&lt;/span&gt;),&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;@ParamDefinition &lt;/span&gt;&lt;span style="color: navy"&gt;AS NVARCHAR&lt;/span&gt;(&lt;span style="color: navy"&gt;MAX&lt;/span&gt;),&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;@StartRowIndex &lt;/span&gt;&lt;span style="color: navy"&gt;INT&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;@RecordCount &lt;/span&gt;&lt;span style="color: navy"&gt;INT&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;SELECT &lt;/span&gt;&lt;span style="color: maroon"&gt;@RecordCount &lt;/span&gt;= &lt;span style="color: navy"&gt;COUNT&lt;/span&gt;(&lt;span style="color: maroon"&gt;[ProductID]&lt;/span&gt;) &lt;span style="color: navy"&gt;FROM &lt;/span&gt;&lt;span style="color: maroon"&gt;[Products]&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;IF &lt;/span&gt;&lt;span style="color: maroon"&gt;@PageIndex &lt;/span&gt;= &lt;span style="background: #e6ffff"&gt;0&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;SET &lt;/span&gt;&lt;span style="color: maroon"&gt;@PageIndex &lt;/span&gt;= &lt;span style="background: #e6ffff"&gt;1&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;IF &lt;/span&gt;&lt;span style="color: maroon"&gt;@PageSize &lt;/span&gt;= &lt;span style="background: #e6ffff"&gt;0&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;SET &lt;/span&gt;&lt;span style="color: maroon"&gt;@PageSize &lt;/span&gt;= &lt;span style="color: maroon"&gt;@RecordCount&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;SET &lt;/span&gt;&lt;span style="color: maroon"&gt;@StartRowIndex &lt;/span&gt;= ((&lt;span style="color: maroon"&gt;@PageIndex &lt;/span&gt;* &lt;span style="color: maroon"&gt;@PageSize&lt;/span&gt;) - &lt;span style="color: maroon"&gt;@PageSize&lt;/span&gt;) + &lt;span style="background: #e6ffff"&gt;1&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;SET &lt;/span&gt;&lt;span style="color: maroon"&gt;@ParamDefinition &lt;/span&gt;= &lt;span style="color: maroon"&gt;N&lt;/span&gt;&lt;span style="background: #ffffe6"&gt;'@paramStartRowIndex INT, &lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffffe6"&gt;@paramPageSize INT'&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;SET &lt;/span&gt;&lt;span style="color: maroon"&gt;@sql &lt;/span&gt;= &lt;span style="color: maroon"&gt;N&lt;/span&gt;&lt;span style="background: #ffffe6"&gt;'SELECT&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffffe6"&gt;[ProductID],&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffffe6"&gt;[Name],&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffffe6"&gt;[Description],&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffffe6"&gt;[Price]&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: #ffffe6"&gt;FROM (SELECT&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffffe6"&gt;[ProductID],&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffffe6"&gt;[Name],&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffffe6"&gt;[Description],&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffffe6"&gt;[Price],&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffffe6"&gt;ROW_NUMBER() OVER(ORDER BY ' &lt;/span&gt;+ &lt;span style="color: maroon"&gt;@SortExpression &lt;/span&gt;+ &lt;span style="background: #ffffe6"&gt;') AS [RowNumber]&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: #ffffe6"&gt;FROM [Products]) AS [Prods]&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: #ffffe6"&gt;WHERE [RowNumber] BETWEEN @paramStartRowIndex&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffffe6"&gt;AND (@paramStartRowIndex + @paramPageSize) - 1'&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: green"&gt;-- For testing&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: green"&gt;--PRINT @sql&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: green"&gt;--PRINT @StartRowIndex&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;EXEC &lt;/span&gt;&lt;span style="color: maroon"&gt;sp_executesql @sql&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: maroon"&gt;@ParamDefinition&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: maroon"&gt;@paramStartRowIndex &lt;/span&gt;= &lt;span style="color: maroon"&gt;@StartRowIndex&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: maroon"&gt;@paramPageSize &lt;/span&gt;= &lt;span style="color: maroon"&gt;@PageSize&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: navy"&gt;SELECT &lt;/span&gt;&lt;span style="color: maroon"&gt;@RecordCount &lt;/span&gt;&lt;span style="color: navy"&gt;AS &lt;/span&gt;&lt;span style="color: maroon"&gt;[RecordCount]&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;
  &lt;br /&gt;As you can see, by calling &lt;strong&gt;udf_OrderByExists &lt;/strong&gt;and passing in the parameters, if the order by does not fit the table, we then change it to be something known and valid.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion 
    &lt;br /&gt;&lt;/strong&gt;With a simple and portable user defined function, we can ensure that the order by clauses going into our paging stored procedures are validated thus keeping integrity. It isn't fun having to write and maintain dynamic SQL in stored procedures, but it can be done and also made a little bit safer. One last tip: Always use the sp_executesql, as this will tell the SQL server that the execution plan should be cached for re-use.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Hope this helps! 
  &lt;br /&gt;-Ira&lt;/p&gt;

&lt;p&gt;&lt;a target="_blank" href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2008/12/SQL-Server-Side-Paging-With-A-Validated-Dynamic-Order-By.aspx&amp;amp;title=SQL Server Side Paging With A Validated Dynamic Order By"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2008/12/SQL-Server-Side-Paging-With-A-Validated-Dynamic-Order-By.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LACa8vWsPSHX7Ji94t4qGVRtTVM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LACa8vWsPSHX7Ji94t4qGVRtTVM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LACa8vWsPSHX7Ji94t4qGVRtTVM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LACa8vWsPSHX7Ji94t4qGVRtTVM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=aeUW3xGd"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=vbku2ZKn"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=vbku2ZKn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=y1ULvib6"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=y1ULvib6" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=zwoe4tEt"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=zwoe4tEt" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=nyhqQpn0"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/filIveH0ohQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/filIveH0ohQ/post.aspx</link>
      <author>Ira</author>
      <comments>http://blog.reamped.net/post/2008/12/SQL-Server-Side-Paging-With-A-Validated-Dynamic-Order-By.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=2242335a-0558-4901-9436-c6a70462017d</guid>
      <pubDate>Fri, 12 Dec 2008 17:48:16 -0400</pubDate>
      <category>Database</category>
      <category>SQL</category>
      <dc:publisher>Ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=2242335a-0558-4901-9436-c6a70462017d</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=2242335a-0558-4901-9436-c6a70462017d</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2008/12/SQL-Server-Side-Paging-With-A-Validated-Dynamic-Order-By.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=2242335a-0558-4901-9436-c6a70462017d</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=2242335a-0558-4901-9436-c6a70462017d</feedburner:origLink></item>
    <item>
      <title>InfoPanel v1.0 - The site wide messaging system control</title>
      <description>&lt;p&gt;If you have read any of my previous posts on site wide user notification &lt;a href="http://blog.reamped.net/post/2008/02/Creating-a-Simple-Site-Wide-User-Notification-Pattern.aspx"&gt;patterns&lt;/a&gt; and &lt;a href="http://blog.reamped.net/post/2008/03/Site-Wide-User-Notification-Server-Control.aspx"&gt;controls&lt;/a&gt;, then you may know where this is going. I have compiled a server control to bring this functionality to the fingertips of my fellow ASP.NET developers! Simply drag and drop the control onto your page or your master page and you are in business. I figured out how tired I was of trying to get notifications to users in a simple way and got tired of rewriting one on every project. Lets take a look at how it works.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Once you are complete, your messages may look something like this:   &lt;br /&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/InfoP.0Thesitewidemessagingsystemcontrol_F7EF/11-28-2008%204-18-07%20PM_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="117" alt="11-28-2008 4-18-07 PM" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/InfoP.0Thesitewidemessagingsystemcontrol_F7EF/11-28-2008%204-18-07%20PM_thumb.png" width="524" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;First put the control on your page:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="background: #f8f8f8; color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a31515"&gt;rollem&lt;/span&gt;&lt;span style="background: #f8f8f8; color: blue"&gt;:&lt;/span&gt;&lt;span style="background: #f8f8f8; color: #a31515"&gt;InfoPanel &lt;/span&gt;&lt;span style="background: #f8f8f8; color: red"&gt;ID&lt;/span&gt;&lt;span style="background: #f8f8f8; color: blue"&gt;=&amp;quot;InfoPanel1&amp;quot; &lt;/span&gt;&lt;span style="background: #f8f8f8; color: red"&gt;runat&lt;/span&gt;&lt;span style="background: #f8f8f8; color: blue"&gt;=&amp;quot;server&amp;quot;
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: red"&gt;ErrorCssClass&lt;/span&gt;&lt;span style="background: #f8f8f8; color: blue"&gt;=&amp;quot;err&amp;quot;
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: red"&gt;ErrorImageUrl&lt;/span&gt;&lt;span style="background: #f8f8f8; color: blue"&gt;=&amp;quot;~/images/exclamation.png&amp;quot;
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: red"&gt;MessageCssClass&lt;/span&gt;&lt;span style="background: #f8f8f8; color: blue"&gt;=&amp;quot;msg&amp;quot;
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: red"&gt;MessageImageUrl&lt;/span&gt;&lt;span style="background: #f8f8f8; color: blue"&gt;=&amp;quot;~/images/information.png&amp;quot;
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: red"&gt;WarningCssClass&lt;/span&gt;&lt;span style="background: #f8f8f8; color: blue"&gt;=&amp;quot;wrn&amp;quot;
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: red"&gt;WarningImageUrl&lt;/span&gt;&lt;span style="background: #f8f8f8; color: blue"&gt;=&amp;quot;~/images/warn.png&amp;quot;
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: red"&gt;EnableViewState&lt;/span&gt;&lt;span style="background: #f8f8f8; color: blue"&gt;=&amp;quot;false&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;As you can see, you can set images and css classes for the notifications to use. &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;There are 3 types of notifications, a message, a warning and an error. Once the control is on your page, all you have to do is call into one of the methods that will display your message like so:&lt;/p&gt;

&lt;p&gt;&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red166\green83\blue0;\red248\green248\blue248;\red0\green0\blue0;\red128\green0\blue0;\red255\green255\blue230;}??\fs22 \cf1\cb2\highlight2 InfoPanel\cf0 .\cf4 DefaultInstance\cf0 .\cf4 DisplayMessage\cf0 (\cb5\highlight5 "This is some message"\cb2\highlight2 );\par ??\cf1 InfoPanel\cf0 .\cf4 DefaultInstance\cf0 .\cf4 DisplayWarning\cf0 (\cb5\highlight5 "This is some warning"\cb2\highlight2 );\par ??\cf1 InfoPanel\cf0 .\cf4 DefaultInstance\cf0 .\cf4 DisplayError\cf0 (\cb5\highlight5 "This is some error"\cb2\highlight2 );}
--&gt;&lt;/p&gt;

&lt;div style="font-size: 10pt; background: #f8f8f8; color: black; font-family: consolas, monaco, courier new"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: #a65300"&gt;InfoPanel&lt;/span&gt;.&lt;span style="color: maroon"&gt;DefaultInstance&lt;/span&gt;.&lt;span style="color: maroon"&gt;DisplayMessage&lt;/span&gt;(&lt;span style="background: #ffffe6"&gt;&amp;quot;This is some message&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: #a65300"&gt;InfoPanel&lt;/span&gt;.&lt;span style="color: maroon"&gt;DefaultInstance&lt;/span&gt;.&lt;span style="color: maroon"&gt;DisplayWarning&lt;/span&gt;(&lt;span style="background: #ffffe6"&gt;&amp;quot;This is some warning&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: #a65300"&gt;InfoPanel&lt;/span&gt;.&lt;span style="color: maroon"&gt;DefaultInstance&lt;/span&gt;.&lt;span style="color: maroon"&gt;DisplayError&lt;/span&gt;(&lt;span style="background: #ffffe6"&gt;&amp;quot;This is some error&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;These methods will work when the control is on the current page, and they will also work if the control is on your master page as the call for the control is recursive. It will que all the calls to it and display all the qued messages on the next render. &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important to note: &lt;/strong&gt;When using ASP.NET Ajax, the three server side calls above will work as long as you have a script manager and the InfoPanel control is inside of an UpdatePanel. Now I know what you're saying, &amp;quot;man this control would be great if it worked with JQuery&amp;quot;. Well I have news for you, IT DOES!&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;To call the control on the client side, you would make a call similar to the one you would make on the server side with only one difference. The call on the server side accepts one or two arguments depending on if you want the messages to be qued or not. It also has a method for clearing the messages when you're done with them. So the call would be something like this using JQuery:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;$&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ajax&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;({
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;type&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;: &lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;,
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;url&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;: &lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;JQuery.aspx/ThrowException&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;,
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;data&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;: &lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;{}&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;,
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;contentType&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;: &lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;application/json; charset=utf-8&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;,
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;dataType&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;: &lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;json&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;,
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;success&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;: &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;function&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;msg&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;) {
        
    },
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;error&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;: &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;function&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;xhr&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;) {
        &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;var &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;er &lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;= &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;$&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;parseJSON&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;xhr&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;responseText&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;true&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
        &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;InfoPanel&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;DefaultInstance&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;DisplayError&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;er&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;Message&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
    }
});&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;The snip above will show an error message when one is encountered. As I said before, you can also use the second argument for queing the messages like so:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;$&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;#btnShowMessages&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;).&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;click&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;function&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;() {
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;InfoPanel&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;DefaultInstance&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;ClearMessages&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;();
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;InfoPanel&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;DefaultInstance&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;DisplayMessage&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;Message&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;true&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;InfoPanel&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;DefaultInstance&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;DisplayWarning&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;Warning&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;true&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
    &lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;InfoPanel&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;DefaultInstance&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8; color: maroon"&gt;DisplayError&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;(&lt;/span&gt;&lt;span style="background: #ffffe6"&gt;&amp;quot;Error&amp;quot;&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;, &lt;/span&gt;&lt;span style="background: #f8f8f8; color: navy"&gt;true&lt;/span&gt;&lt;span style="background: #f8f8f8"&gt;);
});&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;You don't have to use JQuery, it will work with any JavaScript framework you use.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion 
    &lt;br /&gt;&lt;/strong&gt;If you are as tired of trying to build notification patterns from scratch for each ASP.NET website you build as I was, you might give this control a try. It is very flexible and configurable. It only has three calls to use and it will find the control and display your messages. It can be used both server side and client side for allowing notifications no matter what you're doing, or where you're doing it.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Hope this helps! 
  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:4769519b-89bf-4c54-a5f9-27a491173b2a" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;p&gt;Get the binary: &lt;a href="http://blog.reamped.net/file.axd?file=WindowsLiveWriter/InfoP.0Thesitewidemessagingsystemcontrol_F7EF/InfoPanel%20Binary_1.zip" target="_blank"&gt;InfoPanel Binary.zip&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;div class="wlWriterSmartContent" id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:e3dd59d3-6b83-4f9e-a56e-3d4ca61caa51" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;p&gt;Source and samples: &lt;a href="http://blog.reamped.net/file.axd?file=WindowsLiveWriter/InfoP.0Thesitewidemessagingsystemcontrol_F7EF/InfoPanel%20Source%20and%20Samples.zip" target="_blank"&gt;InfoPanel Source and Samples.zip&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a target="_blank" href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2008/11/InfoPanel-v10---The-site-wide-messaging-system-control.aspx&amp;amp;title=InfoPanel v1.0 - The site wide messaging system control"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2008/11/InfoPanel-v10---The-site-wide-messaging-system-control.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Bx7KN-RF5URBBsy-fX2KPL5K32U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bx7KN-RF5URBBsy-fX2KPL5K32U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Bx7KN-RF5URBBsy-fX2KPL5K32U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bx7KN-RF5URBBsy-fX2KPL5K32U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=vhyZPLlJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=dcowsLzQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=dcowsLzQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=lpvdRspn"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=lpvdRspn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=1oshZtsN"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=1oshZtsN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=vQEVoCKY"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/VRsNA6ljTRw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/VRsNA6ljTRw/post.aspx</link>
      <author>Ira</author>
      <comments>http://blog.reamped.net/post/2008/11/InfoPanel-v10---The-site-wide-messaging-system-control.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=5a7c31eb-22f3-4dec-adb2-1be478efe5ed</guid>
      <pubDate>Wed, 26 Nov 2008 18:30:05 -0400</pubDate>
      <category>Ajax</category>
      <category>ASP.NET</category>
      <category>JQuery</category>
      <category>Server Controls</category>
      <category>InfoPanel</category>
      <dc:publisher>Ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=5a7c31eb-22f3-4dec-adb2-1be478efe5ed</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=5a7c31eb-22f3-4dec-adb2-1be478efe5ed</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2008/11/InfoPanel-v10---The-site-wide-messaging-system-control.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=5a7c31eb-22f3-4dec-adb2-1be478efe5ed</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=5a7c31eb-22f3-4dec-adb2-1be478efe5ed</feedburner:origLink></item>
    <item>
      <title>The private access modifier can do that?</title>
      <description>&lt;p&gt;If you look up accessibility levels on the &lt;a href="http://msdn.microsoft.com/en-us/library/ba0a1yw2(VS.80).aspx" target="_blank"&gt;MSDN web site, it will tell you that the accessibility of the private access modifier is limited to the containing type&lt;/a&gt;. I ran into an instance that showed me the direct meaning of this statement. The scenario I had was this: I wanted to have the ability to make an object read only. That is the original object however, if a clone was made then the object could be modified again because it wasn't the original object. Of course this is a simple task, we get to go back and visit my good friend &lt;a href="http://blog.reamped.net/post/2008/03/Implementing-Interfaces-ICloneable-and-IComparable.aspx"&gt;ICloneable&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;So we start off by making our data object, putting in the ability to mark it read only and giving it the ability to clone itself. &lt;/p&gt; &lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red0\green0\blue128;\red248\green248\blue248;\red0\green0\blue0;\red166\green83\blue0;\red43\green145\blue175;\red128\green0\blue0;\red255\green255\blue230;\red0\green0\blue255;}??\fs22 \cf1\cb2\highlight2 public\cf0  \cf1 class\cf0  \cf4 Lion\cf0  : \cf5 ICloneable\par ??\cf0 \{\par ??    \cf1 public\cf0  \cf6 Lion\cf0 ()\par ??    \{\par ??\par ??    \}\par ??\par ??    \cf1 public\cf0  \cf6 Lion\cf0 (\cf1 string\cf0  \cf6 name\cf0 )\par ??    \{\par ??        \cf1 this\cf0 .\cf6 Name\cf0  = \cf6 name\cf0 ;\par ??    \}\par ??\par ??    \cf1 private\cf0  \cf1 bool\cf0  \cf6 _isReadOnly\cf0 ;\par ??\par ??    \cf1 public\cf0  \cf1 bool\cf0  \cf6 IsReadOnly\par ??\cf0     \{\par ??        \cf1 get\cf0  \{ \cf1 return\cf0  \cf6 _isReadOnly\cf0 ; \}\par ??    \}\par ??\par ??    \cf1 private\cf0  \cf1 string\cf0  \cf6 _name\cf0 ;\par ??\par ??    \cf1 public\cf0  \cf1 string\cf0  \cf6 Name\par ??\cf0     \{\par ??        \cf1 get\cf0  \{ \cf1 return\cf0  \cf6 _name\cf0 ; \}\par ??        \cf1 set\cf0  \par ??        \{\par ??            \cf1 if\cf0  (\cf6 _isReadOnly\cf0 )\par ??                \cf1 throw\cf0  \cf1 new\cf0  \cf4 ReadOnlyException\cf0 (\cb7\highlight7 "This object is read only"\cb2\highlight2 );\par ??            \cf6 _name\cf0  = \cf1 value\cf0 ; \par ??        \}\par ??    \}\par ??\par ??    \cf1 public\cf0  \cf1 void\cf0  \cf6 MakeReadOnly\cf0 ()\par ??    \{\par ??        \cf6 _isReadOnly\cf0  = \cf1 true\cf0 ;\par ??    \}\par ??\par ??\cf8     #region\cf0  ICloneable Members\par ??\par ??    \cf1 public\cf0  \cf4 Lion\cf0  \cf6 Clone\cf0 ()\par ??    \{\par ??        \cf4 Lion\cf0  \cf6 result\cf0  = (\cf4 Lion\cf0 )((\cf5 ICloneable\cf0 )\cf1 this\cf0 ).\cf6 Clone\cf0 ();\par ??        \cf6 result\cf0 .\cf6 _isReadOnly\cf0  = \cf1 false\cf0 ;\par ??        \cf1 return\cf0  \cf6 result\cf0 ;\par ??    \}\par ??\par ??    \cf1 object\cf0  \cf5 ICloneable\cf0 .\cf6 Clone\cf0 ()\par ??    \{\par ??        \cf1 return\cf0  \cf1 this\cf0 .\cf6 MemberwiseClone\cf0 ();\par ??    \}\par ??\par ??\cf8     #endregion\par ??\cf0 \}}
--&gt;  &lt;div style="font-size: 10pt; background: #f8f8f8; color: black; font-family: consolas, monaco, courier new"&gt;   &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: navy"&gt;public&lt;/span&gt; &lt;span style="color: navy"&gt;class&lt;/span&gt; &lt;span style="color: #a65300"&gt;Lion&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;ICloneable&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;public&lt;/span&gt; &lt;span style="color: maroon"&gt;Lion&lt;/span&gt;()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;public&lt;/span&gt; &lt;span style="color: maroon"&gt;Lion&lt;/span&gt;(&lt;span style="color: navy"&gt;string&lt;/span&gt; &lt;span style="color: maroon"&gt;name&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;this&lt;/span&gt;.&lt;span style="color: maroon"&gt;Name&lt;/span&gt; = &lt;span style="color: maroon"&gt;name&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;private&lt;/span&gt; &lt;span style="color: navy"&gt;bool&lt;/span&gt; &lt;span style="color: maroon"&gt;_isReadOnly&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;public&lt;/span&gt; &lt;span style="color: navy"&gt;bool&lt;/span&gt; &lt;span style="color: maroon"&gt;IsReadOnly&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;get&lt;/span&gt; { &lt;span style="color: navy"&gt;return&lt;/span&gt; &lt;span style="color: maroon"&gt;_isReadOnly&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;private&lt;/span&gt; &lt;span style="color: navy"&gt;string&lt;/span&gt; &lt;span style="color: maroon"&gt;_name&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;public&lt;/span&gt; &lt;span style="color: navy"&gt;string&lt;/span&gt; &lt;span style="color: maroon"&gt;Name&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;get&lt;/span&gt; { &lt;span style="color: navy"&gt;return&lt;/span&gt; &lt;span style="color: maroon"&gt;_name&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;set&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;if&lt;/span&gt; (&lt;span style="color: maroon"&gt;_isReadOnly&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 28&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;throw&lt;/span&gt; &lt;span style="color: navy"&gt;new&lt;/span&gt; &lt;span style="color: #a65300"&gt;ReadOnlyException&lt;/span&gt;(&lt;span style="background: #ffffe6"&gt;&amp;quot;This object is read only&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 29&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;_name&lt;/span&gt; = &lt;span style="color: navy"&gt;value&lt;/span&gt;; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 30&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 31&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 32&lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 33&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;public&lt;/span&gt; &lt;span style="color: navy"&gt;void&lt;/span&gt; &lt;span style="color: maroon"&gt;MakeReadOnly&lt;/span&gt;()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 34&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 35&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;_isReadOnly&lt;/span&gt; = &lt;span style="color: navy"&gt;true&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 36&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 37&lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 38&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; ICloneable Members&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 39&lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 40&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;public&lt;/span&gt; &lt;span style="color: #a65300"&gt;Lion&lt;/span&gt; &lt;span style="color: maroon"&gt;Clone&lt;/span&gt;()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 41&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 42&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a65300"&gt;Lion&lt;/span&gt; &lt;span style="color: maroon"&gt;result&lt;/span&gt; = (&lt;span style="color: #a65300"&gt;Lion&lt;/span&gt;)((&lt;span style="color: #2b91af"&gt;ICloneable&lt;/span&gt;)&lt;span style="color: navy"&gt;this&lt;/span&gt;).&lt;span style="color: maroon"&gt;Clone&lt;/span&gt;();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 43&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;result&lt;/span&gt;.&lt;span style="color: maroon"&gt;_isReadOnly&lt;/span&gt; = &lt;span style="color: navy"&gt;false&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 44&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;return&lt;/span&gt; &lt;span style="color: maroon"&gt;result&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 45&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 46&lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 47&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;object&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ICloneable&lt;/span&gt;.&lt;span style="color: maroon"&gt;Clone&lt;/span&gt;()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 48&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 49&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: navy"&gt;return&lt;/span&gt; &lt;span style="color: navy"&gt;this&lt;/span&gt;.&lt;span style="color: maroon"&gt;MemberwiseClone&lt;/span&gt;();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 50&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 51&lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 52&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="background: gray; color: white"&gt;&amp;#160;&amp;#160; 53&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Take a look at line #43 above. During the cloning process, you can set the private variable _isReadOnly on the newly cloned object! &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;For some reason, I was under the impression that any and all private fields and methods were private to that instance of the object. This would mean that all private members of the cloned object would have to be called in the cloned object. To my surprise, this is not the case at all. After changing the _isReadOnly field of the cloned object, the object that was cloned will still remain read only. The cloned object will remain editable until the MakeReadOnly() method is called on it.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion 
    &lt;br /&gt;&lt;/strong&gt;All fields and methods with the private access modifier are exposed at any time as long as you are in the containing type. The implications of this are that if you clone an object you will have access to the private members of the newly created object. This can be extremely useful, especially if you want a specific action to be performed on a cloned object but you don't want to explicitly call that action publicly.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Hope this helps!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:8c4fd54a-6a84-4ab1-9622-cf53b449a0a2" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;p&gt;Download the code: &lt;a href="http://blog.reamped.net/file.axd?file=WindowsLiveWriter/Theprivateaccessmodifiercandothat_11320/PrivateAccessModifier.zip" target="_blank"&gt;PrivateAccessModifier.zip&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a target="_blank" href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2008/10/The-private-access-modifier-can-do-that.aspx&amp;amp;title=The private access modifier can do that?"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2008/10/The-private-access-modifier-can-do-that.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sCf_vzFW4CN-FkQLyV6abTnmns0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sCf_vzFW4CN-FkQLyV6abTnmns0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sCf_vzFW4CN-FkQLyV6abTnmns0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sCf_vzFW4CN-FkQLyV6abTnmns0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=G5Ptb3gZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=N4AC0idT"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=N4AC0idT" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=1oH0YHvh"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=1oH0YHvh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=85Qle6s4"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=85Qle6s4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=TQEQ6nKm"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/YAPOpF-djqU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/YAPOpF-djqU/post.aspx</link>
      <author>Ira</author>
      <comments>http://blog.reamped.net/post/2008/10/The-private-access-modifier-can-do-that.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=37651940-22ce-45ed-98a9-bbce2cce51a9</guid>
      <pubDate>Wed, 08 Oct 2008 20:33:32 -0400</pubDate>
      <category>C#</category>
      <dc:publisher>Ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=37651940-22ce-45ed-98a9-bbce2cce51a9</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=37651940-22ce-45ed-98a9-bbce2cce51a9</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2008/10/The-private-access-modifier-can-do-that.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=37651940-22ce-45ed-98a9-bbce2cce51a9</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=37651940-22ce-45ed-98a9-bbce2cce51a9</feedburner:origLink></item>
    <item>
      <title>ASP.NET Ajax, JQuery &amp; JSON Date Serialization</title>
      <description>&lt;p&gt;
A little while back I came across a great post on how to use &lt;a href="http://www.jquery.com/" target="_blank"&gt;JQuery&lt;/a&gt; to do &lt;a href="http://encosia.com/2008/08/20/easily-build-powerful-client-side-ajax-paging-using-jquery/" target="_blank"&gt;more efficient client side paging by Dave Ward&lt;/a&gt;. The sample shows you how to use &lt;a href="http://www.jquery.com/" target="_blank"&gt;JQuery&lt;/a&gt; to do Ajax callbacks for client side paging using a grid template. After downloading the demo and parsing through it all, I found a lot of things I really liked and even came across a little gotchya with the way ASP.NET serializes dates in JSON.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
One part I really enjoyed about this sample is that your objects on the server are translated into client side objects. So Order.OrderID or Order.ShippingAddress.ShipName would work the same on the client and server side of the programming. The &lt;a href="http://jtemplates.tpython.com/" target="_blank"&gt;jtemplates&lt;/a&gt; add-in allows you to name your active object of the collection you are looping through a lot like .NET like so:
&lt;/p&gt;
&lt;pre class="code"&gt;
&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;tbody&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;{#foreach $T.d as order}
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;tr&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;td&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;{$T.order.OrderID}
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;td&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;td&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;{$T.order.ShippingAddress.ShipName}
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;td&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;td&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;{DateDeserialize($T.order.OrderDate).format(&amp;#39;MM/dd/yyyy&amp;#39;)}
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;td&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;td&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;{DateDeserialize($T.order.RequiredDate).format(&amp;#39;MM/dd/yyyy&amp;#39;)}
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;td&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;td&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;{$T.order.ShippingAddress.ShipCountry}
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;td&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;tr&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;{#/for}
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #a31515"&gt;tbody&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;
As you can see the order object is used in the &lt;a href="http://jtemplates.tpython.com/" target="_blank"&gt;jtemplates&lt;/a&gt; code just like in .NET code.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
You may have noticed the DateDeserialize() function followed by the extension method .format() in the snipped above. This is due to some date deserialization issues I ran into. The signature for the DateDeserialize method is as so:
&lt;/p&gt;
&lt;pre class="code"&gt;
&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: navy"&gt;function &lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: maroon"&gt;DateDeserialize&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;(&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: maroon"&gt;dateStr&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;) {
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: navy"&gt;return &lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: maroon"&gt;eval&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;(&lt;/span&gt;&lt;span style="background: #ffffe6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;#39;new&amp;#39;&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt; + &lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: maroon"&gt;dateStr&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;.&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: maroon"&gt;replace&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;(/\&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: green"&gt;//g, &amp;#39; &amp;#39;));
&lt;/span&gt;&lt;span style="background: #f8f8f8 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
This method is basically returning the evaluation of the date returned by the .NET framework (ex: /Date(894427200000)/), replacing the / with a space with the keyword &amp;quot;new&amp;quot; in front of it. This will return us a JavaScript Date object. Then I&amp;#39;m using the .format() extension method from the included MSAjax framework. It took me a little while to figure out, but once I did I fell in love. You can&amp;#39;t put a price on full on object-oriented programming!
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Special thanks to &lt;a href="http://www.encosia.com/" target="_blank"&gt;Dave Ward&lt;/a&gt; for opening my eyes to the power of &lt;a href="http://www.jquery.com/" target="_blank"&gt;JQuery&lt;/a&gt;!
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Hope this helps!
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;div id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:dd667de0-9d7d-4501-ad78-6452e05e61b8" class="wlWriterSmartContent" style="margin: 0px; padding: 0px; display: inline; float: none"&gt;
&lt;p&gt;
Download the code: &lt;a href="http://blog.reamped.net/file.axd?file=WindowsLiveWriter/ASP.NETAjaxJQueryJSONDateSerialization_11106/JsonDates2.zip" target="_blank"&gt;JsonDates.zip&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2008/09/ASPNET-Ajax2c-JQuery-amp3b-JSON-Date-Serialization.aspx&amp;amp;title=ASP.NET%20Ajax,%20JQuery%20&amp;amp;%20JSON%20Date%20Serialization" target="_blank"&gt;
&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2008/09/ASPNET-Ajax2c-JQuery-amp3b-JSON-Date-Serialization.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VM3GQktYJJitMPO2gCtjvnAUiPk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VM3GQktYJJitMPO2gCtjvnAUiPk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VM3GQktYJJitMPO2gCtjvnAUiPk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VM3GQktYJJitMPO2gCtjvnAUiPk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=WDljkY15"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=ugpXwLHR"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=ugpXwLHR" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=VQQmZIIK"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=VQQmZIIK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=cOVz5sXP"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=cOVz5sXP" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=t1DTOzpk"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/pjLN07ALsu8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/pjLN07ALsu8/post.aspx</link>
      <author>Ira</author>
      <comments>http://blog.reamped.net/post/2008/09/ASPNET-Ajax2c-JQuery-amp3b-JSON-Date-Serialization.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=ffb2e556-b17c-435b-b4f6-4be549a129bf</guid>
      <pubDate>Tue, 23 Sep 2008 18:36:00 -0400</pubDate>
      <category>Ajax</category>
      <category>ASP.NET</category>
      <category>JQuery</category>
      <dc:publisher>Ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=ffb2e556-b17c-435b-b4f6-4be549a129bf</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=ffb2e556-b17c-435b-b4f6-4be549a129bf</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2008/09/ASPNET-Ajax2c-JQuery-amp3b-JSON-Date-Serialization.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=ffb2e556-b17c-435b-b4f6-4be549a129bf</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=ffb2e556-b17c-435b-b4f6-4be549a129bf</feedburner:origLink></item>
    <item>
      <title>LINQ Distinct, a DataTable and the IEqualityComparer&lt;T&gt;</title>
      <description>&lt;p&gt;
In a recent situation I was trying to pull some aggregates out of a DataTable using LINQ. I needed to get the rows of the DataTable with a Distinct clause, but my aggregates would be on other columns of the row. The problem is that when you call LINQ&amp;#39;s Distinct() extension method with no arguments, it uses the &amp;quot;default IEqualityComparer&amp;quot;. This means that it will work if you use the Select() extension method, only returning the column you want the distinct on. Well that works great, unless you need more columns from the DataTable.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
The solution here is simple. Write a custom DataRow comparer that compares the DataRow against the column you are trying to put the distinct on. Here is an example:
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red0\green0\blue128;\red248\green248\blue248;\red0\green0\blue0;\red166\green83\blue0;\red43\green145\blue175;\red0\green0\blue255;\red128\green0\blue0;\red255\green255\blue230;}??\fs22 \cf1\cb2\highlight2 public\cf0  \cf1 class\cf0  \cf4 PersonDataRowComparer\cf0  : \cf5 IEqualityComparer\cf0 &amp;lt;\cf4 DataRow\cf0 &amp;gt;\par ??\{\par ??\cf6     #region\cf0  IEqualityComparer&amp;lt;DataRow&amp;gt; Members\par ??\par ??    \cf1 public\cf0  \cf1 bool\cf0  \cf7 Equals\cf0 (\cf4 DataRow\cf0  \cf7 x\cf0 , \cf4 DataRow\cf0  \cf7 y\cf0 )\par ??    \{\par ??        \cf1 return\cf0  (\cf7 x\cf0 .\cf7 Field\cf0 &amp;lt;\cf1 int\cf0 &amp;gt;(\cb8\highlight8 "PersonID"\cb2\highlight2 ) == \cf7 y\cf0 .\cf7 Field\cf0 &amp;lt;\cf1 int\cf0 &amp;gt;(\cb8\highlight8 "PersonID"\cb2\highlight2 ));\par ??    \}\par ??\par ??    \cf1 public\cf0  \cf1 int\cf0  \cf7 GetHashCode\cf0 (\cf4 DataRow\cf0  \cf7 obj\cf0 )\par ??    \{\par ??        \cf1 return\cf0  \cf7 obj\cf0 .\cf7 ToString\cf0 ().\cf7 GetHashCode\cf0 ();\par ??    \}\par ??\par ??\cf6     #endregion\par ??\cf0 \}}
--&gt;  
&lt;div style="background: #f8f8f8 none repeat scroll 0% 0%; font-size: 11pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; font-family: consolas,monaco,courier new"&gt;
&lt;pre style="margin: 0px"&gt;
&lt;span style="color: navy"&gt;public&lt;/span&gt; &lt;span style="color: navy"&gt;class&lt;/span&gt; &lt;span style="color: #a65300"&gt;PersonDataRowComparer&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IEqualityComparer&lt;/span&gt;&amp;lt;&lt;span style="color: #a65300"&gt;DataRow&lt;/span&gt;&amp;gt;
&lt;/pre&gt;
&lt;pre style="margin: 0px"&gt;
{
&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;pre style="margin: 0px"&gt;
&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt; IEqualityComparer&amp;lt;DataRow&amp;gt; Members
&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; &lt;span style="color: navy"&gt;public&lt;/span&gt; &lt;span style="color: navy"&gt;bool&lt;/span&gt; &lt;span style="color: maroon"&gt;Equals&lt;/span&gt;(&lt;span style="color: #a65300"&gt;DataRow&lt;/span&gt; &lt;span style="color: maroon"&gt;x&lt;/span&gt;, &lt;span style="color: #a65300"&gt;DataRow&lt;/span&gt; &lt;span style="color: maroon"&gt;y&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre style="margin: 0px"&gt;
&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; &lt;span style="color: navy"&gt;return&lt;/span&gt; (&lt;span style="color: maroon"&gt;x&lt;/span&gt;.&lt;span style="color: maroon"&gt;Field&lt;/span&gt;&amp;lt;&lt;span style="color: navy"&gt;int&lt;/span&gt;&amp;gt;(&lt;span style="background: #ffffe6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;quot;PersonID&amp;quot;&lt;/span&gt;) == &lt;span style="color: maroon"&gt;y&lt;/span&gt;.&lt;span style="color: maroon"&gt;Field&lt;/span&gt;&amp;lt;&lt;span style="color: navy"&gt;int&lt;/span&gt;&amp;gt;(&lt;span style="background: #ffffe6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;quot;PersonID&amp;quot;&lt;/span&gt;));
&lt;/pre&gt;
&lt;pre style="margin: 0px"&gt;
&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; &lt;span style="color: navy"&gt;public&lt;/span&gt; &lt;span style="color: navy"&gt;int&lt;/span&gt; &lt;span style="color: maroon"&gt;GetHashCode&lt;/span&gt;(&lt;span style="color: #a65300"&gt;DataRow&lt;/span&gt; &lt;span style="color: maroon"&gt;obj&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre style="margin: 0px"&gt;
&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; &lt;span style="color: navy"&gt;return&lt;/span&gt; &lt;span style="color: maroon"&gt;obj&lt;/span&gt;.&lt;span style="color: maroon"&gt;ToString&lt;/span&gt;().&lt;span style="color: maroon"&gt;GetHashCode&lt;/span&gt;();
&lt;/pre&gt;
&lt;pre style="margin: 0px"&gt;
&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;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="margin: 0px"&gt;
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Once we inherit IEqualityComparer&amp;lt;T&amp;gt; (T being the type we want to do the comparison on) all we do is fill in the Equals() and the GetHashCode() methods. In the Equals() method, we just tell the DataRows to compare the fields &amp;quot;PersonID&amp;quot; and return if they are equal. This will tell LINQ if the DataRow is distinct or not.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Hope this helps!
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;div id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:0c3f96a5-0a54-41d5-9e70-eef18f3746b8" class="wlWriterSmartContent" style="margin: 0px; padding: 0px; display: inline; float: none"&gt;
&lt;p&gt;
Download the code: &lt;a href="http://blog.reamped.net/file.axd?file=WindowsLiveWriter/LINQDistinctaDataTableandtheIEqualityCom_10D6E/LINQ_Distinct.zip"&gt;LINQ Distinct Sample&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2008/08/LINQ-Distinct-a-DataTable-and-the-IEqualityComparerT.aspx&amp;amp;title=LINQ%20Distinct,%20a%20DataTable%20and%20the%20IEqualityComparer%3CT%3E" target="_blank"&gt;
&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2008/08/LINQ-Distinct-a-DataTable-and-the-IEqualityComparerT.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
&lt;/a&gt; 
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/j3MKSu8l4JipMAAUoPuggNvOg1I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j3MKSu8l4JipMAAUoPuggNvOg1I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/j3MKSu8l4JipMAAUoPuggNvOg1I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j3MKSu8l4JipMAAUoPuggNvOg1I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=6LN1cqX9"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=92RsCXed"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=92RsCXed" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=JLHqhu42"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=JLHqhu42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=inZLEIwF"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=inZLEIwF" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=lf2Ft0ye"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/MGk5851l4CA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/MGk5851l4CA/post.aspx</link>
      <author>Ira</author>
      <comments>http://blog.reamped.net/post/2008/08/LINQ-Distinct-a-DataTable-and-the-IEqualityComparerT.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=9eddbcd7-7533-4d6b-abb7-b316e3077e5b</guid>
      <pubDate>Tue, 26 Aug 2008 17:58:00 -0400</pubDate>
      <category>C#</category>
      <category>LINQ</category>
      <dc:publisher>Ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=9eddbcd7-7533-4d6b-abb7-b316e3077e5b</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=9eddbcd7-7533-4d6b-abb7-b316e3077e5b</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2008/08/LINQ-Distinct-a-DataTable-and-the-IEqualityComparerT.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=9eddbcd7-7533-4d6b-abb7-b316e3077e5b</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=9eddbcd7-7533-4d6b-abb7-b316e3077e5b</feedburner:origLink></item>
    <item>
      <title>Strongly Typed Dynamic User Controls</title>
      <description>&lt;p&gt;A short time ago I was confronted with a serious problem. What I needed to do was dynamically choose a UserControl as well as fire methods from that UserControl. The problem lies in the fact that a UserControl does not implement my custom methods that I needed for my controls. Each control was similar and would have the same methods but it would have different display characteristics.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;That was when I had a small epiphany. Why can't I just make an abstract base class? Well the answer is you can! Sometimes I am prone to forget how .NET allows me to customize pre-defined classes. What we can do is create an abstract base class that inherits the UserControl class, then have our UserControls inherit from our base class.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;First we will create our abstract base class.&lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Data;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Configuration;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.Security;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.UI;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.UI.HtmlControls;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.UI.WebControls;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.UI.WebControls.WebParts;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Xml.Linq;

&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// Base class to be inherited by a UserControl that displays the date&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DateTimeDisplayControl : UserControl
{
    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// Updates the date time inside the user control.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; UpdateDateTime();
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;So in the snippet above, we have created a class called DateTimeDisplayControl. This inherits from UserControl and will have to override the abstract method UpdateDateTime().&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Now we can create a couple of UserControls that inherit from our DisplayDateTimeControl class. The first control will be called &amp;quot;ControlOne&amp;quot;.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Here is the *.ascx code:&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="background-color: #ffff00"&gt;&amp;lt;%@ Control Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; CodeFile=&amp;quot;ControlOne.ascx.cs&amp;quot; Inherits=&amp;quot;UserControls_ControlOne&amp;quot; %&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;User control one&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:UpdatePanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;udp1&amp;quot;&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;UpdateMode&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Conditional&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;lblDateTime&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:UpdatePanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Here is the code behind:&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Configuration;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Data;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.Security;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.UI;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.UI.HtmlControls;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.UI.WebControls;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.UI.WebControls.WebParts;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Xml.Linq;

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; UserControls_ControlOne : DateTimeDisplayControl
{
    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)
    {
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!Page.IsPostBack)
            UpdateDateTime();
    }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; UpdateDateTime()
    {
        lblDateTime.Text = DateTime.Now.ToString();
        udp1.Update();
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;As you can see, ControlOne contains an UpdatePanel with a Label inside of it. The Label will display the date and time. We will call our second control &amp;quot;ControlTwo&amp;quot; and it will look exactly like ControlOne, only it will say &amp;quot;User control two&amp;quot; inside of it.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Now we will create the actual *.aspx page to display the controls.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Here is the *.aspx code&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100.59%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; height: 743px; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="background-color: #ffff00"&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot;  CodeFile=&amp;quot;Default.aspx.cs&amp;quot; Inherits=&amp;quot;_Default&amp;quot; %&amp;gt;&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #800000"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color: #ff0000"&gt;html&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PUBLIC&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Untitled Page&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;form&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;form1&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:ScriptManager&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;sm1&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:UpdatePanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;udp&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;UpdateMode&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Conditional&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Panel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;pnlContent&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:AsyncPostBackTrigger&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ControlID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;btnUseControlOne&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;EventName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Click&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:AsyncPostBackTrigger&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ControlID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;btnUseControlTwo&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;EventName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Click&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:AsyncPostBackTrigger&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ControlID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;btnUpdateDateTime&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;EventName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Click&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:UpdatePanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;btnUseControlOne&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Use Control One&amp;quot;&lt;/span&gt; 
                &lt;span style="color: #ff0000"&gt;onclick&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;btnUseControlOne_Click&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;amp;nbsp;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;btnUseControlTwo&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Use Control Two&amp;quot;&lt;/span&gt; 
                &lt;span style="color: #ff0000"&gt;onclick&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;btnUseControlTwo_Click&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;amp;nbsp;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;btnUpdateDateTime&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Update Content&amp;quot;&lt;/span&gt; 
                &lt;span style="color: #ff0000"&gt;onclick&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;btnUpdateDateTime_Click&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;form&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Here is the code behind:&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Configuration;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Data;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.Security;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.UI;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.UI.HtmlControls;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.UI.WebControls;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.UI.WebControls.WebParts;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Xml.Linq;

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; _Default : System.Web.UI.Page 
{
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; _controlVirtualPath = &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Empty;
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; DateTimeDisplayControl _DateTimeDisplayControl = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;

    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ControlVirtualPath
    {
        get
        {
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(_controlVirtualPath))
                _controlVirtualPath = ViewState[&lt;span style="color: #006080"&gt;&amp;quot;ControlVirtualPath&amp;quot;&lt;/span&gt;].ToString();
            ViewState[&lt;span style="color: #006080"&gt;&amp;quot;ControlVirtualPath&amp;quot;&lt;/span&gt;] = _controlVirtualPath;
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(_controlVirtualPath))
                &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ApplicationException(&lt;span style="color: #006080"&gt;&amp;quot;The control virtual path was not found&amp;quot;&lt;/span&gt;);
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _controlVirtualPath;
        }
    }

    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; DateTimeDisplayControl LoadedAjaxControl
    {
        get
        {
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_DateTimeDisplayControl == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
            {
                _DateTimeDisplayControl = (DateTimeDisplayControl)Page.LoadControl(ControlVirtualPath);
            }
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _DateTimeDisplayControl;
        }
    }

    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; LoadAndDisplayUserControl()
    {
        pnlContent.Controls.Add(LoadedAjaxControl);
    }

    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; LoadAndDisplayUserControl(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; controlVirtualPath)
    {
        _controlVirtualPath = controlVirtualPath;
        pnlContent.Controls.Add(LoadedAjaxControl);
    }

    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)
    {
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!Page.IsPostBack)
            LoadAndDisplayUserControl(&lt;span style="color: #006080"&gt;&amp;quot;~/UserControls/ControlOne.ascx&amp;quot;&lt;/span&gt;);
    }

    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; btnUseControlOne_Click(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)
    {
        LoadAndDisplayUserControl(&lt;span style="color: #006080"&gt;&amp;quot;~/UserControls/ControlOne.ascx&amp;quot;&lt;/span&gt;);
    }

    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; btnUseControlTwo_Click(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)
    {
        LoadAndDisplayUserControl(&lt;span style="color: #006080"&gt;&amp;quot;~/UserControls/ControlTwo.ascx&amp;quot;&lt;/span&gt;);
    }

    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; btnUpdateDateTime_Click(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)
    {
        LoadAndDisplayUserControl();
        LoadedAjaxControl.UpdateDateTime();
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;As you may see, the *.aspx page will load up ControlOne by default. There are 3 buttons on the page that will allow you to swap out ControlOne and ControlTwo as well as call the UpdateDateTime() method of the controls.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;That is all there is to it! One important note is that I am using a private property to get the loaded control, this is important to note because you will need to call that UpdateDateTime() method on the instance of the control that you rendered to the page. I don't know why I didn't think of this long ago, but I hope you will find it as useful as I did!&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:d8bff25c-6ffd-4636-ae10-954efea617bc" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;p&gt;Download the code &lt;a href="http://blog.reamped.net/file.axd?file=WindowsLiveWriter/StronglyTypedDynamicUserControls_10E00/StronglyTypedDynamicUserControls_1.zip" target="_blank"&gt;StronglyTypedDynamicUserControls.zip&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;&lt;a target="_blank" href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2008/06/Strongly-Typed-Dynamic-User-Controls.aspx&amp;amp;title=Strongly Typed Dynamic User Controls"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2008/06/Strongly-Typed-Dynamic-User-Controls.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bGF4Apcp-wyXelobtX3PXYlCUwU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bGF4Apcp-wyXelobtX3PXYlCUwU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bGF4Apcp-wyXelobtX3PXYlCUwU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bGF4Apcp-wyXelobtX3PXYlCUwU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=sW4jkrkd"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=rK4cXCBG"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=rK4cXCBG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=Glr1FtmS"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=Glr1FtmS" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=zr8EH7Of"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=zr8EH7Of" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=JHyYtMLH"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/ahG_cIRGIIs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/ahG_cIRGIIs/post.aspx</link>
      <author>Ira</author>
      <comments>http://blog.reamped.net/post/2008/06/Strongly-Typed-Dynamic-User-Controls.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=69ffc86f-ff64-450d-aa99-6c1af2ec6b08</guid>
      <pubDate>Tue, 03 Jun 2008 17:53:39 -0400</pubDate>
      <category>Ajax</category>
      <category>ASP.NET</category>
      <category>C#</category>
      <category>User Controls</category>
      <dc:publisher>Ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=69ffc86f-ff64-450d-aa99-6c1af2ec6b08</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=69ffc86f-ff64-450d-aa99-6c1af2ec6b08</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2008/06/Strongly-Typed-Dynamic-User-Controls.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=69ffc86f-ff64-450d-aa99-6c1af2ec6b08</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=69ffc86f-ff64-450d-aa99-6c1af2ec6b08</feedburner:origLink></item>
    <item>
      <title>Using Database Projects for Visual Studio</title>
      <description>&lt;p&gt;Do you use database projects in Visual Studio? If not, then now is a good time to start. It is the best way I have found to source control my databases without actually sticking the database file itself in the repository. It is very simple to add to your solution and creates a default directory structure for your create scripts, change scripts and queries. Best of all the project will be recognized by source control and added to the source code repository. This means you can keep versioned scripts for maintainability. It also gives you the option to do the dreaded rollback!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Lets start by creating a database project of our own. To start, we will create a blank Visual Studio solution.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_18_56_00_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="152" alt="screenshot-2008-05-05_18_56_00" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_18_56_00_thumb.png" width="297" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now click File -&amp;gt; Add -&amp;gt; New Project.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_18_57_08_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="172" alt="screenshot-2008-05-05_18_57_08" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_18_57_08_thumb.png" width="161" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;You should get the dialog below. Now we will look in the node of &amp;quot;Other Project Types&amp;quot;, click &amp;quot;Database&amp;quot; then select &amp;quot;Database Project&amp;quot;. This will give us the opportunity to name our database project. We will call this one by the database we are going to be using, good ol' Northwind.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_18_58_44_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="451" alt="screenshot-2008-05-05_18_58_44" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_18_58_44_thumb.png" width="687" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Next you will be asked to setup a database reference. So here all we have to do is add a new reference to the Northwind database.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_18_59_29_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="329" alt="screenshot-2008-05-05_18_59_29" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_18_59_29_thumb.png" width="309" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;My database will be in SQL Server, yours can be in any of the choices shown below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_01_31_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="261" alt="screenshot-2008-05-05_19_01_31" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_01_31_thumb.png" width="442" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now we just set the server name and choose the Northwind database.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_02_07_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="578" alt="screenshot-2008-05-05_19_02_07" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_02_07_thumb.png" width="386" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;You should then test your connection (out of good practice) and see the dialog below upon success.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_02_15_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="130" alt="screenshot-2008-05-05_19_02_15" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_02_15_thumb.png" width="216" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now we will see our database reference shown in the original list of references. Just double click on your newly added reference.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_02_31_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="329" alt="screenshot-2008-05-05_19_02_31" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_02_31_thumb.png" width="309" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now your project should look something like the shot below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_02_51_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="219" alt="screenshot-2008-05-05_19_02_51" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_02_51_thumb.png" width="297" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Once we get this far, we need to start filling our folders with database scripts. You can add new folders if you wish, but I think the default folder structure is good enough. Now then, we can use the database publishing wizard to get our first create script into the &amp;quot;Create Scripts&amp;quot; folder.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Double click the reference to your database in the database references and it should bounce you to the server explorer window with your data connection all setup.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_05_20_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="171" alt="screenshot-2008-05-05_19_05_20" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_05_20_thumb.png" width="297" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Right click your data connection and click &amp;quot;Publish to provider...&amp;quot; to start the database publishing wizard.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_05_31_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="272" alt="screenshot-2008-05-05_19_05_31" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_05_31_thumb.png" width="190" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now we select the database we would like to publish, so again I will choose Northwind.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_05_52_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="453" alt="screenshot-2008-05-05_19_05_52" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_05_52_thumb.png" width="497" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now with the &amp;quot;Script to file&amp;quot; option chosen, we will browse to the &amp;quot;Create Scripts&amp;quot; folder in our database project to put the outputted .sql file.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_06_51_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="453" alt="screenshot-2008-05-05_19_06_51" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_06_51_thumb.png" width="497" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now we get to choose some options. I am going to set the output for SQL Server 2005 and select to script the database schema only.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_07_18_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="453" alt="screenshot-2008-05-05_19_07_18" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_07_18_thumb.png" width="497" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now we can review the summary of what we have configured and click finish.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_07_26_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="453" alt="screenshot-2008-05-05_19_07_26" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_07_26_thumb.png" width="497" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Upon clicking finish, we will see the progress of the .sql file being scripted to the hard drive.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_08_07_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="453" alt="screenshot-2008-05-05_19_08_07" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_08_07_thumb.png" width="497" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ok, for some reason I couldn't find a refresh button in the database project to see the file that was created so we will right click the &amp;quot;Create Scripts&amp;quot; folder and click &amp;quot;Add Existing Item...&amp;quot;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_10_15_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="270" alt="screenshot-2008-05-05_19_10_15" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_10_15_thumb.png" width="207" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Then browse to our .sql file and click the &amp;quot;Add&amp;quot; button.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_10_27_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="423" alt="screenshot-2008-05-05_19_10_27" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_10_27_thumb.png" width="567" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now we should see it in our project and we can also see the contents of the generated script by opening it in the editor.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_12_20_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="187" alt="screenshot-2008-05-05_19_12_20" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_12_20_thumb.png" width="297" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_12_31_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="218" alt="screenshot-2008-05-05_19_12_31" src="http://blog.reamped.net/image.axd?picture=WindowsLiveWriter/UsingDatabaseProjectsforVisualStudio_11CA4/screenshot-2008-05-05_19_12_31_thumb.png" width="510" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;It really is just that simple. I mean if nothing else you have a designated place to put all your SQL scripts for your database. The big plus is that your scripts will be source controlled. Also, anyone who opens the solution will know exactly which databases are used by the project.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Hope this helps!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a target="_blank" href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2008/05/Using-Database-Projects-for-Visual-Studio.aspx&amp;amp;title=Using Database Projects for Visual Studio"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2008/05/Using-Database-Projects-for-Visual-Studio.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/weUYAqMgEcKCa6TKASPr8wBv3YQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/weUYAqMgEcKCa6TKASPr8wBv3YQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/weUYAqMgEcKCa6TKASPr8wBv3YQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/weUYAqMgEcKCa6TKASPr8wBv3YQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=SR55SaMq"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=mDhkvCDM"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=mDhkvCDM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=cq51Mx9C"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=cq51Mx9C" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=QRqT7IJG"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=QRqT7IJG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=aGgz1l7y"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/bfmPuzi2Kbk" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/bfmPuzi2Kbk/post.aspx</link>
      <author>Ira</author>
      <comments>http://blog.reamped.net/post/2008/05/Using-Database-Projects-for-Visual-Studio.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=98580efc-c50a-4a6e-b4d1-2292d44cc7d1</guid>
      <pubDate>Tue, 06 May 2008 19:31:14 -0400</pubDate>
      <category>Visual Studio</category>
      <category>Database</category>
      <category>SQL</category>
      <dc:publisher>Ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=98580efc-c50a-4a6e-b4d1-2292d44cc7d1</pingback:target>
      <slash:comments>16</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=98580efc-c50a-4a6e-b4d1-2292d44cc7d1</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2008/05/Using-Database-Projects-for-Visual-Studio.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=98580efc-c50a-4a6e-b4d1-2292d44cc7d1</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=98580efc-c50a-4a6e-b4d1-2292d44cc7d1</feedburner:origLink></item>
    <item>
      <title>Why VisualSVN 1.4 Is So Great</title>
      <description>&lt;p&gt;
So after the installation of &lt;a href="http://www.visualsvn.com/release-1.4.html" target="_blank"&gt;VisualSVN 1.4&lt;/a&gt;, I don&amp;#39;t think I&amp;#39;ll ever look back. Finally a version of Visual Studio source control integration to make me leave the realms of Visual Source Safe forever. Now VisualSVN has put all the most important commands one click away. Not to mention, they added a couple things to make life a little easier for SVN newbies like myself.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Here we will go over some of my favorite new features added to this newest release. If you are familiar with the &lt;a href="http://coding-time.blogspot.com/2008/04/subversion-visually-explained-in-30sec.html" target="_blank"&gt;Subversion approach to a multideveloper environment&lt;/a&gt; then you will love the new VisualSVN toolbar. It puts the commands most often used in a position for single-click access to source control for your project. The commands accessible from the toolbar are Show Changes, Update, Commit, Branch, Switch, and Merge. Not to mention showing you your working repository URL. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.reamped.net/image.axd?picture=screenshot-2008-04-23_19_38_55.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Now as some of you may have read, they also have taken the Add Solution dialog and converted it to a wizard. This is great news for me, seeing as how the dialog was a bit confusing the first time I ever used it. Now with the new easy to use wizard, it is easier than ever to add my solutions to my repository. Let me walk you through it. First, from the VisualSVN menu, click &amp;quot;Add Solution to Subversion&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.reamped.net/image.axd?picture=screenshot-2008-04-23_19_48_36.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
On the first dialog, it will yell at you if your solution is not in a folder called &amp;quot;working copy root&amp;quot;. That is fine, just tick the box saying that you will set it manually and click the next button.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.reamped.net/image.axd?picture=screenshot-2008-04-23_19_52_28.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;Now we set our working copy root and click next.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.reamped.net/image.axd?picture=screenshot-2008-04-24_18_23_11.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;Now we just tell it where our repository location is. It gives the options of creating a new repository or adding to an existing repository. In this instance, I&amp;#39;m going to create a new repository.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.reamped.net/image.axd?picture=screenshot-2008-04-24_18_25_51.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Now all that is left to do is import the solution to Subversion. The next screen will tell you that it is going to create the default branch, tag and trunk folder structure for the repository. Just click import already.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.reamped.net/image.axd?picture=screenshot-2008-04-24_18_42_10.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
That will do it. The final step of the wizard is just lets you know the import was successful. Upon clicking finish, you are a commit away from having your project in Subversion.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.reamped.net/image.axd?picture=screenshot-2008-04-24_18_43_41.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
There you have it! Just click the commit button and you are officially under source control. Now for those who don&amp;#39;t know, &lt;a href="http://visualsvn.com/server/" target="_blank"&gt;VisualSVN also makes a Subversion server&lt;/a&gt;. These are just a couple of new features. I also really like the Quick Diff functionality. I truly think they have done a great job with this one. If you haven&amp;#39;t tried it then now should be the time. The sooner you are in source control, the sooner you can roll back mistakes!
&lt;/p&gt;
&lt;p&gt;
Hope this helps.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2008/04/Why-VisualSVN-14-Is-So-Great.aspx&amp;amp;title=Why%20VisualSVN%201.4%20Is%20So%20Great" target="_blank"&gt;
&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2008/04/Why-VisualSVN-14-Is-So-Great.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
&lt;/a&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PAExJjNZICcG8WpEM1R9DAUjumg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PAExJjNZICcG8WpEM1R9DAUjumg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PAExJjNZICcG8WpEM1R9DAUjumg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PAExJjNZICcG8WpEM1R9DAUjumg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=3EbbPWfd"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=IrP9ARZK"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=IrP9ARZK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=5INhvsHH"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=5INhvsHH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=rLFPo6Dd"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=rLFPo6Dd" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=yroFX7yy"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/gfzHoQcZues" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/gfzHoQcZues/post.aspx</link>
      <author>Ira</author>
      <comments>http://blog.reamped.net/post/2008/04/Why-VisualSVN-14-Is-So-Great.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=d9dfec82-c553-4d51-b303-4d5505cbaeea</guid>
      <pubDate>Thu, 24 Apr 2008 18:02:00 -0400</pubDate>
      <category>Visual Studio</category>
      <dc:publisher>Ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=d9dfec82-c553-4d51-b303-4d5505cbaeea</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=d9dfec82-c553-4d51-b303-4d5505cbaeea</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2008/04/Why-VisualSVN-14-Is-So-Great.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=d9dfec82-c553-4d51-b303-4d5505cbaeea</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=d9dfec82-c553-4d51-b303-4d5505cbaeea</feedburner:origLink></item>
    <item>
      <title>Using The Event Model: Throwing and Handling Custom Events</title>
      <description>&lt;p&gt;
If you haven&amp;#39;t tried using the event model in .NET you don&amp;#39;t know what you&amp;#39;re missing. If this is the case, then I&amp;#39;m glad you&amp;#39;re here. Events are a very nice&amp;nbsp;way to add flexibility to your&amp;nbsp;projects. You can use them for a variety of things including validation and logging. You can think of an event as sort of an All Points Bulletin (APB) throughout your application. Once you declare and throw an event, every place in your code that has&amp;nbsp;an event handler for that event will be executed. Events can be both static or per instance. You use events every time you build an ASP.NET website. The Page_Load event, Button_Click event, etc... It is like an application wide notification that something is happening. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
An important note is that all event handlers that have been moved to the call stack will be fired. So when you call out to your custom event, all objects that are in the call stack with an event handler for that event will be fired. Another thing to keep in mind is that there is no guaranteed order in which the events will be fired. If you are in need of doing something that requires a specific order, you should use more events or take another approach entirely. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
In this project, we will create some events and handle them in a logging system. The first thing we will need to do is set up an event delegate to strongly type our event. Along with doing that, I like to setup some custom event arguments that will take in the object(s) that I will be dealing with during the event. 
&lt;/p&gt;
&lt;div class="codeSnippet"&gt;
	&lt;div class="codeHeader"&gt;
		&lt;img src="http://blog.furred.net/pics/page_white_code.png" /&gt;
		&lt;a href="" onclick="document.getElementById('snippet_36').style.display = document.getElementById('snippet_36').style.display == 'none' ? 'block' : 'none'; return false;"
		title="Click for expanding.."&gt;C#-Code: PersonEventArgs.cs&lt;/a&gt;
	&lt;/div&gt;
	&lt;pre id="snippet_36" class="codeContainer"&gt;&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;
&lt;span style="color:#008000"&gt;//Delegate&amp;#160;for&amp;#160;a&amp;#160;PersonEvent&lt;/span&gt;
&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;delegate&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;PersonEvent(PersonEventArgs&amp;nbsp;e);
&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;class&lt;/span&gt;&amp;nbsp;PersonEventArgs&amp;nbsp;:&amp;nbsp;EventArgs
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;PersonEventArgs()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;PersonEventArgs(Person&amp;nbsp;person)
&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:#0000FF"&gt;this&lt;/span&gt;.Person&amp;nbsp;=&amp;nbsp;person;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;PersonEventArgs(List&amp;lt;Person&amp;gt;&amp;nbsp;personList)
&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:#0000FF"&gt;this&lt;/span&gt;.PersonList&amp;nbsp;=&amp;nbsp;personList;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000"&gt;//Person&amp;#160;the&amp;#160;action&amp;#160;will&amp;#160;be&amp;#160;on&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;Person&amp;nbsp;Person&amp;nbsp;{&amp;nbsp;&lt;span style="color:#0000FF"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:#0000FF"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000"&gt;//List&amp;#160;of&amp;#160;person&amp;#160;the&amp;#160;action&amp;#160;will&amp;#160;be&amp;#160;on&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;List&amp;lt;Person&amp;gt;&amp;nbsp;PersonList&amp;nbsp;{&amp;nbsp;&lt;span style="color:#0000FF"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:#0000FF"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000"&gt;//For&amp;#160;canceling&amp;#160;action&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;bool&lt;/span&gt;&amp;nbsp;Cancel&amp;nbsp;{&amp;nbsp;&lt;span style="color:#0000FF"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:#0000FF"&gt;set&lt;/span&gt;;&amp;nbsp;}
}&lt;/pre&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
	document.getElementById('snippet_36').style.display='block';
&lt;/script&gt; 
&lt;p&gt;
Ok, Now all we have to do is declare and throw our events. When declaring our events, they will be of the type PersonEvent. 
&lt;/p&gt;
&lt;div class="codeSnippet"&gt;
	&lt;div class="codeHeader"&gt;
		&lt;img src="http://blog.furred.net/pics/page_white_code.png" /&gt;
		&lt;a href="" onclick="document.getElementById('snippet_37').style.display = document.getElementById('snippet_37').style.display == 'none' ? 'block' : 'none'; return false;"
		title="Click for expanding.."&gt;C#-Code: PersonBLL.cs&lt;/a&gt;
	&lt;/div&gt;
	&lt;pre id="snippet_37" class="codeContainer"&gt;&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.ComponentModel;
[DataObject(&lt;span style="color:#0000FF"&gt;true&lt;/span&gt;)]
&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;class&lt;/span&gt;&amp;nbsp;PersonBLL
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000"&gt;//Declare&amp;#160;events&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;event&lt;/span&gt;&amp;nbsp;PersonEvent&amp;nbsp;Pre_Get;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;event&lt;/span&gt;&amp;nbsp;PersonEvent&amp;nbsp;Post_Get;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;event&lt;/span&gt;&amp;nbsp;PersonEvent&amp;nbsp;Pre_Insert;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;event&lt;/span&gt;&amp;nbsp;PersonEvent&amp;nbsp;Post_Insert;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;event&lt;/span&gt;&amp;nbsp;PersonEvent&amp;nbsp;Pre_Update;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;event&lt;/span&gt;&amp;nbsp;PersonEvent&amp;nbsp;Post_Update;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;event&lt;/span&gt;&amp;nbsp;PersonEvent&amp;nbsp;Pre_Delete;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;event&lt;/span&gt;&amp;nbsp;PersonEvent&amp;nbsp;Post_Delete;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DataObjectMethod(DataObjectMethodType.Select)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;List&amp;lt;PersonPresentationShell&amp;gt;&amp;nbsp;GetPeople()
&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:#008000"&gt;//Call&amp;#160;out&amp;#160;to&amp;#160;event&amp;#160;handler&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(Pre_Get&amp;nbsp;!=&amp;nbsp;&lt;span style="color:#0000FF"&gt;null&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonEventArgs&amp;nbsp;args&amp;nbsp;=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEventArgs();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pre_Get(args);
&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:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(args.Cancel)&amp;nbsp;&lt;span style="color:#0000FF"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;null&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;PersonPresentationShell&amp;gt;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;PersonPresentationShell&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;Person&amp;gt;&amp;nbsp;personList&amp;nbsp;=&amp;nbsp;DataAccessFactory.GetPeople();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;foreach&lt;/span&gt;&amp;nbsp;(Person&amp;nbsp;item&amp;nbsp;&lt;span style="color:#0000FF"&gt;in&lt;/span&gt;&amp;nbsp;personList)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result.Add(&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonPresentationShell(item));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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:#008000"&gt;//Call&amp;#160;out&amp;#160;to&amp;#160;event&amp;#160;handler&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(Post_Get&amp;nbsp;!=&amp;nbsp;&lt;span style="color:#0000FF"&gt;null&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonEventArgs&amp;nbsp;args&amp;nbsp;=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEventArgs(personList);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Post_Get(args);
&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:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(args.Cancel)&amp;nbsp;&lt;span style="color:#0000FF"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;null&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;return&lt;/span&gt;&amp;nbsp;result;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DataObjectMethod(DataObjectMethodType.Update)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;UpdatePerson(PersonPresentationShell&amp;nbsp;p)
&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:#008000"&gt;//Call&amp;#160;out&amp;#160;to&amp;#160;event&amp;#160;handler&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(Pre_Update&amp;nbsp;!=&amp;nbsp;&lt;span style="color:#0000FF"&gt;null&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonEventArgs&amp;nbsp;args&amp;nbsp;=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEventArgs(p.Person);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pre_Update(args);
&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:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(args.Cancel)&amp;nbsp;&lt;span style="color:#0000FF"&gt;return&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataAccessFactory.UpdatePerson(p.Person);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000"&gt;//Call&amp;#160;out&amp;#160;to&amp;#160;event&amp;#160;handler&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(Post_Update&amp;nbsp;!=&amp;nbsp;&lt;span style="color:#0000FF"&gt;null&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonEventArgs&amp;nbsp;args&amp;nbsp;=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEventArgs(p.Person);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Post_Update(args);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DataObjectMethod(DataObjectMethodType.Delete)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;DeletePerson(PersonPresentationShell&amp;nbsp;p)
&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:#008000"&gt;//Call&amp;#160;out&amp;#160;to&amp;#160;event&amp;#160;handler&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(Pre_Delete&amp;nbsp;!=&amp;nbsp;&lt;span style="color:#0000FF"&gt;null&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonEventArgs&amp;nbsp;args&amp;nbsp;=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEventArgs(p.Person);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pre_Delete(args);
&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:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(args.Cancel)&amp;nbsp;&lt;span style="color:#0000FF"&gt;return&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataAccessFactory.DeletePerson(p.Person);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000"&gt;//Call&amp;#160;out&amp;#160;to&amp;#160;event&amp;#160;handler&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(Post_Delete&amp;nbsp;!=&amp;nbsp;&lt;span style="color:#0000FF"&gt;null&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonEventArgs&amp;nbsp;args&amp;nbsp;=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEventArgs(p.Person);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Post_Delete(args);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DataObjectMethod(DataObjectMethodType.Insert)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;InsertPerson(PersonPresentationShell&amp;nbsp;p)
&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:#008000"&gt;//Call&amp;#160;out&amp;#160;to&amp;#160;event&amp;#160;handler&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(Pre_Insert&amp;nbsp;!=&amp;nbsp;&lt;span style="color:#0000FF"&gt;null&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonEventArgs&amp;nbsp;args&amp;nbsp;=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEventArgs(p.Person);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pre_Insert(args);
&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:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(args.Cancel)&amp;nbsp;&lt;span style="color:#0000FF"&gt;return&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataAccessFactory.InsertPerson(p.Person);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000"&gt;//Call&amp;#160;out&amp;#160;to&amp;#160;event&amp;#160;handler&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(Post_Insert&amp;nbsp;!=&amp;nbsp;&lt;span style="color:#0000FF"&gt;null&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonEventArgs&amp;nbsp;args&amp;nbsp;=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEventArgs(p.Person);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Post_Insert(args);
&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;/pre&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
	document.getElementById('snippet_37').style.display='block';
&lt;/script&gt; 
&lt;p&gt;
There we have it! An event will now be thrown before and after every get, insert, update and delete. Now we have to set up some event&amp;nbsp;handlers in our logging object. 
&lt;/p&gt;
&lt;div class="codeSnippet"&gt;
	&lt;div class="codeHeader"&gt;
		&lt;img src="http://blog.furred.net/pics/page_white_code.png" /&gt;
		&lt;a href="" onclick="document.getElementById('snippet_38').style.display = document.getElementById('snippet_38').style.display == 'none' ? 'block' : 'none'; return false;"
		title="Click for expanding.."&gt;C#-Code: Logger.cs&lt;/a&gt;
	&lt;/div&gt;
	&lt;pre id="snippet_38" class="codeContainer"&gt;&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.IO;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Web;
&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;class&lt;/span&gt;&amp;nbsp;Logger
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000"&gt;//Set&amp;#160;the&amp;#160;log&amp;#160;file&amp;#160;location&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;&amp;nbsp;_logFileLocation&amp;nbsp;=&amp;nbsp;HttpContext.Current.Server.MapPath(&amp;quot;&lt;span style="color:#8B0000"&gt;~/App_Data/logfile.log&lt;/span&gt;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;Logger()
&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:#008000"&gt;//Attach&amp;#160;event&amp;#160;handlers&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonBLL.Pre_Delete&amp;nbsp;+=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEvent(PersonBLL_Pre_Delete);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonBLL.Post_Delete&amp;nbsp;+=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEvent(PersonBLL_Post_Delete);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonBLL.Pre_Get&amp;nbsp;+=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEvent(PersonBLL_Pre_Get);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonBLL.Post_Get&amp;nbsp;+=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEvent(PersonBLL_Post_Get);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonBLL.Pre_Insert&amp;nbsp;+=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEvent(PersonBLL_Pre_Insert);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonBLL.Post_Insert&amp;nbsp;+=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEvent(PersonBLL_Post_Insert);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonBLL.Pre_Update&amp;nbsp;+=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEvent(PersonBLL_Pre_Update);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonBLL.Post_Update&amp;nbsp;+=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;PersonEvent(PersonBLL_Post_Update);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;PersonBLL_Post_Update(PersonEventArgs&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLogFile(&amp;quot;&lt;span style="color:#8B0000"&gt;PersonId:&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.PersonId.ToString()&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;-&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.FirstName&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.LastName&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;was&amp;#160;updated&lt;/span&gt;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;PersonBLL_Pre_Update(PersonEventArgs&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLogFile(&amp;quot;&lt;span style="color:#8B0000"&gt;PersonId:&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.PersonId.ToString()&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;-&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.FirstName&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.LastName&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;is&amp;#160;about&amp;#160;to&amp;#160;be&amp;#160;updated&lt;/span&gt;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;PersonBLL_Post_Insert(PersonEventArgs&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLogFile(&amp;quot;&lt;span style="color:#8B0000"&gt;PersonId:&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.PersonId.ToString()&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;-&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.FirstName&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.LastName&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;was&amp;#160;inserted&lt;/span&gt;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;PersonBLL_Pre_Insert(PersonEventArgs&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLogFile(&amp;quot;&lt;span style="color:#8B0000"&gt;PersonId:&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.PersonId.ToString()&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;-&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.FirstName&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.LastName&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;is&amp;#160;about&amp;#160;to&amp;#160;be&amp;#160;inserted&lt;/span&gt;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;PersonBLL_Post_Get(PersonEventArgs&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLogFile(&amp;quot;&lt;span style="color:#8B0000"&gt;The&amp;#160;people&amp;#160;were&amp;#160;gotten&lt;/span&gt;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;PersonBLL_Pre_Get(PersonEventArgs&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLogFile(&amp;quot;&lt;span style="color:#8B0000"&gt;The&amp;#160;people&amp;#160;are&amp;#160;about&amp;#160;to&amp;#160;be&amp;#160;gotten&lt;/span&gt;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;PersonBLL_Post_Delete(PersonEventArgs&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLogFile(&amp;quot;&lt;span style="color:#8B0000"&gt;PersonId:&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.PersonId.ToString()&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;-&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.FirstName&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.LastName&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;was&amp;#160;deleted&lt;/span&gt;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;PersonBLL_Pre_Delete(PersonEventArgs&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLogFile(&amp;quot;&lt;span style="color:#8B0000"&gt;PersonId:&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.PersonId.ToString()&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;-&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.FirstName&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;e.Person.LastName&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;is&amp;#160;about&amp;#160;to&amp;#160;be&amp;#160;deleted&lt;/span&gt;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;WriteToLogFile(&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;&amp;nbsp;message)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DateTime&amp;nbsp;now&amp;nbsp;=&amp;nbsp;DateTime.Now;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;(StreamWriter&amp;nbsp;sw&amp;nbsp;=&amp;nbsp;File.AppendText(_logFileLocation))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sw.WriteLine(now.ToString()&amp;nbsp;+&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;-&amp;#160;&lt;/span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;message);
&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;/pre&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
	document.getElementById('snippet_38').style.display='block';
&lt;/script&gt; 
&lt;p&gt;
Finally, we have to create an instance of our logger class in the Global.asax file to attach our event handlers to our events when the application starts. 
&lt;/p&gt;
&lt;div class="codeSnippet"&gt;
	&lt;div class="codeHeader"&gt;
		&lt;img src="http://blog.furred.net/pics/page_white_code.png" /&gt;
		&lt;a href="" onclick="document.getElementById('snippet_39').style.display = document.getElementById('snippet_39').style.display == 'none' ? 'block' : 'none'; return false;"
		title="Click for expanding.."&gt;C#-Code: Global.asax&lt;/a&gt;
	&lt;/div&gt;
	&lt;pre id="snippet_39" class="codeContainer"&gt;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;Application_Start(&lt;span style="color:#0000FF"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&amp;nbsp;
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000"&gt;//Create&amp;#160;an&amp;#160;instance&amp;#160;of&amp;#160;the&amp;#160;logger&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000"&gt;//To&amp;#160;attach&amp;#160;event&amp;#160;handlers&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Logger&amp;nbsp;logger&amp;nbsp;=&amp;nbsp;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&amp;nbsp;Logger();
}&lt;/pre&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
	document.getElementById('snippet_39').style.display='block';
&lt;/script&gt; 
&lt;p&gt;
There we have it. Now on every CRUD operation in our application, a log entry will be written with some data about that action. Once you get the hang of it events become extremely useful. One big instance I like to use it for is authorization of performing an action in a membership and roles scenario. 
&lt;/p&gt;
&lt;p&gt;
Hope this helps! 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Download the code: &lt;br /&gt;
&lt;a rel="enclosure" href="http://blog.reamped.net/file.axd?file=ThrowingAndHandlingEvents.zip"&gt;ThrowingAndHandlingEvents.zip (14.44 kb)&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2008/04/Using-The-Event-Model-Throwing-and-Handling-Custom-Events.aspx&amp;amp;title=Using%20The%20Event%20Model:%20Throwing%20and%20Handling%20Custom%20Events" target="_blank"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2008/04/Using-The-Event-Model-Throwing-and-Handling-Custom-Events.aspx" border="0" alt="kick it on DotNetKicks.com" width="82" height="18" /&gt; &lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YPrj5fj8Jbo4mNsHEDqEUbfwb1o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YPrj5fj8Jbo4mNsHEDqEUbfwb1o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YPrj5fj8Jbo4mNsHEDqEUbfwb1o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YPrj5fj8Jbo4mNsHEDqEUbfwb1o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=XcfAFTVL"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=kZasEzvN"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=kZasEzvN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=vuDTiE6B"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=vuDTiE6B" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=sE9Ycktw"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=sE9Ycktw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=sh5HjuDP"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/ECrCPiYFxOc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/ECrCPiYFxOc/post.aspx</link>
      <author>Ira</author>
      <comments>http://blog.reamped.net/post/2008/04/Using-The-Event-Model-Throwing-and-Handling-Custom-Events.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=540263f1-37a2-4528-8719-2a027eb2a861</guid>
      <pubDate>Mon, 21 Apr 2008 17:47:00 -0400</pubDate>
      <category>ASP.NET</category>
      <category>C#</category>
      <dc:publisher>Ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=540263f1-37a2-4528-8719-2a027eb2a861</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=540263f1-37a2-4528-8719-2a027eb2a861</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2008/04/Using-The-Event-Model-Throwing-and-Handling-Custom-Events.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=540263f1-37a2-4528-8719-2a027eb2a861</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=540263f1-37a2-4528-8719-2a027eb2a861</feedburner:origLink></item>
    <item>
      <title>Clean Up ASP.NETs Head Tag With ControlAdapters</title>
      <description>&lt;p&gt;
Ok, if you&amp;#39;re anything like me you absolutely gag when you see the rendered content of the ASP.NET head tag. It is all rendered out inline for some reason. I&amp;#39;m not 100% sure about the affects of it on web marketing, but I know one thing is for sure... It certainly doesn&amp;#39;t help your rankings any. At the very least it looks gross and it can be easily fixed with some portable c# files that you can include in any project. I found a reference &lt;a href="http://blogs.x2line.com/al/archive/2007/01/31/2816.aspx" target="_blank"&gt;here&lt;/a&gt;&amp;nbsp;about it, so I picked it up and ran with it.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
A couple of good things to note is the placement of some key pieces for control adapters in the .NET framework. The ControlAdapter class should be inherited for every control adapter you create, it can be found in the System.Web.UI.Adapters namespace. All of the tags we will be overriding belong to the System.Web.UI.HtmlControls namespace. 
&lt;/p&gt;
&lt;p&gt;
The first tag we will override is the head tag itself. 
&lt;/p&gt;
&lt;div class="codeSnippet"&gt;
	&lt;div class="codeHeader"&gt;
		&lt;img src="http://blog.furred.net/pics/page_white_code.png" /&gt;
		&lt;a href="" onclick="document.getElementById('snippet_40').style.display = document.getElementById('snippet_40').style.display == 'none' ? 'block' : 'none'; return false;"
		title="Click for expanding.."&gt;C#-Code: HtmlHeadAdapter.cs&lt;/a&gt;
	&lt;/div&gt;
	&lt;pre id="snippet_40" class="codeContainer"&gt;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI.Adapters;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI.HtmlControls;
&lt;span style="color:#0000FF"&gt;namespace&lt;/span&gt;&amp;nbsp;Rollem.ControlAdapters
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;class&lt;/span&gt;&amp;nbsp;HtmlHeadAdapter&amp;nbsp;:&amp;nbsp;ControlAdapter
&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:#0000FF"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;Render(HtmlTextWriter&amp;nbsp;writer)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HtmlHead&amp;nbsp;headTag&amp;nbsp;=&amp;nbsp;(HtmlHead)&lt;span style="color:#0000FF"&gt;this&lt;/span&gt;.Control;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteBeginTag(&amp;quot;&lt;span style="color:#8B0000"&gt;head&lt;/span&gt;&amp;quot;);
&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:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(!&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;.IsNullOrEmpty(headTag.ID))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteAttribute(&amp;quot;&lt;span style="color:#8B0000"&gt;id&lt;/span&gt;&amp;quot;,&amp;nbsp;headTag.ClientID);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.Write(HtmlTextWriter.TagRightChar);
&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:#0000FF"&gt;foreach&lt;/span&gt;&amp;nbsp;(Control&amp;nbsp;item&amp;nbsp;&lt;span style="color:#0000FF"&gt;in&lt;/span&gt;&amp;nbsp;headTag.Controls)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item.RenderControl(writer);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteLine(&amp;quot;&lt;span style="color:#8B0000"&gt;&lt;/span&gt;&amp;quot;);
&amp;nbsp;&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;/pre&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
	document.getElementById('snippet_40').style.display='block';
&lt;/script&gt;
&lt;p&gt;
Next we are on to the title tag. 
&lt;/p&gt;
&lt;div class="codeSnippet"&gt;
	&lt;div class="codeHeader"&gt;
		&lt;img src="http://blog.furred.net/pics/page_white_code.png" /&gt;
		&lt;a href="" onclick="document.getElementById('snippet_41').style.display = document.getElementById('snippet_41').style.display == 'none' ? 'block' : 'none'; return false;"
		title="Click for expanding.."&gt;C#-Code: HtmlTitleAdapter.cs&lt;/a&gt;
	&lt;/div&gt;
	&lt;pre id="snippet_41" class="codeContainer"&gt;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI.Adapters;
&lt;span style="color:#0000FF"&gt;namespace&lt;/span&gt;&amp;nbsp;Rollem.ControlAdapters
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;class&lt;/span&gt;&amp;nbsp;HtmlTitleAdapter&amp;nbsp;:&amp;nbsp;ControlAdapter
&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:#0000FF"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;Render(HtmlTextWriter&amp;nbsp;writer)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteLine();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteFullBeginTag(&amp;quot;&lt;span style="color:#8B0000"&gt;title&lt;/span&gt;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.Write(Page.Title);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteEndTag(&amp;quot;&lt;span style="color:#8B0000"&gt;title&lt;/span&gt;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteLine();
&amp;nbsp;&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;/pre&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
	document.getElementById('snippet_41').style.display='block';
&lt;/script&gt;
&lt;p&gt;
Now the link tags. 
&lt;/p&gt;
&lt;div class="codeSnippet"&gt;
	&lt;div class="codeHeader"&gt;
		&lt;img src="http://blog.furred.net/pics/page_white_code.png" /&gt;
		&lt;a href="" onclick="document.getElementById('snippet_42').style.display = document.getElementById('snippet_42').style.display == 'none' ? 'block' : 'none'; return false;"
		title="Click for expanding.."&gt;C#-Code: HtmlLinkAdapter.cs&lt;/a&gt;
	&lt;/div&gt;
	&lt;pre id="snippet_42" class="codeContainer"&gt;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI.Adapters;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI.HtmlControls;
&lt;span style="color:#0000FF"&gt;namespace&lt;/span&gt;&amp;nbsp;Rollem.ControlAdapters
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;class&lt;/span&gt;&amp;nbsp;HtmlLinkAdapter&amp;nbsp;:&amp;nbsp;ControlAdapter
&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:#0000FF"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;Render(HtmlTextWriter&amp;nbsp;writer)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HtmlLink&amp;nbsp;linkTag&amp;nbsp;=&amp;nbsp;(HtmlLink)&lt;span style="color:#0000FF"&gt;this&lt;/span&gt;.Control;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.Write(&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;lt;link&lt;/span&gt;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AttributeCollection&amp;nbsp;attributes&amp;nbsp;=&amp;nbsp;linkTag.Attributes;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IEnumerator&amp;nbsp;keys&amp;nbsp;=&amp;nbsp;linkTag.Attributes.Keys.GetEnumerator();
&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:#0000FF"&gt;while&lt;/span&gt;&amp;nbsp;(keys.MoveNext())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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:#0000FF"&gt;string&lt;/span&gt;&amp;nbsp;key&amp;nbsp;=&amp;nbsp;(&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;)keys.Current;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(key.ToLower()&amp;nbsp;==&amp;nbsp;&amp;quot;&lt;span style="color:#8B0000"&gt;href&lt;/span&gt;&amp;quot;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;attributes[key].Contains(&amp;quot;&lt;span style="color:#8B0000"&gt;~&lt;/span&gt;&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteAttribute(key,&amp;nbsp;linkTag.ResolveClientUrl(attributes[key]));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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:#0000FF"&gt;else&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteAttribute(key,&amp;nbsp;attributes[key]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteLine(&amp;quot;&lt;span style="color:#8B0000"&gt;&amp;#160;/&amp;gt;&lt;/span&gt;&amp;quot;);
&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;/pre&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
	document.getElementById('snippet_42').style.display='block';
&lt;/script&gt;
&lt;p&gt;
Last but not least, the meta tags. 
&lt;/p&gt;
&lt;div class="codeSnippet"&gt;
	&lt;div class="codeHeader"&gt;
		&lt;img src="http://blog.furred.net/pics/page_white_code.png" /&gt;
		&lt;a href="" onclick="document.getElementById('snippet_43').style.display = document.getElementById('snippet_43').style.display == 'none' ? 'block' : 'none'; return false;"
		title="Click for expanding.."&gt;C#-Code: HtmlMetaAdapter.cs&lt;/a&gt;
	&lt;/div&gt;
	&lt;pre id="snippet_43" class="codeContainer"&gt;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI.Adapters;
&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI.HtmlControls;
&lt;span style="color:#0000FF"&gt;namespace&lt;/span&gt;&amp;nbsp;Rollem.ControlAdapters
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;class&lt;/span&gt;&amp;nbsp;HtmlMetaAdapter&amp;nbsp;:&amp;nbsp;ControlAdapter
&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:#0000FF"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;void&lt;/span&gt;&amp;nbsp;Render(HtmlTextWriter&amp;nbsp;writer)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HtmlMeta&amp;nbsp;metaTag&amp;nbsp;=&amp;nbsp;(HtmlMeta)&lt;span style="color:#0000FF"&gt;this&lt;/span&gt;.Control;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteBeginTag(&amp;quot;&lt;span style="color:#8B0000"&gt;meta&lt;/span&gt;&amp;quot;);
&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:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(!&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;.IsNullOrEmpty(metaTag.HttpEquiv))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteAttribute(&amp;quot;&lt;span style="color:#8B0000"&gt;http-equiv&lt;/span&gt;&amp;quot;,&amp;nbsp;metaTag.HttpEquiv);
&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:#0000FF"&gt;if&lt;/span&gt;&amp;nbsp;(!&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;.IsNullOrEmpty(metaTag.Name))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteAttribute(&amp;quot;&lt;span style="color:#8B0000"&gt;name&lt;/span&gt;&amp;quot;,&amp;nbsp;metaTag.Name);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteAttribute(&amp;quot;&lt;span style="color:#8B0000"&gt;content&lt;/span&gt;&amp;quot;,&amp;nbsp;metaTag.Content);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteLine(HtmlTextWriter.SelfClosingTagEnd);
&amp;nbsp;&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;/pre&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
	document.getElementById('snippet_43').style.display='block';
&lt;/script&gt;
&lt;p&gt;
Now all we have to do is setup a *.browser file in the App_Browsers folder to map the control adapter overrides. 
&lt;/p&gt;
&lt;div class="codeSnippet"&gt;
	&lt;div class="codeHeader"&gt;
		&lt;img src="http://blog.furred.net/pics/page_white_code.png" /&gt;
		&lt;a href="" onclick="document.getElementById('snippet_44').style.display = document.getElementById('snippet_44').style.display == 'none' ? 'block' : 'none'; return false;"
		title="Click for expanding.."&gt;ASP.NET-Code: BrowserFile.browser&lt;/a&gt;
	&lt;/div&gt;
	&lt;pre id="snippet_44" class="codeContainer"&gt;
&lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;browsers&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;browser&lt;/span&gt;&amp;nbsp;&lt;span style="color:#FF0000"&gt;refID&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;Default&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;controlAdapters&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&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;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;adapter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#FF0000"&gt;controlType&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;System.Web.UI.HtmlControls.HtmlHead&amp;quot;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#FF0000"&gt;adapterType&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;Rollem.ControlAdapters.HtmlHeadAdapter&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;/&amp;gt;&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;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;adapter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#FF0000"&gt;controlType&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;System.Web.UI.HtmlControls.HtmlTitle&amp;quot;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#FF0000"&gt;adapterType&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;Rollem.ControlAdapters.HtmlTitleAdapter&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;/&amp;gt;&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;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;adapter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#FF0000"&gt;controlType&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;System.Web.UI.HtmlControls.HtmlMeta&amp;quot;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#FF0000"&gt;adapterType&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;Rollem.ControlAdapters.HtmlMetaAdapter&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;/&amp;gt;&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;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;adapter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#FF0000"&gt;controlType&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;System.Web.UI.HtmlControls.HtmlLink&amp;quot;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#FF0000"&gt;adapterType&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;Rollem.ControlAdapters.HtmlLinkAdapter&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000FF"&gt;/&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;controlAdapters&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;browser&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000FF"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;browsers&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
	document.getElementById('snippet_44').style.display='block';
&lt;/script&gt;
&lt;p&gt;
Now if we right click and view source we will see a nice clean head tag. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Before:&lt;/strong&gt; &lt;br /&gt;
&lt;img src="http://blog.reamped.net/image.axd?picture=screenshot-2008-04-14_19_20_33.png" border="1" alt="" width="630" height="40" /&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;After:&lt;/strong&gt; &lt;br /&gt;
&lt;img src="http://blog.reamped.net/image.axd?picture=screenshot-2008-04-14_19_21_16.png" border="1" alt="" width="390" height="263" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Don&amp;#39;t live a moment longer with that ugly ASP.NET rendered head tag!&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Download the code:&lt;br /&gt;
&lt;a rel="enclosure" href="http://blog.reamped.net/file.axd?file=HtmlHeadControlAdapters.zip"&gt;HtmlHeadControlAdapters.zip (12.70 kb)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Updated to have the code copyable &amp;amp; using the ResolveClientUrl function&lt;/em&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://blog.reamped.net/post/2008/04/Clean-Up-ASPNETs-Head-Tag-With-ControlAdapters.aspx&amp;amp;title=Clean%20Up%20ASP.NETs%20Head%20Tag%20With%20ControlAdapters" target="_blank"&gt;
&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blog.reamped.net/post/2008/04/Clean-Up-ASPNETs-Head-Tag-With-ControlAdapters.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZsVYEH2DDlY5OKlIhu4d3lq0ar8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZsVYEH2DDlY5OKlIhu4d3lq0ar8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZsVYEH2DDlY5OKlIhu4d3lq0ar8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZsVYEH2DDlY5OKlIhu4d3lq0ar8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=aIekVR7T"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=5Yh4h8sl"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=5Yh4h8sl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=F2A8Ur7a"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=F2A8Ur7a" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=mqYsJlcc"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?i=mqYsJlcc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ReampedNET?a=tIUOQAH0"&gt;&lt;img src="http://feeds.feedburner.com/~f/ReampedNET?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ReampedNET/~4/zTuGShbfUMg" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ReampedNET/~3/zTuGShbfUMg/post.aspx</link>
      <author>Ira</author>
      <comments>http://blog.reamped.net/post/2008/04/Clean-Up-ASPNETs-Head-Tag-With-ControlAdapters.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.reamped.net/post.aspx?id=5f128d18-8911-409e-9d63-b6d112953cdc</guid>
      <pubDate>Mon, 14 Apr 2008 18:39:00 -0400</pubDate>
      <category>ASP.NET</category>
      <category>C#</category>
      <dc:publisher>Ira</dc:publisher>
      <pingback:server>http://blog.reamped.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.reamped.net/post.aspx?id=5f128d18-8911-409e-9d63-b6d112953cdc</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://blog.reamped.net/trackback.axd?id=5f128d18-8911-409e-9d63-b6d112953cdc</trackback:ping>
      <wfw:comment>http://blog.reamped.net/post/2008/04/Clean-Up-ASPNETs-Head-Tag-With-ControlAdapters.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.reamped.net/syndication.axd?post=5f128d18-8911-409e-9d63-b6d112953cdc</wfw:commentRss>
    <feedburner:origLink>http://blog.reamped.net/post.aspx?id=5f128d18-8911-409e-9d63-b6d112953cdc</feedburner:origLink></item>
  </channel>
</rss>
