<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Random Musings of Jeremy Jameson : Web Development</title><link>http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx</link><description>Tags: Web Development</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Microsoft Translator Widget</title><link>http://blogs.msdn.com/jjameson/archive/2009/11/07/microsoft-translator-widget.aspx</link><pubDate>Sat, 07 Nov 2009 13:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9919044</guid><dc:creator>Jeremy Jameson</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jjameson/comments/9919044.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jjameson/commentrss.aspx?PostID=9919044</wfw:commentRss><description>&lt;P&gt;This week I stumbled upon the new (and very cool) &lt;A href="http://www.microsofttranslator.com/Widget" mce_href="http://www.microsofttranslator.com/Widget"&gt;Microsoft Translator Widget&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Actually, this isn't really new (apparently it has been available for over six months now) but it was certainly new to me.&lt;/P&gt;
&lt;P&gt;A colleague of mine on a previous project pointed out the &lt;A href="http://www.microsofttranslator.com/" mce_href="http://www.microsofttranslator.com"&gt;Microsoft Translator site&lt;/A&gt; back in March, but somehow I was oblivious to the Translator Widget until just this week. Wow...so many things to keep abreast of these days.&lt;/P&gt;
&lt;P&gt;I've added the Translator Widget to my MSDN blog this morning. Interesting tidbit - it required more time to tweak the Community Server CSS rules in order to make room for the 200px minimum width required by the Translator Widget than it did to actually integrate the feature onto my blog.&lt;/P&gt;
&lt;P&gt;All you have to do to integrate this feature on your site is:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Enter the URL of your site&lt;/LI&gt;
&lt;LI&gt;Read and agree to the terms of use&lt;/LI&gt;
&lt;LI&gt;Click the &lt;STRONG&gt;Generate Code &lt;/STRONG&gt;button&lt;/LI&gt;
&lt;LI&gt;Copy/paste a small amount of HTML into your site&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;You can &lt;A href="http://blogs.msdn.com/translation/archive/2009/03/18/announcing-the-microsoft-translator-web-page-widget.aspx" mce_href="http://blogs.msdn.com/translation/archive/2009/03/18/announcing-the-microsoft-translator-web-page-widget.aspx"&gt;read more&lt;/A&gt; about the Microsoft Translator Widget on the &lt;A href="http://blogs.msdn.com/translation" mce_href="http://blogs.msdn.com/translation"&gt;Translation team's blog&lt;/A&gt; if you want more details.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9919044" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx">Web Development</category></item><item><title>Constraining Tables with CSS</title><link>http://blogs.msdn.com/jjameson/archive/2009/11/01/constraining-tables-with-css.aspx</link><pubDate>Sun, 01 Nov 2009 14:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9915855</guid><dc:creator>Jeremy Jameson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jjameson/comments/9915855.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jjameson/commentrss.aspx?PostID=9915855</wfw:commentRss><description>&lt;P&gt;Have you ever wanted to display data in a table but limit the size of the rows and columns within the table?&lt;/P&gt;
&lt;P&gt;For example, consider the classic master/detail view that we often find in software applications, in which items are shown in a summary table and each row provides a link to allow users to see more detail about the item.&lt;/P&gt;
&lt;P&gt;However, unlike the typical master/detail scenario, you need to limit the amount of real estate consumed on the page by the summary table. In addition, if text within a column is too long to fit within the constrained area, you want to show the full text when the mouse cursor hovers over the cell.&lt;/P&gt;
&lt;P&gt;The following figure illustrates the desired end result:&lt;/P&gt;
&lt;DIV class=image&gt;&lt;IMG title="" alt="" src="http://blogs.msdn.com/photos/jjameson/images/9915847/500x148.aspx" width=500 height=148 mce_src="http://blogs.msdn.com/photos/jjameson/images/9915847/500x148.aspx"&gt; 
&lt;DIV class=caption&gt;Figure 1: Constrained table&lt;/DIV&gt;
&lt;DIV class=imageLink&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9915847/original.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/jjameson/images/9915847/original.aspx"&gt;See full-sized image.&lt;/A&gt; &lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Here is the sample ASP.NET page that I created this morning to demonstrate this:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;lt;%&lt;SPAN style="COLOR: #0000ff"&gt;@&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;Page&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Language&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="C#"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;AutoEventWireup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="true"&lt;BR&gt;    &lt;/SPAN&gt;&lt;/CODE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: #ff0000"&gt;CodeBehind&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="ConstrainedTable.aspx.cs"&lt;BR&gt;   &lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Inherits&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="Fabrikam.Demo.Web.UI.ConstrainedTable"&lt;/SPAN&gt; %&amp;gt;

&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;!&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&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;"-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;

&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;html&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;xmlns&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="http://www.w3.org/1999/xhtml"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;head&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="server"&amp;gt;
&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;title&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;Demo - Constrained Tabular Data&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&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: #a31515"&gt;link&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;rel&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="Stylesheet"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;href&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="http://meyerweb.com/eric/tools/css/reset/reset.css"&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: #a31515"&gt;style&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: #008000"&gt;/* Basic formatting
        ----------------------------------------------------------------------*/
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: #a31515"&gt;body&lt;/SPAN&gt; {
            &lt;SPAN style="COLOR: #ff0000"&gt;color&lt;/SPAN&gt;:&lt;SPAN style="COLOR: #0000ff"&gt;#000000&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;font-family&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;Verdana,&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;Arial,&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;Helvetica&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;font-size&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;small&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;margin&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;10px&lt;/SPAN&gt;;
        }
        &lt;SPAN style="COLOR: #a31515"&gt;h1&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;h2&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;h3&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;h4&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;h5&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;h6&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;strong&lt;/SPAN&gt; {
            &lt;SPAN style="COLOR: #ff0000"&gt;font-weight&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;bold&lt;/SPAN&gt;;
        }
        &lt;SPAN style="COLOR: #a31515"&gt;h1&lt;/SPAN&gt; {
            &lt;SPAN style="COLOR: #ff0000"&gt;font-size&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;1.5em&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;margin&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;.67em&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;0&lt;/SPAN&gt;;
        }
        &lt;SPAN style="COLOR: #a31515"&gt;table&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;caption&lt;/SPAN&gt; {
            &lt;SPAN style="COLOR: #ff0000"&gt;font-weight&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;bold&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;margin&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;10px&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;0&lt;/SPAN&gt;;
        }
        &lt;SPAN style="COLOR: #a31515"&gt;table.displayTable&lt;/SPAN&gt; {
            &lt;SPAN style="COLOR: #ff0000"&gt;border-left&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;1px&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;solid&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;#36295E&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;border-right&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;1px&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;solid&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;#36295E&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;margin&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;1em&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;0&lt;/SPAN&gt;;
        }
        &lt;SPAN style="COLOR: #a31515"&gt;table.displayTable&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;th&lt;/SPAN&gt; {
            &lt;SPAN style="COLOR: #ff0000"&gt;text-align&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;left&lt;/SPAN&gt;;
        }
        &lt;SPAN style="COLOR: #a31515"&gt;table.displayTable&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;th&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;table.displayTable&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;td&lt;/SPAN&gt; {
            &lt;SPAN style="COLOR: #ff0000"&gt;border-bottom&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;1px&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;solid&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;#36295E&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;padding&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;5px&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;10px&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;vertical-align&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;top&lt;/SPAN&gt;;
        }
        &lt;SPAN style="COLOR: #a31515"&gt;table.displayTable&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;thead&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;th&lt;/SPAN&gt; {
            &lt;SPAN style="COLOR: #ff0000"&gt;background&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;#36295E&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;color&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;#FFF&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;padding&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;8px&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;10px&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;border-bottom-width&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;0&lt;/SPAN&gt;;
        }        
        &lt;SPAN style="COLOR: #a31515"&gt;table.displayTable&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;tr.altRow&lt;/SPAN&gt; {
            &lt;SPAN style="COLOR: #ff0000"&gt;background&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;#F4F4F4&lt;/SPAN&gt;;
        }
        &lt;SPAN style="COLOR: #008000"&gt;/* =constrainedTable
        ----------------------------------------------------------------------*/
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: #a31515"&gt;table.constrainedTable&lt;/SPAN&gt; {
            &lt;SPAN style="COLOR: #ff0000"&gt;table-layout&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;fixed&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;width&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;540px&lt;/SPAN&gt;;
        }
        &lt;SPAN style="COLOR: #a31515"&gt;table.constrainedTable&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;th.nameColumn&lt;/SPAN&gt; {
            &lt;SPAN style="COLOR: #ff0000"&gt;width&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;140px&lt;/SPAN&gt;;
        }        
        &lt;SPAN style="COLOR: #a31515"&gt;table.constrainedTable&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;td&lt;/SPAN&gt; {
            &lt;SPAN style="COLOR: #ff0000"&gt;overflow&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;hidden&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;-o-text-overflow&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;ellipsis&lt;/SPAN&gt;; &lt;SPAN style="COLOR: #008000"&gt;/* Opera */
&lt;/SPAN&gt;            &lt;SPAN style="COLOR: #ff0000"&gt;text-overflow&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;ellipsis&lt;/SPAN&gt;;
            &lt;SPAN style="COLOR: #ff0000"&gt;white-space&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;nowrap&lt;/SPAN&gt;;
        }
    &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;style&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;head&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&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: #a31515"&gt;form&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;id&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="form1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="server"&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;h1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;Demo - Constrained Tabular Data&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;h1&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: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;GridView&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="ConstrainedGrid"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="server"
&lt;/SPAN&gt;            &lt;SPAN style="COLOR: #ff0000"&gt;AutoGenerateColumns&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="false"
&lt;/SPAN&gt;            &lt;SPAN style="COLOR: #ff0000"&gt;Caption&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="Constrained Table"
&lt;/SPAN&gt;            &lt;SPAN style="COLOR: #ff0000"&gt;CssClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="displayTable constrainedTable"
&lt;/SPAN&gt;            &lt;SPAN style="COLOR: #ff0000"&gt;OnRowDataBound&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="ConstrainedGrid_RowDataBound"
&lt;/SPAN&gt;            &lt;SPAN style="COLOR: #ff0000"&gt;EnableViewState&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="false"
&lt;/SPAN&gt;            &lt;SPAN style="COLOR: #ff0000"&gt;UseAccessibleHeader&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="true"&amp;gt;
&lt;/SPAN&gt;            &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;AlternatingRowStyle&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;CssClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="altRow"&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: #a31515"&gt;RowStyle&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;CssClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="row"&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: #a31515"&gt;Columns&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: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;HyperLinkField
&lt;/SPAN&gt;                    &lt;SPAN style="COLOR: #ff0000"&gt;DataTextField&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="Site"
&lt;/SPAN&gt;                    &lt;SPAN style="COLOR: #ff0000"&gt;DataNavigateUrlFields&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="URL"
&lt;/SPAN&gt;                    &lt;SPAN style="COLOR: #ff0000"&gt;HeaderText&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="Site"
&lt;/SPAN&gt;                    &lt;SPAN style="COLOR: #ff0000"&gt;HeaderStyle-CssClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="nameColumn"&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: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;BoundField
&lt;/SPAN&gt;                    &lt;SPAN style="COLOR: #ff0000"&gt;DataField&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="Notes"
&lt;/SPAN&gt;                    &lt;SPAN style="COLOR: #ff0000"&gt;HeaderText&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="Notes"
&lt;/SPAN&gt;                    &lt;SPAN style="COLOR: #ff0000"&gt;HeaderStyle-CssClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="notesColumn"&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: #a31515"&gt;Columns&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: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;GridView&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: #a31515"&gt;form&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;body&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;html&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;The most interesting parts of the ASP.NET page are the CSS rules for the &lt;CODE&gt;&lt;SPAN style="COLOR: #a31515"&gt;constrainedTable&lt;/SPAN&gt; &lt;/CODE&gt;class:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: #a31515"&gt;table.constrainedTable&lt;/SPAN&gt; {
    &lt;SPAN style="COLOR: #ff0000"&gt;table-layout&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;fixed&lt;/SPAN&gt;;
    &lt;SPAN style="COLOR: #ff0000"&gt;width&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;540px&lt;/SPAN&gt;;
}
&lt;SPAN style="COLOR: #a31515"&gt;table.constrainedTable&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;th.nameColumn&lt;/SPAN&gt; {
    &lt;SPAN style="COLOR: #ff0000"&gt;width&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;140px&lt;/SPAN&gt;;
}        
&lt;SPAN style="COLOR: #a31515"&gt;table.constrainedTable&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;td&lt;/SPAN&gt; {
    &lt;SPAN style="COLOR: #ff0000"&gt;overflow&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;hidden&lt;/SPAN&gt;;
    &lt;SPAN style="COLOR: #ff0000"&gt;-o-text-overflow&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;ellipsis&lt;/SPAN&gt;; &lt;SPAN style="COLOR: #008000"&gt;/* Opera */
&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #ff0000"&gt;text-overflow&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;ellipsis&lt;/SPAN&gt;;
    &lt;SPAN style="COLOR: #ff0000"&gt;white-space&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;nowrap&lt;/SPAN&gt;;
}&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Changing the &lt;CODE&gt;&lt;SPAN style="COLOR: #ff0000"&gt;table-layout &lt;/SPAN&gt;&lt;/CODE&gt;to &lt;CODE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;fixed &lt;/SPAN&gt;&lt;/CODE&gt;constrains the table to the specified width. Since I don't specify a width for the &lt;CODE&gt;&lt;SPAN style="COLOR: #a31515"&gt;notesColumn&lt;/SPAN&gt; &lt;/CODE&gt;it consumes the remaining width of the table.&lt;/P&gt;
&lt;P&gt;Next, I specify that all cells in the constrained table should truncate the text within each cell if it is too wide to fit within the width of the column. This is achieved using the combination of &lt;CODE&gt;&lt;SPAN style="COLOR: #ff0000"&gt;overflow&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;hidden&lt;/SPAN&gt;&lt;/CODE&gt; and &lt;CODE&gt;&lt;SPAN style="COLOR: #ff0000"&gt;white-space&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;nowrap&lt;/SPAN&gt;&lt;/CODE&gt;. Finally, I use the &lt;CODE&gt;&lt;SPAN style="COLOR: #ff0000"&gt;&lt;A href="http://www.css3.info/preview/text-overflow/" mce_href="http://www.css3.info/preview/text-overflow/"&gt;text-overflow&lt;/A&gt; &lt;/SPAN&gt;&lt;/CODE&gt;CSS property to show ellipsis when text within a cell is clipped (as well as a slight variation for the Opera browser).&lt;/P&gt;
&lt;BLOCKQUOTE class=note&gt;
&lt;DIV class=noteTitle&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;&lt;/DIV&gt;
&lt;DIV&gt;Support for the &lt;CODE&gt;&lt;SPAN style="COLOR: #ff0000"&gt;text-overflow&lt;/SPAN&gt;&lt;/CODE&gt; CSS property is somewhat limited. In particular, you will find that a clipped table cell renders without the ellipsis in Firefox (at least in version 3.5.3). Oddly enough, this appears to have been supported in Internet Explorer since version 6. In addition to Internet Explorer and Opera, this also appears as expected in Safari.&lt;/DIV&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Also note that constraining table cells using CSS does not automatically display the tooltip with the complete text. For that, you are on your own.&lt;/P&gt;
&lt;P&gt;When using an ASP.NET GridView control, I recommend using the &lt;A href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx"&gt;RowDataBound&lt;/A&gt; event in order to set the &lt;A href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.tooltip.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.tooltip.aspx"&gt;ToolTip&lt;/A&gt; property of the table cell. Just be sure to decode the contents of the cell to avoid having it encoded twice:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;        &lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; ConstrainedGrid_RowDataBound(
            &lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt; sender,
            &lt;SPAN style="COLOR: #2b91af"&gt;GridViewRowEventArgs&lt;/SPAN&gt; e)
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (&lt;SPAN style="COLOR: #2b91af"&gt;TableCell&lt;/SPAN&gt; cell &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; e.Row.Cells)
            {
                &lt;SPAN style="COLOR: #008000"&gt;// Note: We need to decode the cell text in order to avoid
&lt;/SPAN&gt;                &lt;SPAN style="COLOR: #008000"&gt;// having it encoded twice (e.g. "&amp;amp;amp;gt;")
&lt;/SPAN&gt;                cell.ToolTip = &lt;SPAN style="COLOR: #2b91af"&gt;HttpUtility&lt;/SPAN&gt;.HtmlDecode(cell.Text);
            }
        }&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;This is somewhat of a "brute force" approach since it makes no attempt to determine if the text will be truncated, but rather sets the ToolTip (in other words, the title attribute on the HTML element) for every cell. However, the simplicity of this approach -- and the resulting user experience -- far outweighs any extraneous markup (at least in my opinion).&lt;/P&gt;
&lt;P&gt;Be aware that this simple approach for setting the ToolTip property doesn't support columns generated from a &lt;A href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.hyperlinkfield.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.hyperlinkfield.aspx"&gt;HyperLinkField&lt;/A&gt;, in which case &lt;CODE&gt;cell.Text&lt;/CODE&gt; is empty (because the cell contains child controls, not simple text). In other words, it's a good thing my demo doesn't specify very long site names that don't fit within the 140 pixel width column constraint ;-)&lt;/P&gt;
&lt;P&gt;Here is the complete code-behind for my sample ASP.NET page so you can run it yourself:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&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.Globalization;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Web;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Web.UI.WebControls;

&lt;SPAN style="COLOR: #0000ff"&gt;namespace&lt;/SPAN&gt; Fabrikam.Demo.Web.UI
{
    &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; &lt;SPAN style="COLOR: #2b91af"&gt;ConstrainedTable&lt;/SPAN&gt; : System.Web.UI.&lt;SPAN style="COLOR: #2b91af"&gt;Page
&lt;/SPAN&gt;    {
        &lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; Page_PreRender(
            &lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt; sender,
            &lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e)
        {
            BindSampleData(&lt;SPAN style="COLOR: #0000ff"&gt;this&lt;/SPAN&gt;.ConstrainedGrid);

            &lt;SPAN style="COLOR: #0000ff"&gt;this&lt;/SPAN&gt;.ConstrainedGrid.HeaderRow.TableSection =
                &lt;SPAN style="COLOR: #2b91af"&gt;TableRowSection&lt;/SPAN&gt;.TableHeader;
        }

&lt;SPAN style="COLOR: #0000ff"&gt;        #region&lt;/SPAN&gt; BindSampleData

        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; BindSampleData(
            &lt;SPAN style="COLOR: #2b91af"&gt;GridView&lt;/SPAN&gt; grid)
        {
            &lt;SPAN style="COLOR: #2b91af"&gt;DataTable&lt;/SPAN&gt; sampleData = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;DataTable&lt;/SPAN&gt;();
            sampleData.Locale = &lt;SPAN style="COLOR: #2b91af"&gt;CultureInfo&lt;/SPAN&gt;.InvariantCulture;

            sampleData.Columns.Add(&lt;SPAN style="COLOR: #a31515"&gt;"Site"&lt;/SPAN&gt;);
            sampleData.Columns.Add(&lt;SPAN style="COLOR: #a31515"&gt;"URL"&lt;/SPAN&gt;);
            sampleData.Columns.Add(&lt;SPAN style="COLOR: #a31515"&gt;"Notes"&lt;/SPAN&gt;);

            sampleData.Rows.Add(
                &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt;[]
                {
                    &lt;SPAN style="COLOR: #a31515"&gt;"Microsoft"&lt;/SPAN&gt;,
                    &lt;SPAN style="COLOR: #a31515"&gt;"http://www.microsoft.com"&lt;/SPAN&gt;,
                    &lt;SPAN style="COLOR: #a31515"&gt;"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
&lt;/SPAN&gt;                        + &lt;SPAN style="COLOR: #a31515"&gt;"Morbi at sem lorem, ac blandit leo. Phasellus at"
&lt;/SPAN&gt;                        + &lt;SPAN style="COLOR: #a31515"&gt;"ligula vitae enim dignissim tincidunt ornare nisl."
&lt;/SPAN&gt;                });

            sampleData.Rows.Add(
                &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt;[]
                {
                    &lt;SPAN style="COLOR: #a31515"&gt;"MSDN"&lt;/SPAN&gt;,
                    &lt;SPAN style="COLOR: #a31515"&gt;"http://msdn.microsoft.com"&lt;/SPAN&gt;,
                    &lt;SPAN style="COLOR: #a31515"&gt;"Sed posuere mattis egestas. Aliquam commodo dolor"
&lt;/SPAN&gt;                        + &lt;SPAN style="COLOR: #a31515"&gt;" vulputate odio lacinia bibendum. Nullam bibendum,"
&lt;/SPAN&gt;                        + &lt;SPAN style="COLOR: #a31515"&gt;" neque vitae ullamcorper elementum, ligula dolor"
&lt;/SPAN&gt;                        + &lt;SPAN style="COLOR: #a31515"&gt;" mollis erat, ut ultricies mauris tortor ut eros."
&lt;/SPAN&gt;                });

            sampleData.Rows.Add(
                &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt;[]
                {
                    &lt;SPAN style="COLOR: #a31515"&gt;"TechNet"&lt;/SPAN&gt;,
                    &lt;SPAN style="COLOR: #a31515"&gt;"http://technet.microsoft.com"&lt;/SPAN&gt;,
                    &lt;SPAN style="COLOR: #a31515"&gt;"Vestibulum a leo nisl, sit amet porta eros. Proin vitae"
&lt;/SPAN&gt;                        + &lt;SPAN style="COLOR: #a31515"&gt;" semper nunc. In facilisis nunc sit amet lacus"
&lt;/SPAN&gt;                        + &lt;SPAN style="COLOR: #a31515"&gt;" accumsan mattis. Nulla facilisi. Pellentesque nisl"
&lt;/SPAN&gt;                        + &lt;SPAN style="COLOR: #a31515"&gt;" sapien, dignissim ultrices semper et, mollis"
&lt;/SPAN&gt;                        + &lt;SPAN style="COLOR: #a31515"&gt;" interdum sem. "
&lt;/SPAN&gt;                });
            
            grid.DataSource = sampleData;
            grid.DataBind();
        }

&lt;SPAN style="COLOR: #0000ff"&gt;        #endregion

&lt;/SPAN&gt;        &lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; ConstrainedGrid_RowDataBound(
            &lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt; sender,
            &lt;SPAN style="COLOR: #2b91af"&gt;GridViewRowEventArgs&lt;/SPAN&gt; e)
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (&lt;SPAN style="COLOR: #2b91af"&gt;TableCell&lt;/SPAN&gt; cell &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; e.Row.Cells)
            {
                &lt;SPAN style="COLOR: #008000"&gt;// Note: We need to decode the cell text in order to avoid
&lt;/SPAN&gt;                &lt;SPAN style="COLOR: #008000"&gt;// having it encoded twice (e.g. "&amp;amp;amp;gt;")
&lt;/SPAN&gt;                cell.ToolTip = &lt;SPAN style="COLOR: #2b91af"&gt;HttpUtility&lt;/SPAN&gt;.HtmlDecode(cell.Text);
            }
        }
    }
}&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9915855" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx">Web Development</category></item><item><title>Latest Version of Opera Ignores Hosts File</title><link>http://blogs.msdn.com/jjameson/archive/2009/10/29/latest-version-of-opera-ignores-hosts-file.aspx</link><pubDate>Thu, 29 Oct 2009 13:17:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9914696</guid><dc:creator>Jeremy Jameson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jjameson/comments/9914696.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jjameson/commentrss.aspx?PostID=9914696</wfw:commentRss><description>&lt;P&gt;As I mentioned in my &lt;A href="http://blogs.msdn.com/jjameson/archive/2009/10/29/troubleshooting-layout-problems-with-safari.aspx" mce_href="http://blogs.msdn.com/jjameson/archive/2009/10/29/troubleshooting-layout-problems-with-safari.aspx"&gt;previous post&lt;/A&gt;, I discovered a rather nasty UI bug last week with the new portal we are building for a customer. Unfortunately, the layout issue only occurred in the Safari browser.&lt;/P&gt;
&lt;P&gt;Since I couldn't repro the issue in Internet Explorer or Firefox, I decided to see if Opera exhibited the same problem as Safari. Consequently, I downloaded and installed the latest version of Opera (note that I've rebuilt both my desktop and development VM since the last time I used Opera).&lt;/P&gt;
&lt;P&gt;Unfortunately. I discovered there's a known bug with Opera version 10 that causes it to ignore your local hosts file (e.g. %SystemRoot%\drivers\etc\hosts).&lt;/P&gt;
&lt;P&gt;Oh c'mon, Opera Team, you've got to be kidding!&lt;/P&gt;
&lt;P&gt;How can you expect a developer to even try your browser if he can't browse to a site in his local development environment using a fully qualified domain name (e.g. http://www-local.fabrikam.com)?&lt;/P&gt;
&lt;P&gt;Needless to say, I didn't spend much time trying to workaround the issue. My prediction: Opera is all but extinct in another year or two.&lt;/P&gt;
&lt;P&gt;That's too bad. From what I remember, Opera used to be a pretty good browser -- and maybe it still is, aside from the bug with the hosts file. It was certainly years ahead of IE6 in terms of Web standards compliance.&lt;/P&gt;
&lt;P&gt;Does anyone know the current browser stats? It wouldn't surprise me if Opera was surpassed by Safari some time ago.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9914696" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx">Web Development</category></item><item><title>Troubleshooting Layout Problems with Safari</title><link>http://blogs.msdn.com/jjameson/archive/2009/10/29/troubleshooting-layout-problems-with-safari.aspx</link><pubDate>Thu, 29 Oct 2009 12:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9914686</guid><dc:creator>Jeremy Jameson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jjameson/comments/9914686.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jjameson/commentrss.aspx?PostID=9914686</wfw:commentRss><description>&lt;P&gt;I discovered a rather nasty UI bug last week with the new portal we are building for a customer. Unfortunately, the layout issue only occurred in the Safari browser. Even worse, I discovered it only a day before the CEO of customer discovered it himself on his Mac! Ouch.&lt;/P&gt;
&lt;P&gt;Note that I typically test Web sites using Internet Explorer and Firefox. In fact, that's what our statement of work contractually obligates for this project (and not IE6, thankfully, but rather IE7 and IE8).&lt;/P&gt;
&lt;P&gt;I've occasionally tested with Opera and Safari in the past, but in general I've found this to be unnecessary because most of these browsers have strong support for modern &lt;A href="http://en.wikipedia.org/wiki/Web_standards" mce_href="http://en.wikipedia.org/wiki/Web_standards"&gt;Web standards&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;However, this week I discovered that a page that looks good in Internet Explorer and Firefox doesn't necessarily look good in Safari.&lt;/P&gt;
&lt;P&gt;Since I didn't have access to my faithful Firebug or Internet Explorer Developer Tools, I was initially stumped on troubleshooting the problem. However, a little bit of searching uncovered the following gem:&lt;/P&gt;
&lt;DIV class=reference&gt;&lt;CITE&gt;Firebug For Safari&lt;/CITE&gt; 
&lt;DIV class=referenceLink&gt;&lt;A href="http://vision-media.ca/resources/misc/firefox-for-safari" mce_href="http://vision-media.ca/resources/misc/firefox-for-safari"&gt;http://vision-media.ca/resources/misc/firefox-for-safari&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Unlike many of the other search results that I looked at, this one doesn't actually discuss using Firebug in Safari (which I was reluctant to try because, from what I read, all of the CSS rules are read-only when you use Firebug with Safari). Rather, this page shows the similar set of tools that Apple provides with their browser. It also shows how to easily enable the Safari developer tools without hacking a preferences file (which I initially tried locating on my Windows VM using instructions based on a Mac, but I quickly gave up on that effort).&lt;/P&gt;
&lt;P&gt;After spending about 45 minutes with the Safari developer tools, I was finally able to track down the &lt;CODE&gt;float&lt;/CODE&gt; CSS rule that was causing my Login Form Web Part to be displayed &lt;EM&gt;behind&lt;/EM&gt; the &lt;CODE&gt;&amp;lt;h1&amp;gt;&lt;/CODE&gt; heading for the main content of the page in Safari.&lt;/P&gt;
&lt;P&gt;A few minutes later and I had my fix checked-in to TFS. Whew!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9914686" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx">Web Development</category></item><item><title>DataNavigateUrlFormatString Does Not Allow "javascript:"</title><link>http://blogs.msdn.com/jjameson/archive/2009/10/26/datanavigateurlformatstring-does-not-allow-javascript.aspx</link><pubDate>Mon, 26 Oct 2009 14:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9912949</guid><dc:creator>Jeremy Jameson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jjameson/comments/9912949.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jjameson/commentrss.aspx?PostID=9912949</wfw:commentRss><description>&lt;P&gt;I encountered an interesting bug last Friday with the ASP.NET &lt;A href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.hyperlinkfield.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.hyperlinkfield.aspx"&gt;HyperLinkField&lt;/A&gt; control. To understand the scenario, think of the typical "view detail" feature when showing summary data in a table. In other words, you want to provide users the ability to click a cell in a table (e.g. a &lt;A href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.aspx"&gt;GridView&lt;/A&gt; control) in order to see more information.&lt;/P&gt;
&lt;P&gt;I've implemented this scenario before, so I was a stumped when I couldn't get it to work right away. However, this time the scenario was a little different because we want to display a popup window to an external site. Also note that several visual properties of the popup window need to be specified for our application -- such as the width and height of the window, as well as hiding the menu bar, status bar, etc.&lt;/P&gt;
&lt;P&gt;In other words, we need the links in the table to actually call a JavaScript function instead of specifying a simple URL.&lt;/P&gt;
&lt;P&gt;My initial attempt was to specify something like :&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;GridView&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="summaryGrid"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="server"
&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #ff0000"&gt;AutoGenerateColumns&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="False"
    ...&amp;gt;
&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;...
&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Columns&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: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;HyperLinkField&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;DataNavigateUrlFields&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="Id"
           &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;DataNavigateUrlFormatString&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="javascript:ShowItemDetail({0})"
           &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;DataTextField&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="CreateTime"
           &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;DataTextFormatString&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="{0:ddd MMM dd HH:mm}"
           &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;HeaderStyle-CssClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="dateColumn"
           &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;HeaderText&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="Date"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;  
       &lt;SPAN style="COLOR: #0000ff"&gt;...
&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Columns&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: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;GridView&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Note that &lt;CODE&gt;ShowItemDetail&lt;/CODE&gt; is a JavaScript function that simply calls &lt;CODE&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms536651(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms536651(VS.85).aspx"&gt;window.open&lt;/A&gt;&lt;/CODE&gt; (specifying the URL as well as additional "feature" parameters such as the window width and height).&lt;/P&gt;
&lt;P&gt;Unfortunately, if you specify something like &lt;CODE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;"javascript:ShowItemDetail({0});"&lt;/SPAN&gt;&lt;/CODE&gt; in &lt;A href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.hyperlinkfield.datanavigateurlformatstring.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.hyperlinkfield.datanavigateurlformatstring.aspx"&gt;DataNavigateUrlFormatString&lt;/A&gt;, you will find that ASP.NET renders an anchor element with no &lt;CODE&gt;href&lt;/CODE&gt; attribute (e.g. &lt;CODE&gt;&amp;lt;a&amp;gt;Mon Oct 26 08:23&amp;lt;/a&amp;gt;&lt;/CODE&gt;) -- which obviously doesn't work. This appears to be "by design" -- in order to "mitigate against cross-site scripting attacks."&lt;BR&gt;&lt;BR&gt;Refer to the following for more detail:&lt;/P&gt;
&lt;DIV class=reference&gt;&lt;CITE&gt;asp:GridView does not render HyperLinkField when a colon (:) is included in the DataNavigateUrlFormatString. 2007-06-05.&lt;/CITE&gt; 
&lt;DIV class=referenceLink&gt;&lt;A href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=102300" mce_href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=102300"&gt;https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=102300&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;To workaround this, use a &lt;A href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.templatefield.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.templatefield.aspx"&gt;TemplateField&lt;/A&gt; instead:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;GridView&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="summaryGrid"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="server"
&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #ff0000"&gt;AutoGenerateColumns&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="False"
    ...&amp;gt;
&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;...&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;
&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Columns&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
&lt;/SPAN&gt;        &amp;lt;%&lt;SPAN style="COLOR: #008000"&gt;-- HACK: Ideally, we would just use an asp:HyperLinkField,
        but there's a bug when specifying "javascript:" in the
        DataNavigateUrlFormatString:

        https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=102300

        As a workaround, use a TemplateField instead. --&lt;/SPAN&gt;%&amp;gt;
        &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;TemplateField&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
           &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;HeaderTemplate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;Date&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;HeaderTemplate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
           &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;HeaderStyle&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;CssClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="dateColumn"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;
           &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;ItemTemplate&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: #a31515"&gt;a&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;href&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='javascript:&lt;SPAN style="COLOR: #0000ff"&gt;ShowItemDetail&lt;/SPAN&gt;(&lt;/SPAN&gt;&amp;lt;%# Eval("Id")%&amp;gt;&lt;SPAN style="COLOR: #0000ff"&gt;)'&amp;gt;
           &lt;/SPAN&gt;        &amp;lt;%&lt;SPAN style="COLOR: #0000ff"&gt;# &lt;/SPAN&gt;Eval(&lt;SPAN style="COLOR: #a31515"&gt;"CreateTime"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"{0:ddd MMM dd HH:mm}"&lt;/SPAN&gt;) %&amp;gt;
&lt;SPAN style="COLOR: #0000ff"&gt;           &lt;/SPAN&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;a&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
           &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;ItemTemplate&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: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;TemplateField&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
&lt;/SPAN&gt;        ...&lt;SPAN style="COLOR: #0000ff"&gt;
&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Columns&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: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;GridView&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Or, if you are really paranoid about the performance impact of using reflection in the DataBinder.Eval method, you can use strongly typed objects instead:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;GridView&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;&lt;SPAN style="COLOR: #ff0000"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="summaryGrid"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="server"
&lt;/SPAN&gt;   &lt;SPAN style="COLOR: #ff0000"&gt;AutoGenerateColumns&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="False"
   ...&amp;gt;
   ...&lt;/SPAN&gt;
&lt;/SPAN&gt;   &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Columns&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
&lt;/SPAN&gt;      &amp;lt;%&lt;SPAN style="COLOR: #008000"&gt;-- HACK: Ideally, we would just use an asp:HyperLinkField,
      but there's a bug when specifying "javascript:" in the
      DataNavigateUrlFormatString:
        
      https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=102300
        
      As a workaround, use a TemplateField instead.
      --&lt;/SPAN&gt;%&amp;gt;
   &lt;SPAN style="COLOR: #008000"&gt; &lt;/SPAN&gt;  &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;TemplateField&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
         &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;HeaderTemplate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;Date&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;HeaderTemplate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
      &lt;SPAN style="COLOR: #008000"&gt;   &lt;/SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;HeaderStyle&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;CssClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="dateColumn"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;
      &lt;SPAN style="COLOR: #008000"&gt;   &lt;/SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;ItemTemplate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
      &lt;SPAN style="COLOR: #008000"&gt;   &lt;/SPAN&gt;&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;a&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;href&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='javascript:&lt;SPAN style="COLOR: #0000ff"&gt;ShowItemDetail&lt;/SPAN&gt;(&lt;/SPAN&gt;&amp;lt;%# ((Fabrikam.Demo.Integration.Incident)Container.DataItem).Id %&amp;gt;&lt;SPAN style="COLOR: #0000ff"&gt;)'&amp;gt;
      &lt;SPAN style="COLOR: #008000"&gt;   &lt;/SPAN&gt;&lt;/SPAN&gt;        &amp;lt;%&lt;SPAN style="COLOR: #0000ff"&gt;#&lt;/SPAN&gt; ((Fabrikam.Demo.Integration.&lt;SPAN style="COLOR: #2b91af"&gt;Incident&lt;/SPAN&gt;)Container.DataItem).CreateTime.ToString(&lt;SPAN style="COLOR: #a31515"&gt;"ddd MMM dd HH:mm"&lt;/SPAN&gt;) %&amp;gt;
&lt;SPAN style="COLOR: #0000ff"&gt;      &lt;SPAN style="COLOR: #008000"&gt;   &lt;/SPAN&gt;&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;a&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
      &lt;SPAN style="COLOR: #008000"&gt;   &lt;/SPAN&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;ItemTemplate&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: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;TemplateField&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: #a31515"&gt;Columns&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: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;GridView&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Of course, if you choose to go the strongly-typed route, you will need to reference the assembly containing your custom business objects. For example:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;lt;%&lt;SPAN style="COLOR: #0000ff"&gt;@&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;Assembly&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="Fabrikam.Demo.Integration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=786f58ca4a6e3f60"&lt;/SPAN&gt; %&amp;gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9912949" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx">Web Development</category></item><item><title>Add Rooler to Your Web Development Toolbox</title><link>http://blogs.msdn.com/jjameson/archive/2009/10/21/add-rooler-to-your-web-development-toolbox.aspx</link><pubDate>Wed, 21 Oct 2009 10:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9910478</guid><dc:creator>Jeremy Jameson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jjameson/comments/9910478.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jjameson/commentrss.aspx?PostID=9910478</wfw:commentRss><description>&lt;P&gt;This past May, one of my colleagues notified me of a new tool called "Rooler" that allows you to easily measure anything displayed on your screen.&lt;/P&gt;
&lt;P&gt;I definitely consider this tool a "must have" for anyone out there doing Web development. While tools like Firebug and the new developer tools in Internet Explorer 8 are great for analyzing the layout of Web pages, I often find myself using Rooler when tweaking CSS rules in order to achieve that "pixel perfect" design. For example, yesterday I was working on styling the new customer service portal that I'm working on and I wanted to match the customer's current .com site. Rooler enabled me to identify the dimensions of the header and margins of various elements with almost no effort whatsoever.&lt;/P&gt;
&lt;P&gt;If you haven't already discovered &lt;A href="http://blois.us/Rooler/" mce_href="http://blois.us/Rooler/"&gt;Rooler&lt;/A&gt;, I strongly recommend you download it today.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9910478" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jjameson/archive/tags/My+System/default.aspx">My System</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx">Web Development</category></item><item><title>KB 896861 and "Microsoft Fix it"</title><link>http://blogs.msdn.com/jjameson/archive/2009/10/14/kb-896861-and-microsoft-fix-it.aspx</link><pubDate>Wed, 14 Oct 2009 12:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9907113</guid><dc:creator>Jeremy Jameson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jjameson/comments/9907113.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jjameson/commentrss.aspx?PostID=9907113</wfw:commentRss><description>&lt;P&gt;A couple of days ago, I rebuilt one of my development VMs for Microsoft Office SharePoint Server (MOSS) 2007. As I've noted in a &lt;A href="http://blogs.msdn.com/jjameson/archive/2009/02/10/issues-with-running-moss-2007-on-windows-server-2008.aspx" mce_href="http://blogs.msdn.com/jjameson/archive/2009/02/10/issues-with-running-moss-2007-on-windows-server-2008.aspx"&gt;previous post&lt;/A&gt;, I've found that I need to apply one of the registry hacks described in the following KnowledgeBase article:&lt;/P&gt;
&lt;DIV class=reference&gt;&lt;CITE&gt;You receive error 401.1 when you browse a Web site that uses Integrated Authentication and is hosted on IIS 5.1 or a later version&lt;/CITE&gt; 
&lt;DIV class=referenceLink&gt;&lt;A href="http://support.microsoft.com/kb/896861" mce_href="http://support.microsoft.com/kb/896861"&gt;http://support.microsoft.com/kb/896861&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;When I browsed to KB 896861 this week, I noticed that it has been updated since the last time I saw it. Apparently, this has become such a common issue that Microsoft now provides an automated way to fix the issue:&lt;/P&gt;
&lt;DIV align=center&gt;&lt;A style="WIDTH: 139px; DISPLAY: block; BACKGROUND: url(http://support.microsoft.com/library/images/support/KBGraphics/PUBLIC/cn/FixItButton.jpg) no-repeat 0px 0px; HEIGHT: 56px" title="Microsoft Fix it" href="http://go.microsoft.com/?linkid=9686309" mce_href="http://go.microsoft.com/?linkid=9686309"&gt;&lt;/A&gt;&lt;A title="Microsoft Fix it" href="http://go.microsoft.com/?linkid=9686309" mce_href="http://go.microsoft.com/?linkid=9686309"&gt;Fix this problem&lt;/A&gt; &lt;BR&gt;Microsoft Fix it 50306&lt;/DIV&gt;
&lt;P&gt;This was the first time I've seen a reference to &lt;STRONG&gt;Microsoft Fix it&lt;/STRONG&gt;, and I have to say that I like it -- and for more than just the cute moniker and button image, too!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9907113" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jjameson/archive/tags/MOSS+2007/default.aspx">MOSS 2007</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx">Web Development</category></item><item><title>Formatting Code for My Blog</title><link>http://blogs.msdn.com/jjameson/archive/2009/10/09/formatting-code-for-my-blog.aspx</link><pubDate>Fri, 09 Oct 2009 17:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9905492</guid><dc:creator>Jeremy Jameson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jjameson/comments/9905492.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jjameson/commentrss.aspx?PostID=9905492</wfw:commentRss><description>&lt;P&gt;It occurred to me this morning that while I previously shared some details on &lt;A href="http://blogs.msdn.com/jjameson/archive/2009/09/12/expression-web-my-msdn-blog-and-now-team-foundation-server.aspx" mce_href="http://blogs.msdn.com/jjameson/archive/2009/09/12/expression-web-my-msdn-blog-and-now-team-foundation-server.aspx"&gt;how I manage my MSDN blog&lt;/A&gt;, I've never shared my method for formatting code for the Web.&lt;/P&gt;
&lt;P&gt;Actually, calling it "my method" is definitely a bit of a stretch. I certainly didn't come up with the approach but rather refined someone else's approach (and code) to suit my needs. The original credit goes to &lt;A href="http://blogs.msdn.com/delay" mce_href="http://blogs.msdn.com/delay"&gt;David Anson&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Prior to adopting David's approach, I previously copied code from Visual Studio, pasted it into Microsoft Word, then copied it again in Microsoft Word, and finally pasted into Expression Web. While this achieved the desired end result -- meaning, formatted code with color syntax highlighting -- it definitely was a little kludgey. First, the four-step process -- while not excessively tedious -- was definitely less than desirable, because it often meant I had to fire up Word for the sole purpose of formatting code (note that copy/paste from Visual Studio into Expression Web does not preserve the formatting). Second -- and more importantly -- the resulting HTML markup was just "crap" (sorry, I can't think of a more eloquent way to put that right now).&lt;/P&gt;
&lt;P&gt;When I started looking at approaches for improving the formatting of code for my blog, I found that there were numerous "solutions" out there. However, I knew what I really wanted was something that would produce a minimal amount of HTML markup (or at least a lot less HTML than Microsoft Word) and, preferably, something that generated semantic markup as well -- or at least &lt;EM&gt;reasonably&lt;/EM&gt; semantic markup.&lt;/P&gt;
&lt;P&gt;What I mean by semantic markup is that code should be wrapped in a &lt;CODE&gt;&amp;lt;code&amp;gt;&lt;/CODE&gt; tag -- as well as a &lt;CODE&gt;&amp;lt;pre&amp;gt;&lt;/CODE&gt; tag (in order to correctly display line breaks, indenting, etc.). To understand what I mean by semantic markup for code, consider the following example:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System;

&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;Class1
&lt;/SPAN&gt;{
    &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; Class1()
    {
        &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; foo = &lt;SPAN style="COLOR: #a31515"&gt;"foo"&lt;/SPAN&gt;;
    }
}&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;In HTML markup, this is expressed as:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;div&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='codeBlock'&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;pre&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;code&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;style&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;color&lt;/SPAN&gt;:&lt;SPAN style="COLOR: #0000ff"&gt;#0000ff'&amp;gt;&lt;/SPAN&gt;using&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt; System;

&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;style&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;color&lt;/SPAN&gt;:&lt;SPAN style="COLOR: #0000ff"&gt;#0000ff'&amp;gt;&lt;/SPAN&gt;public&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&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: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;style&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;color&lt;/SPAN&gt;:&lt;SPAN style="COLOR: #0000ff"&gt;#0000ff'&amp;gt;&lt;/SPAN&gt;class&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&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: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;style&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;color&lt;/SPAN&gt;:&lt;SPAN style="COLOR: #0000ff"&gt;#2b91af'&amp;gt;&lt;/SPAN&gt;Class1
&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&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: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;style&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;color&lt;/SPAN&gt;:&lt;SPAN style="COLOR: #0000ff"&gt;#0000ff'&amp;gt;&lt;/SPAN&gt;public&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt; Class1()
    {
        &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;style&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;color&lt;/SPAN&gt;:&lt;SPAN style="COLOR: #0000ff"&gt;#0000ff'&amp;gt;&lt;/SPAN&gt;string&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt; foo = &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;style&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;color&lt;/SPAN&gt;:&lt;SPAN style="COLOR: #0000ff"&gt;#a31515'&amp;gt;&lt;/SPAN&gt;"foo"&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&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: #a31515"&gt;code&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;pre&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;div&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;The &lt;CODE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;div&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='codeBlock'&amp;gt; &lt;/SPAN&gt;&lt;/CODE&gt;element is used to constrain lengthy code blocks (i.e. show a vertical scrollbar when necessary) and also format code with a background color and border. &lt;/P&gt;
&lt;P&gt;Note that in the stricted sense, this isn't 100% semantic markup because the &lt;CODE&gt;&amp;lt;span&amp;gt;&lt;/CODE&gt; tags are used to apply presentational styles, namely the various font colors. Truly semantic markup for code would specify something more like this:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;div&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='codeBlock'&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;pre&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;code&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='keyword'&amp;gt;&lt;/SPAN&gt;using&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt; System;

&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='keyword'&amp;gt;&lt;/SPAN&gt;public&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&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: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='keyword'&amp;gt;&lt;/SPAN&gt;class&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&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: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="userType"&amp;gt;&lt;/SPAN&gt;Class1
&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&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: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='keyword'&amp;gt;&lt;/SPAN&gt;public&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt; Class1()
    {
        &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='keyword'&amp;gt;&lt;/SPAN&gt;string&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt; foo = &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;='string'&amp;gt;&lt;/SPAN&gt;"foo"&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;span&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: #a31515"&gt;code&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;pre&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;div&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;CSS rules could then be used to achieve the color syntax highlighting:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: #a31515"&gt;code&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;.keyword
&lt;/SPAN&gt;{
    &lt;SPAN style="COLOR: #ff0000"&gt;color&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;#0000ff&lt;/SPAN&gt;;
}
&lt;SPAN style="COLOR: #a31515"&gt;code&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;.string
&lt;/SPAN&gt;{
    &lt;SPAN style="COLOR: #ff0000"&gt;color&lt;/SPAN&gt;:&lt;SPAN style="COLOR: #0000ff"&gt; #a31515&lt;/SPAN&gt;;
}
&lt;SPAN style="COLOR: #a31515"&gt;code&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;.userType
&lt;/SPAN&gt;{
    &lt;SPAN style="COLOR: #ff0000"&gt;color&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;#2b91af&lt;/SPAN&gt;;
}&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Anyway, getting back to the real topic for this post...&lt;/P&gt;
&lt;P&gt;I really liked David's approach since a) it was simple (meaning I didn't need to spend much time understanding his code sample), and b) it leveraged Visual Studio to handle the bulk of the formatting work.&lt;/P&gt;
&lt;P&gt;However, there were a couple of "fixes" that I found I needed:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;David's original code sample produced errors when I used it from SQL Server Management Studio 2005 (note that SQL Server Management Studio uses the Visual Studio "shell", so one should expect this to work)&lt;/LI&gt;
&lt;LI&gt;David's code sample only inserted a &lt;CODE&gt;&amp;lt;pre&amp;gt;&lt;/CODE&gt; tag (and not the corresponding &lt;CODE&gt;&amp;lt;code&amp;gt;&lt;/CODE&gt; and &lt;CODE&gt;&amp;lt;div class="codeBlock"&amp;gt;&lt;/CODE&gt; tags that I also wanted)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;I also wanted to eliminate extraneous &lt;CODE&gt;&amp;lt;span&amp;gt;&lt;/CODE&gt; tags for the default color (i.e. black).&lt;/P&gt;
&lt;P&gt;Note that -- at least to this point -- I haven't made any attempt to generate 100% semantic markup (by converting the &lt;CODE&gt;&lt;SPAN style="COLOR: #ff0000"&gt;style &lt;/SPAN&gt;&lt;/CODE&gt;attributes to corresponding CSS class names), because I think it would be somewhat brittle (i.e. dependent on the default color options in Visual Studio) and, honestly, not worth the effort.&lt;/P&gt;
&lt;P&gt;Here's the updated code that I now use for my Rtf2Html.exe utility:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: #008000"&gt;// Original source:
// http://blogs.msdn.com/delay/archive/2008/03/13/
// blogging-code-samples-should-be-easy-free-convertclipboardrtftohtmltext-tool-and-source-code.aspx

&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Collections.Generic;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Drawing;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Text;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Windows.Forms;

&lt;SPAN style="COLOR: #008000"&gt;// Convert Visual Studio 2008 RTF clipboard format into HTML by replacing the
// clipboard contents with its HTML representation in text format suitable for
// pasting into a web page or blog.
// USE: Copy to clipboard in VS, run this app (no UI), paste converted text
// NOTE: This is NOT a general-purpose RTF-to-HTML converter! It works well
// enough on the simple input I've tried, but may break for other input.
// TODO: Convert into a real application with a notify icon and hotkey.
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;namespace&lt;/SPAN&gt; ConvertClipboardRtfToHtmlText
{
    &lt;SPAN style="COLOR: #0000ff"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;ConvertClipboardRtfToHtmlText
&lt;/SPAN&gt;    {
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;const&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; colorTbl = &lt;SPAN style="COLOR: #a31515"&gt;"\\colortbl;"&lt;/SPAN&gt;;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;const&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; colorFieldTag = &lt;SPAN style="COLOR: #a31515"&gt;"cf"&lt;/SPAN&gt;;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;const&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; tabExpansion = &lt;SPAN style="COLOR: #a31515"&gt;"    "&lt;/SPAN&gt;;

        [System.Diagnostics.CodeAnalysis.&lt;SPAN style="COLOR: #2b91af"&gt;SuppressMessage&lt;/SPAN&gt;(
            &lt;SPAN style="COLOR: #a31515"&gt;"Microsoft.Maintainability"&lt;/SPAN&gt;,
            &lt;SPAN style="COLOR: #a31515"&gt;"CA1502:AvoidExcessiveComplexity"&lt;/SPAN&gt;)]
        [&lt;SPAN style="COLOR: #2b91af"&gt;STAThread&lt;/SPAN&gt;]
        &lt;SPAN style="COLOR: #0000ff"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; Main()
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (&lt;SPAN style="COLOR: #2b91af"&gt;Clipboard&lt;/SPAN&gt;.ContainsText(&lt;SPAN style="COLOR: #2b91af"&gt;TextDataFormat&lt;/SPAN&gt;.Rtf))
            {
                &lt;SPAN style="COLOR: #008000"&gt;// Create color table, populate with default color
&lt;/SPAN&gt;                &lt;SPAN style="COLOR: #2b91af"&gt;List&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;Color&lt;/SPAN&gt;&amp;gt; colors = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;List&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;Color&lt;/SPAN&gt;&amp;gt;();
                &lt;SPAN style="COLOR: #2b91af"&gt;Color&lt;/SPAN&gt; defaultColor = &lt;SPAN style="COLOR: #2b91af"&gt;Color&lt;/SPAN&gt;.FromArgb(0, 0, 0);
                colors.Add(defaultColor);

                &lt;SPAN style="COLOR: #0000ff"&gt;bool&lt;/SPAN&gt; insideSpan = &lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;;

                &lt;SPAN style="COLOR: #008000"&gt;// Get RTF
&lt;/SPAN&gt;                &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; rtf = &lt;SPAN style="COLOR: #2b91af"&gt;Clipboard&lt;/SPAN&gt;.GetText(&lt;SPAN style="COLOR: #2b91af"&gt;TextDataFormat&lt;/SPAN&gt;.Rtf);

                &lt;SPAN style="COLOR: #008000"&gt;// Parse color table
&lt;/SPAN&gt;                &lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt; i = rtf.IndexOf(
                    colorTbl,
                    &lt;SPAN style="COLOR: #2b91af"&gt;StringComparison&lt;/SPAN&gt;.OrdinalIgnoreCase);

                &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (-1 != i)
                {
                    i += colorTbl.Length;

                    &lt;SPAN style="COLOR: #008000"&gt;// When copying from Visual Studio, we expect
&lt;/SPAN&gt;                    &lt;SPAN style="COLOR: #008000"&gt;// "\\colortbl;\r\n". However when copying from SQL Server
&lt;/SPAN&gt;                    &lt;SPAN style="COLOR: #008000"&gt;// Management Studio, we expect just "\\colortbl;".
&lt;/SPAN&gt;                    SkipOptionalText(rtf, &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; i, &lt;SPAN style="COLOR: #a31515"&gt;"\r\n"&lt;/SPAN&gt;);

                    &lt;SPAN style="COLOR: #0000ff"&gt;while&lt;/SPAN&gt; ((i &amp;lt; rtf.Length) &amp;amp;&amp;amp; (&lt;SPAN style="COLOR: #a31515"&gt;'}'&lt;/SPAN&gt; != rtf[i]))
                    {
                        &lt;SPAN style="COLOR: #008000"&gt;// Add color to color table
&lt;/SPAN&gt;                        SkipOptionalText(rtf, &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; i, &lt;SPAN style="COLOR: #a31515"&gt;"\r\n"&lt;/SPAN&gt;);
                        SkipExpectedText(rtf, &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; i, &lt;SPAN style="COLOR: #a31515"&gt;"\\red"&lt;/SPAN&gt;);
                        &lt;SPAN style="COLOR: #0000ff"&gt;byte&lt;/SPAN&gt; red = (&lt;SPAN style="COLOR: #0000ff"&gt;byte&lt;/SPAN&gt;)ParseNumericField(rtf, &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; i);
                        SkipExpectedText(rtf, &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; i, &lt;SPAN style="COLOR: #a31515"&gt;"\\green"&lt;/SPAN&gt;);
                        &lt;SPAN style="COLOR: #0000ff"&gt;byte&lt;/SPAN&gt; green = (&lt;SPAN style="COLOR: #0000ff"&gt;byte&lt;/SPAN&gt;)ParseNumericField(rtf, &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; i);
                        SkipExpectedText(rtf, &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; i, &lt;SPAN style="COLOR: #a31515"&gt;"\\blue"&lt;/SPAN&gt;);
                        &lt;SPAN style="COLOR: #0000ff"&gt;byte&lt;/SPAN&gt; blue = (&lt;SPAN style="COLOR: #0000ff"&gt;byte&lt;/SPAN&gt;)ParseNumericField(rtf, &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; i);
                        colors.Add(&lt;SPAN style="COLOR: #2b91af"&gt;Color&lt;/SPAN&gt;.FromArgb(red, green, blue));
                        SkipOptionalText(rtf, &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; i, &lt;SPAN style="COLOR: #a31515"&gt;"\r\n"&lt;/SPAN&gt;);
                        SkipExpectedText(rtf, &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; i, &lt;SPAN style="COLOR: #a31515"&gt;";"&lt;/SPAN&gt;);
                    }
                }
                &lt;SPAN style="COLOR: #0000ff"&gt;else
&lt;/SPAN&gt;                {
                    &lt;SPAN style="COLOR: #0000ff"&gt;throw&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;NotSupportedException&lt;/SPAN&gt;(
                        &lt;SPAN style="COLOR: #a31515"&gt;"Missing/unknown colorTbl."&lt;/SPAN&gt;);
                }

                &lt;SPAN style="COLOR: #008000"&gt;// Find start of text and parse
&lt;/SPAN&gt;                i = rtf.IndexOf(&lt;SPAN style="COLOR: #a31515"&gt;"\\fs"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #2b91af"&gt;StringComparison&lt;/SPAN&gt;.OrdinalIgnoreCase);
                &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (-1 != i)
                {
                    &lt;SPAN style="COLOR: #008000"&gt;// Skip font size tag
&lt;/SPAN&gt;                    &lt;SPAN style="COLOR: #0000ff"&gt;while&lt;/SPAN&gt; ((i &amp;lt; rtf.Length) &amp;amp;&amp;amp; (&lt;SPAN style="COLOR: #a31515"&gt;' '&lt;/SPAN&gt; != rtf[i]))
                    {
                        i++;
                    }
                    i++;

                    &lt;SPAN style="COLOR: #008000"&gt;// Begin building HTML text
&lt;/SPAN&gt;                    &lt;SPAN style="COLOR: #2b91af"&gt;StringBuilder&lt;/SPAN&gt; sb = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;StringBuilder&lt;/SPAN&gt;();
                    sb.Append(&lt;SPAN style="COLOR: #a31515"&gt;"&amp;lt;div class='codeBlock'&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;"&lt;/SPAN&gt;);
                    &lt;SPAN style="COLOR: #0000ff"&gt;while&lt;/SPAN&gt; (i &amp;lt; rtf.Length)
                    {
                        &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (&lt;SPAN style="COLOR: #a31515"&gt;'\\'&lt;/SPAN&gt; == rtf[i])
                        {
                            &lt;SPAN style="COLOR: #008000"&gt;// Parse escape code
&lt;/SPAN&gt;                            i++;
                            &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; ((i &amp;lt; rtf.Length) &amp;amp;&amp;amp;
                                ((&lt;SPAN style="COLOR: #a31515"&gt;'{'&lt;/SPAN&gt; == rtf[i])
                                    || (&lt;SPAN style="COLOR: #a31515"&gt;'}'&lt;/SPAN&gt; == rtf[i])
                                    || (&lt;SPAN style="COLOR: #a31515"&gt;'\\'&lt;/SPAN&gt; == rtf[i])))
                            {
                                &lt;SPAN style="COLOR: #008000"&gt;// Escaped '{' or '}' or '\'
&lt;/SPAN&gt;                                sb.Append(rtf[i]);
                            }
                            &lt;SPAN style="COLOR: #0000ff"&gt;else
&lt;/SPAN&gt;                            {
                                &lt;SPAN style="COLOR: #008000"&gt;// Parse tag
&lt;/SPAN&gt;                                &lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt; tagEnd = rtf.IndexOf(&lt;SPAN style="COLOR: #a31515"&gt;' '&lt;/SPAN&gt;, i);
                                &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (-1 != tagEnd)
                                {
                                    &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (rtf.Substring(
                                        i,
                                        tagEnd - i).StartsWith(
                                            colorFieldTag,
                                            &lt;SPAN style="COLOR: #2b91af"&gt;StringComparison&lt;/SPAN&gt;.OrdinalIgnoreCase))
                                    {
                                        &lt;SPAN style="COLOR: #008000"&gt;// Parse color field tag
&lt;/SPAN&gt;                                        i += colorFieldTag.Length;
                                        &lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt; colorIndex = ParseNumericField(rtf, &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; i);
                                        &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; ((colorIndex &amp;lt; 0)
                                            || (colors.Count &amp;lt;= colorIndex))
                                        {
                                            &lt;SPAN style="COLOR: #0000ff"&gt;throw&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;NotSupportedException&lt;/SPAN&gt;(
                                                &lt;SPAN style="COLOR: #a31515"&gt;"Bad color index."&lt;/SPAN&gt;);
                                        }

                                        &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (insideSpan == &lt;SPAN style="COLOR: #0000ff"&gt;true&lt;/SPAN&gt;)
                                        {
                                            sb.Append(&lt;SPAN style="COLOR: #a31515"&gt;"&amp;lt;/span&amp;gt;"&lt;/SPAN&gt;);
                                            insideSpan = &lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;;
                                        }

                                        &lt;SPAN style="COLOR: #008000"&gt;// Change to new color
&lt;/SPAN&gt;                                        &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (colors[colorIndex] != defaultColor)
                                        {
                                            sb.AppendFormat(
                                                &lt;SPAN style="COLOR: #a31515"&gt;"&amp;lt;span style='color:#{0:x2}{1:x2}{2:x2}'&amp;gt;"&lt;/SPAN&gt;,
                                                colors[colorIndex].R, colors[colorIndex].G,
                                                colors[colorIndex].B);

                                            insideSpan = &lt;SPAN style="COLOR: #0000ff"&gt;true&lt;/SPAN&gt;;
                                        }
                                    }
                                    &lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (&lt;SPAN style="COLOR: #a31515"&gt;"tab"&lt;/SPAN&gt; ==
                                        rtf.Substring(i, tagEnd - i))
                                    {
                                        sb.Append(tabExpansion);
                                    }

                                    &lt;SPAN style="COLOR: #008000"&gt;// Skip tag
&lt;/SPAN&gt;                                    i = tagEnd;
                                }
                                &lt;SPAN style="COLOR: #0000ff"&gt;else
&lt;/SPAN&gt;                                {
                                    &lt;SPAN style="COLOR: #0000ff"&gt;throw&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;NotSupportedException&lt;/SPAN&gt;(
                                        &lt;SPAN style="COLOR: #a31515"&gt;"Malformed tag."&lt;/SPAN&gt;);
                                }
                            }
                        }
                        &lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (&lt;SPAN style="COLOR: #a31515"&gt;'}'&lt;/SPAN&gt; == rtf[i])
                        {
                            &lt;SPAN style="COLOR: #008000"&gt;// Terminal curly; done
&lt;/SPAN&gt;                            &lt;SPAN style="COLOR: #0000ff"&gt;break&lt;/SPAN&gt;;
                        }
                        &lt;SPAN style="COLOR: #0000ff"&gt;else
&lt;/SPAN&gt;                        {
                            &lt;SPAN style="COLOR: #008000"&gt;// Normal character; HTML-escape '&amp;lt;', '&amp;gt;', and '&amp;amp;'
&lt;/SPAN&gt;                            &lt;SPAN style="COLOR: #0000ff"&gt;switch&lt;/SPAN&gt; (rtf[i])
                            {
                                &lt;SPAN style="COLOR: #0000ff"&gt;case&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;'&amp;lt;'&lt;/SPAN&gt;:
                                    sb.Append(&lt;SPAN style="COLOR: #a31515"&gt;"&amp;amp;lt;"&lt;/SPAN&gt;);
                                    &lt;SPAN style="COLOR: #0000ff"&gt;break&lt;/SPAN&gt;;
                                &lt;SPAN style="COLOR: #0000ff"&gt;case&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;'&amp;gt;'&lt;/SPAN&gt;:
                                    sb.Append(&lt;SPAN style="COLOR: #a31515"&gt;"&amp;amp;gt;"&lt;/SPAN&gt;);
                                    &lt;SPAN style="COLOR: #0000ff"&gt;break&lt;/SPAN&gt;;
                                &lt;SPAN style="COLOR: #0000ff"&gt;case&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;'&amp;amp;'&lt;/SPAN&gt;:
                                    sb.Append(&lt;SPAN style="COLOR: #a31515"&gt;"&amp;amp;amp;"&lt;/SPAN&gt;);
                                    &lt;SPAN style="COLOR: #0000ff"&gt;break&lt;/SPAN&gt;;
                                &lt;SPAN style="COLOR: #0000ff"&gt;default&lt;/SPAN&gt;:
                                    sb.Append(rtf[i]);
                                    &lt;SPAN style="COLOR: #0000ff"&gt;break&lt;/SPAN&gt;;
                            }
                        }
                        i++;
                    }

                    &lt;SPAN style="COLOR: #008000"&gt;// Finish building HTML text
&lt;/SPAN&gt;                    &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (insideSpan == &lt;SPAN style="COLOR: #0000ff"&gt;true&lt;/SPAN&gt;)
                    {
                        sb.Append(&lt;SPAN style="COLOR: #a31515"&gt;"&amp;lt;/span&amp;gt;"&lt;/SPAN&gt;);
                        insideSpan = &lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;;
                    }

                    sb.Append(&lt;SPAN style="COLOR: #a31515"&gt;"&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;"&lt;/SPAN&gt;);

                    &lt;SPAN style="COLOR: #008000"&gt;// Update the clipboard text
&lt;/SPAN&gt;                    &lt;SPAN style="COLOR: #2b91af"&gt;Clipboard&lt;/SPAN&gt;.SetText(sb.ToString());
                }
                &lt;SPAN style="COLOR: #0000ff"&gt;else
&lt;/SPAN&gt;                {
                    &lt;SPAN style="COLOR: #0000ff"&gt;throw&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;NotSupportedException&lt;/SPAN&gt;(
                        &lt;SPAN style="COLOR: #a31515"&gt;"Missing text section."&lt;/SPAN&gt;);
                }
            }
        }

        &lt;SPAN style="COLOR: #008000"&gt;// Skip the specified text
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; SkipExpectedText(&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; s, &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt; i, &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; text)
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (&lt;SPAN style="COLOR: #0000ff"&gt;char&lt;/SPAN&gt; c &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; text)
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; ((s.Length &amp;lt;= i) || (c != s[i]))
                {
                    &lt;SPAN style="COLOR: #0000ff"&gt;throw&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;NotSupportedException&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #a31515"&gt;"Expected text missing."&lt;/SPAN&gt;);
                }
                i++;
            }
        }

        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; SkipOptionalText(
            &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; s,
            &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt; i,
            &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; text)
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; substring = s.Substring(i, text.Length);

            &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (substring == text)
            {
                i += text.Length;
            }
        }

        &lt;SPAN style="COLOR: #008000"&gt;// Parse a numeric field
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt; ParseNumericField(&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; s, &lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt; i)
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt; value = 0;
            &lt;SPAN style="COLOR: #0000ff"&gt;while&lt;/SPAN&gt; ((i &amp;lt; s.Length) &amp;amp;&amp;amp; &lt;SPAN style="COLOR: #0000ff"&gt;char&lt;/SPAN&gt;.IsDigit(s[i]))
            {
                value *= 10;
                value += s[i] - &lt;SPAN style="COLOR: #a31515"&gt;'0'&lt;/SPAN&gt;;
                i++;
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; value;
        }
    }
}&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;I suppose I could have kept the ConvertClipboardRtfToHtmlText moniker that David originally had, but for some reason I decided to abbreviate it. In hindsight, I'm really not sure why I didn't keep the name, but oh well...&lt;/P&gt;
&lt;P&gt;Whenever I need a code sample in a blog post, I simply copy the code in Visual Studio, double-click Rtf2Html.exe in my &lt;A href="http://blogs.msdn.com/jjameson/archive/2007/03/22/backedup-and-notbackedup.aspx" mce_href="http://blogs.msdn.com/jjameson/archive/2007/03/22/backedup-and-notbackedup.aspx"&gt;Toolbox&lt;/A&gt;, and then paste into Expression Web. It's still a three-step process, but not one that takes more than three or four seconds, and more importantly, it now produces much better HTML markup than the hack I used to use with Microsoft Word.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9905492" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jjameson/archive/tags/My+System/default.aspx">My System</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/Simplify/default.aspx">Simplify</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx">Web Development</category></item><item><title>Expression Web, My MSDN Blog, and (Now) Team Foundation Server</title><link>http://blogs.msdn.com/jjameson/archive/2009/09/12/expression-web-my-msdn-blog-and-now-team-foundation-server.aspx</link><pubDate>Sat, 12 Sep 2009 17:17:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9894524</guid><dc:creator>Jeremy Jameson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jjameson/comments/9894524.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jjameson/commentrss.aspx?PostID=9894524</wfw:commentRss><description>&lt;P&gt;In case you haven't picked it up from some of my previous posts, I became somewhat of a "Web standards zealot" back in 2006 while creating a "community site" for a &lt;A href="http://www.metrodenveridc.org/" mce_href="http://www.metrodenveridc.org"&gt;local organization of mental health professionals and attorneys&lt;/A&gt; that help children and their parents through divorce. After reading books like &lt;A href="http://amzn.com/0321303474" mce_href="http://amzn.com/0321303474"&gt;The Zen of CSS Design&lt;/A&gt;, &lt;A href="http://amzn.com/1430219203" mce_href="http://amzn.com/1430219203"&gt;Web Standards Solutions&lt;/A&gt;, and &lt;A href="http://amzn.com/0321509021" mce_href="http://amzn.com/0321509021"&gt;Bulletproof Web Design&lt;/A&gt;, I realized the fundamental concept of &lt;A href="http://en.wikipedia.org/wiki/Web_standards" mce_href="http://en.wikipedia.org/wiki/Web_standards"&gt;Web standards&lt;/A&gt; design closely aligns with my preference of keeping things as simple as possible. Last year, I got a copy of &lt;A href="http://amzn.com/0321410971" mce_href="http://amzn.com/0321410971"&gt;Transcending CSS&lt;/A&gt; and I highly recommend this book as well for anyone responsible for creating Web sites.&lt;/P&gt;
&lt;P&gt;Although it may strike people as somewhat odd, I've been using Microsoft Expression Web for the last couple of years to manage the content for my MSDN blog. While the underlying platform for MSDN blogs (i.e. Community Server) certainly provides rich editing functionality, I personally prefer to have very tight control over the HTML whenever I am creating content for the Web. There are also a few things that really bother me about the editing functionality in Community Server (or at least the version of Community Server that Microsoft is currently using).&lt;/P&gt;
&lt;P&gt;Before finally choosing Expression Web, I looked at various other tools for authoring blog posts, including Windows Live Writer and even Microsoft Word 2007. However, I found that by using Expression Web and a simple "template" that I created, I could quickly and easily create blog posts with just the kind of "minimal markup" that I was looking for.&lt;/P&gt;
&lt;P&gt;My template simply contains a variety of markup that I commonly use when creating blog posts, such as:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;blockquote&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="directQuote errorMessage"&amp;gt;
&lt;/SPAN&gt;    [Direct quote, error message]&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;blockquote&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Whenever I need to create a new blog post, I simply copy my template (i.e. default.htm) into the corresponding Archive\{year}\{month}\{day} folder, rename the file to something like &lt;STRONG&gt;sharepoint-2010-sneak-peek.aspx&lt;/STRONG&gt;, and then start replacing the placeholder text with the corresponding content. Note that I have defined a few custom CSS rules in Community Server to change the style of my blog content, such as:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: #a31515"&gt;.directQuote&lt;/SPAN&gt; {
    &lt;SPAN style="COLOR: #ff0000"&gt;font-style&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;italic&lt;/SPAN&gt;;
}
&lt;SPAN style="COLOR: #a31515"&gt;.errorMessage&lt;/SPAN&gt; {
    &lt;SPAN style="COLOR: #ff0000"&gt;color&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #0000ff"&gt;red&lt;/SPAN&gt;;
}&lt;/CODE&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;I define these styles in a CSS file (i.e. Themes\MSDN\MSDN.css) that is referenced by each page, thus giving me a WYSIWYG (What You See Is What You Get) experience when authoring blog content. This is one of the biggest things lacking from the editing functionality provided by Community Server, meaning that it doesn't apply your custom CSS rules when previewing a blog post before publishing.&lt;/P&gt;
&lt;P&gt;Once I have finished writing a blog post in Expression Web, I simply copy the HTML within the &lt;CODE&gt;&amp;lt;body&amp;gt;&lt;/CODE&gt; element, browse to my MSDN blog, click the &lt;STRONG&gt;Write a Blog Post &lt;/STRONG&gt;link, click the &lt;STRONG&gt;Edit HTML Source &lt;/STRONG&gt;toolbar button in the Community Server Control Panel, and then paste my content into the HTML source view.&lt;/P&gt;
&lt;P&gt;I freely admit this approach takes a little longer than simply authoring posts directly on the site, but I believe it is well worth it. Even more so, now that my blog is stored in Team Foundation Server (TFS)...&lt;/P&gt;
&lt;P&gt;Back in August while I was in Redmond for SharePoint 2010 Training, I took the opportunity of being on the Microsoft campus to rebuild my laptop with Windows 7. Prior to that rebuild, I had been running Windows Server 2008 on my laptop so that I could utilize Hyper-V regardless of whether I was working at a customer site or from home (with access to the &lt;A href="http://blogs.msdn.com/jjameson/archive/2009/09/14/the-jameson-datacenter.aspx" mce_href="http://blogs.msdn.com/jjameson/archive/2009/09/14/the-jameson-datacenter.aspx"&gt;"Jameson Datacenter"&lt;/A&gt; and all of my various VMs).&lt;/P&gt;
&lt;P&gt;As part of this latest rebuild, I installed the latest version of the Microsoft Expression suite. One of the new features I discovered in Expression Web 3 is the ability to integrate with Team Foundation Server for source control. Note that this integration isn't completely out-of-the-box (i.e. you have to download a &lt;A href="http://code.msdn.microsoft.com/KB967483" mce_href="http://code.msdn.microsoft.com/KB967483"&gt;QFE&lt;/A&gt; to enable it).&lt;/P&gt;
&lt;P&gt;This morning, I finally found some time to move the "offline copy" of my MSDN content from my Documents folder into Team Foundation Server. I simply needed to create a new team project in TFS and then configure my workspace for source control. Once this was done, the TFS integration features of Expression Web 3 simply just worked, as shown below:&lt;/P&gt;
&lt;DIV class=image&gt;&lt;IMG title="" alt="" src="http://blogs.msdn.com/photos/jjameson/images/9894525/451x375.aspx" width=451 height=375 mce_src="http://blogs.msdn.com/photos/jjameson/images/9894525/451x375.aspx"&gt; 
&lt;DIV class=caption&gt;Figure 1: Expression Web - my MSDN blog&lt;/DIV&gt;
&lt;DIV class=imageLink&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9894525/original.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/jjameson/images/9894525/original.aspx"&gt;See full-sized image.&lt;/A&gt; &lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Notice how items that are checked into source control have a lock icon and new items that are pending have a "plus" icon next to them. In other words, the Folder List in Expression Web (which essentially shows your Web site "solution") now behaves a lot like the Solution Explorer window in Visual Studio (at least from the perspective of source control).&lt;/P&gt;
&lt;P&gt;Even though the offline content of my MSDN blog content was previously backed up on one of the servers in the Jameson Datacenter, now that it is stored in TFS, it is much easier for me to author blog posts from multiple computers (by simply doing a Get Latest from TFS). I also like the fact that my posts now have versioning -- so in the rare case where I actually go back and annotate a blog post, I can now easily "diff" my changes whenever I want.&lt;/P&gt;
&lt;P&gt;I personally love Expression Web, and now that it integrates with TFS, I love it even more! [Although I'm still getting used to the new "dark theme" introduced in v3 -- which was carried over from the previous version of Expression Blend.]&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9894524" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jjameson/archive/tags/My+System/default.aspx">My System</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx">Web Development</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/TFS/default.aspx">TFS</category></item><item><title>Creating Wireframes for Page Layouts</title><link>http://blogs.msdn.com/jjameson/archive/2009/06/26/creating-wireframes-for-page-layouts.aspx</link><pubDate>Fri, 26 Jun 2009 16:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9805438</guid><dc:creator>Jeremy Jameson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jjameson/comments/9805438.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jjameson/commentrss.aspx?PostID=9805438</wfw:commentRss><description>&lt;P&gt;When helping customers migrate their Internet sites to Microsoft Office SharePoint Server (MOSS) 2007, I've found it very helpful to create wireframes showing the various fields, Web Parts, and master page content. For the last several years, I've been doing this in Microsoft Office Visio, but you could certainly achieve similar results with other tools, such as Expression Design.&lt;/P&gt;
&lt;P&gt;I start by taking a series of screenshots of the existing Web site using &lt;A href="http://blogs.msdn.com/jjameson/archive/2008/10/20/fessing-up-about-firefox.aspx" mce_href="http://blogs.msdn.com/jjameson/archive/2008/10/20/fessing-up-about-firefox.aspx"&gt;Screengrab!&lt;/A&gt; (which makes it very easy to capture entire Web pages). For example, here is a screenshot of a "Generic" page on the &lt;A href="http://www.chem.agilent.com/" mce_href="http://www.chem.agilent.com"&gt;Agilent Technologies - LSCA&lt;/A&gt; site that I captured a couple of years ago.&lt;/P&gt;
&lt;DIV class=image&gt;&lt;IMG class=screenshot title="" alt="" src="http://blogs.msdn.com/photos/jjameson/images/9805322/471x375.aspx" width=471 height=375 mce_src="http://blogs.msdn.com/photos/jjameson/images/9805322/471x375.aspx"&gt; 
&lt;DIV class=caption&gt;Figure 1: "Generic" page&lt;/DIV&gt;
&lt;DIV class=imageLink&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9805322/original.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/jjameson/images/9805322/original.aspx"&gt;See full-sized image.&lt;/A&gt; &lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;I then paste the screenshot into Visio.&lt;/P&gt;
&lt;P&gt;Next, I deemphasize the portions of the page rendered by the master page. To accomplish this, add a rectangle with the text &lt;STRONG&gt;Header (Master Page)&lt;/STRONG&gt; over the top portion of the page. Then fill the rectangle with light gray (&lt;STRONG&gt;Shade 15%&lt;/STRONG&gt;) and set the transparency to &lt;STRONG&gt;30%&lt;/STRONG&gt;. Repeat similar steps for the footer and other content provided by the master page.&lt;/P&gt;
&lt;P&gt;The next step is to emphasize the various fields that we need to define in the corresponding content type. In Figure 1, it is easy to discern that we have a &lt;STRONG&gt;Title&lt;/STRONG&gt; (i.e. "Glycomics Solution"), a &lt;STRONG&gt;Page Image&lt;/STRONG&gt; (i.e. the circular image on the right side of the page), and some arbitrary amount of &lt;STRONG&gt;Page Content&lt;/STRONG&gt; (i.e. the "stuff" in the middle). I also chose to provide a &lt;STRONG&gt;Subtitle &lt;/STRONG&gt;field for the bold text at the top of the page. Isolating the &lt;STRONG&gt;Subtitle&lt;/STRONG&gt; allows us to provide "semantic markup" and better control the formatting and layout of this content.&lt;/P&gt;
&lt;P&gt;To highlight these various fields, I create rectangles with corresponding text and fill them with a very light red (&lt;STRONG&gt;Tint 35%&lt;/STRONG&gt;) and again set the transparency to &lt;STRONG&gt;30%&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;We now have a "wireframe" that shows the various portions of the page with just enough visibility of the underlying content to understand what each portion refers to.&lt;/P&gt;
&lt;DIV class=image&gt;&lt;IMG class=screenshot title="" alt="" src="http://blogs.msdn.com/photos/jjameson/images/9805329/460x375.aspx" width=460 height=375 mce_src="http://blogs.msdn.com/photos/jjameson/images/9805329/460x375.aspx"&gt; 
&lt;DIV class=caption&gt;Figure 2: "Generic" page (Page Layout)&lt;/DIV&gt;
&lt;DIV class=imageLink&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9805329/original.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/jjameson/images/9805329/original.aspx"&gt;See full-sized image.&lt;/A&gt; &lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Here is another example, based on a press release.&lt;/P&gt;
&lt;DIV class=image&gt;&lt;IMG class=screenshot title="" alt="" src="http://blogs.msdn.com/photos/jjameson/images/9805332/383x480.aspx" width=383 height=480 mce_src="http://blogs.msdn.com/photos/jjameson/images/9805332/383x480.aspx"&gt; 
&lt;DIV class=caption&gt;Figure 3: Sample Press Release&lt;/DIV&gt;
&lt;DIV class=imageLink&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9805332/original.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/jjameson/images/9805332/original.aspx"&gt;See full-sized image.&lt;/A&gt; &lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Figure 4 shows the corresponding page layout.&lt;/P&gt;
&lt;DIV class=image&gt;&lt;IMG class=screenshot title="" alt="" src="http://blogs.msdn.com/photos/jjameson/images/9805335/369x480.aspx" width=369 height=480 mce_src="http://blogs.msdn.com/photos/jjameson/images/9805335/369x480.aspx"&gt; 
&lt;DIV class=caption&gt;Figure 4: Press Release (Page Layout)&lt;/DIV&gt;
&lt;DIV class=imageLink&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9805335/original.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/jjameson/images/9805335/original.aspx"&gt;See full-sized image.&lt;/A&gt; &lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Note the importance of choosing good sample pages when mocking up the wireframes for page layouts. I chose the example press release above based on the fact that it had "additional contact" information. In other words, all press releases have primary contact information (which I chose to map to the out-of-the-box &lt;STRONG&gt;Contact Name&lt;/STRONG&gt;, &lt;STRONG&gt;Contact Phone&lt;/STRONG&gt;, and &lt;STRONG&gt;Contact E-mail Address &lt;/STRONG&gt;fields), but only some press releases have additional contacts -- which may consist of one more more individuals. Rather than attempting to create separate fields for each individual's name, phone number, and e-mail address, we chose to simply provide a single field for greater flexibility.&lt;/P&gt;
&lt;P&gt;Some pages may be comprised of both fields and Web Parts. For example, consider the following product detail page.&lt;/P&gt;
&lt;DIV class=image&gt;&lt;IMG class=screenshot title="" alt="" src="http://blogs.msdn.com/photos/jjameson/images/9805339/436x480.aspx" width=436 height=480 mce_src="http://blogs.msdn.com/photos/jjameson/images/9805339/436x480.aspx"&gt; 
&lt;DIV class=caption&gt;Figure 5: Sample product detail page&lt;/DIV&gt;
&lt;DIV class=imageLink&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9805332/original.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/jjameson/images/9805332/original.aspx"&gt;See full-sized image.&lt;/A&gt; &lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;In this scenario, the "Buy Zone" and "Announcements" features are both implemented as individual Web Parts (due to the dynamic nature of this content). Figure 6 shows the corresponding page layout, highlighting the Web Parts in a different color.&lt;/P&gt;
&lt;DIV class=image&gt;&lt;IMG class=screenshot title="" alt="" src="http://blogs.msdn.com/photos/jjameson/images/9805427/427x480.aspx" width=427 height=480 mce_src="http://blogs.msdn.com/photos/jjameson/images/9805427/427x480.aspx"&gt; 
&lt;DIV class=caption&gt;Figure 7: Product Detail (Page Layout)&lt;/DIV&gt;
&lt;DIV class=imageLink&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9805427/original.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/jjameson/images/9805427/original.aspx"&gt;See full-sized image.&lt;/A&gt; &lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Wireframes like these are valuable when you are trying to define the various content types and page layouts, as well as when it comes time to document your various feature specs. So the next time you start a SharePoint project -- or any Web development project for that matter -- I recommend creating a &lt;STRONG&gt;Screenshots&lt;/STRONG&gt; library right from the start and adding artifacts like these. I also keep a copy of the Visio file (typically named Models - Page Layouts.vsd) so I can quickly make changes as the content types and page layouts evolve over time.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9805438" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jjameson/archive/tags/My+System/default.aspx">My System</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/MOSS+2007/default.aspx">MOSS 2007</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx">Web Development</category></item><item><title>Configuring Logging in ASP.NET Applications (and SharePoint)</title><link>http://blogs.msdn.com/jjameson/archive/2009/06/18/configuring-logging-in-asp-net-applications-and-sharepoint.aspx</link><pubDate>Fri, 19 Jun 2009 04:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9777795</guid><dc:creator>Jeremy Jameson</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jjameson/comments/9777795.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jjameson/commentrss.aspx?PostID=9777795</wfw:commentRss><description>&lt;P&gt;This post continues on the original post for my &lt;A href="http://blogs.msdn.com/jjameson/archive/2009/06/18/a-simple-but-highly-effective-approach-to-logging.aspx" mce_href="http://blogs.msdn.com/jjameson/archive/2009/06/18/a-simple-but-highly-effective-approach-to-logging.aspx"&gt;simple, but highly effective approach to logging&lt;/A&gt; and the follow-up post which introduced &lt;A href="http://blogs.msdn.com/jjameson/archive/2009/06/18/configuring-logging-in-a-console-application.aspx" mce_href="http://blogs.msdn.com/jjameson/archive/2009/06/18/configuring-logging-in-a-console-application.aspx"&gt;configuring logging for console applications&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Obviously not all solutions are simple console-based applications. With ASP.NET Web services and applications -- including Microsoft Office SharePoint Server (MOSS) and Windows SharePoint Services (WSS) -- you can still view log messages from the &lt;CODE&gt;Logger&lt;/CODE&gt; class very easily on a per-request basis.&lt;/P&gt;
&lt;P&gt;Note that the &lt;A href="http://msdn.microsoft.com/en-us/library/system.web.webpagetracelistener.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.web.webpagetracelistener.aspx"&gt;System.Web.WebPageTraceListener&lt;/A&gt; can be specified in Web.config to enable logging to the ASP.NET tracing feature:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;CODE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;  &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;system.diagnostics&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;sources&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;source&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;defaultTraceSource&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;switchName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;allTraceLevel&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
        &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;listeners&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
          &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;add&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;webPageTraceListener&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; /&amp;gt;
        &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;listeners&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
      &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;source&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
    &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;sources&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;sharedListeners&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;add&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;type&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;System.Web.WebPageTraceListener, System.Web, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&lt;/SPAN&gt;"
&lt;SPAN style="COLOR: #ff0000"&gt;        name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;webPageTraceListener&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;traceOutputOptions&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;None&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; /&amp;gt;
    &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;sharedListeners&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;switches&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;add&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;allTraceLevel&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;All&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; /&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;add&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;verboseTraceLevel&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;Verbose&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; /&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;add&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;infoTraceLevel&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;Info&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; /&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;add&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;warningTraceLevel&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;Warning&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; /&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;add&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;errorTraceLevel&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;Error&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; /&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;add&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;offTraceLevel&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;Off&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; /&amp;gt;
    &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;switches&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
  &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;system.diagnostics&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/CODE&gt;&lt;/DIV&gt;
&lt;P&gt;Also note that ASP.NET tracing must be enabled using the &lt;CODE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;trace&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt; element within &lt;CODE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;system.web&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/CODE&gt;:&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;CODE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;  &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;system.web&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;trace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;enabled&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;true&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;pageOutput&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;requestLimit&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;50&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;localOnly&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt;true&lt;/SPAN&gt;"&lt;SPAN style="COLOR: #0000ff"&gt; /&amp;gt;
  &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;system.web&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/CODE&gt;&lt;/DIV&gt;
&lt;P&gt;Be sure to set the &lt;CODE&gt;&lt;SPAN style="COLOR: #ff0000"&gt;requestLimit&lt;/SPAN&gt;&lt;/CODE&gt; high enough to enable access to the page trace you are interested, but also be aware that you can easily clear the captured traces and then browse to the page of interest again.&lt;/P&gt;
&lt;P&gt;Once configured, browse to the page on the site. Then modify the URL to browse to Trace.axd (e.g. &lt;A href="http://fabrikam-local/Trace.axd" mce_href="http://fabrikam-local/Trace.axd"&gt;http://fabrikam-local/Trace.axd&lt;/A&gt;) to display the Trace Viewer.&lt;/P&gt;
&lt;DIV class=image&gt;&lt;IMG title="" alt="" src="http://blogs.msdn.com/photos/jjameson/images/9776165/500x223.aspx" width=500 height=223 mce_src="http://blogs.msdn.com/photos/jjameson/images/9776165/500x223.aspx"&gt; 
&lt;DIV class=caption&gt;Figure 1: ASP.NET Trace Viewer&lt;/DIV&gt;
&lt;DIV class=imageLink&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9776165/original.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/jjameson/images/9776165/original.aspx"&gt;See full-sized image.&lt;/A&gt; &lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Locate the request that you want to view log messages for and click the corresponding &lt;STRONG&gt;View Details &lt;/STRONG&gt;link.&lt;/P&gt;
&lt;DIV class=image&gt;&lt;IMG title="" alt="" src="http://blogs.msdn.com/photos/jjameson/images/9776168/379x480.aspx" width=379 height=480 mce_src="http://blogs.msdn.com/photos/jjameson/images/9776168/379x480.aspx"&gt; 
&lt;DIV class=caption&gt;Figure 2: ASP.NET Trace Viewer&lt;/DIV&gt;
&lt;DIV class=imageLink&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9776168/original.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/jjameson/images/9776168/original.aspx"&gt;See full-sized image.&lt;/A&gt; &lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Notice that the &lt;A href="http://msdn.microsoft.com/en-us/library/system.web.webpagetracelistener.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.web.webpagetracelistener.aspx"&gt;WebPageTraceListener&lt;/A&gt; even formatted the warning message in red. How cool is that?! [For all you SharePoint developers out there, compare this with "diving" into the ULS logs to find an error or warning for a particular page request!]&lt;/P&gt;
&lt;P&gt;Be aware that the Web.config file you use for SharePoint applications varies depending on whether you want to view log messages for a content page or for an application (i.e. _layouts) page. This is covered in my &lt;A href="http://blogs.msdn.com/jjameson/archive/2009/06/18/configuring-logging-in-sharepoint-application-pages.aspx"&gt;next post&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9777795" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jjameson/archive/tags/Simplify/default.aspx">Simplify</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/MOSS+2007/default.aspx">MOSS 2007</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/Core+Development/default.aspx">Core Development</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/WSS+v3/default.aspx">WSS v3</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx">Web Development</category></item><item><title>Internet Explorer 8 Upgrade</title><link>http://blogs.msdn.com/jjameson/archive/2009/03/24/internet-explorer-8-upgrade.aspx</link><pubDate>Tue, 24 Mar 2009 16:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9504163</guid><dc:creator>Jeremy Jameson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jjameson/comments/9504163.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jjameson/commentrss.aspx?PostID=9504163</wfw:commentRss><description>&lt;P&gt;In case you missed the announcement, &lt;A href="http://www.microsoft.com/windows/internet-explorer/default.aspx" mce_href="http://www.microsoft.com/windows/internet-explorer/default.aspx"&gt;Internet Explorer 8&lt;/A&gt; was released last week.&lt;/P&gt;
&lt;P&gt;I'll be honest, I tried one of the early betas of IE8 on a VM a long time ago, but I didn't spend a lot of time with it because it always seemed like there was some more pressing matter that required my attention. As I'm fond of saying, there are typically three levels of issues that get piled on my plate: hot, hotter, and thermonuclear!&lt;/P&gt;
&lt;P&gt;This past weekend, I upgraded 3 of my 10 &lt;EM&gt;active&lt;/EM&gt; "machines" to IE8: my Vista x64 desktop, my Windows Server 2008 x64 laptop, and a Windows Server 2008 x86 VM that I am currently using as my SharePoint development environment. [I say &lt;EM&gt;active&lt;/EM&gt;, because this is the number of physical and virtual machines that I keep running 24x7 in the &lt;A href="http://blogs.msdn.com/jjameson/archive/2009/09/14/the-jameson-datacenter.aspx" mce_href="http://blogs.msdn.com/jjameson/archive/2009/09/14/the-jameson-datacenter.aspx"&gt;"Jameson Datacenter"&lt;/A&gt; -- a.k.a. my home office. No, I still haven't gotten around to running that CAT5 cable from the second floor down to the basement so I can get these portable space heaters -- er, I mean &lt;EM&gt;servers&lt;/EM&gt; -- out of the way.]&lt;/P&gt;
&lt;P&gt;I'll wait for IE8 to be available via Windows Update before upgrading the remaining active machines -- or the countless &lt;EM&gt;inactive&lt;/EM&gt; machines in my inventory (i.e. VMs that haven't been fired up in months or more, but I still keep around for demos and reference material) if and when these are ever fired up again.&lt;/P&gt;
&lt;P&gt;The upgrade from IE7 to IE8 on each of these three machines went without the slightest glitch, and while I can't say that I'm heavily leveraging new features like Accelerators and Web Slices (yet), I must admit that I really like the fact that IE8 is much more Web standards compliant than any previous version of Internet Explorer.&lt;/P&gt;
&lt;P&gt;As I've &lt;A href="http://blogs.msdn.com/jjameson/archive/2008/10/20/fessing-up-about-firefox.aspx" mce_href="http://blogs.msdn.com/jjameson/archive/2008/10/20/fessing-up-about-firefox.aspx"&gt;hinted in the past&lt;/A&gt;, the death of IE6 cannot come soon enough. I'm certainly not the only person to have this opinion. Here are just a few of the dozens of sites dedicated to eradicating IE6:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.stoplivinginthepast.com/" mce_href="http://www.stoplivinginthepast.com"&gt;http://www.stoplivinginthepast.com&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.bringdownie6.com/" mce_href="http://www.bringdownie6.com"&gt;http://www.bringdownie6.com&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://ie6.forteller.net/index.php?title=Main_Page" mce_href="http://ie6.forteller.net/index.php?title=Main_Page"&gt;http://ie6.forteller.net/index.php?title=Main_Page&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.stopie6.com/" mce_href="http://www.stopie6.com"&gt;http://www.stopie6.com&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.stopie6.org/" mce_href="http://www.stopie6.org"&gt;http://www.stopie6.org&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.iedeathmarch.org/" mce_href="http://www.iedeathmarch.org"&gt;http://www.iedeathmarch.org&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;With IE8, I'm also digging the fact that tabs are grouped by color to indicate which tabs were opened from a particular page. I have a habit of doing an Internet search and then using &lt;KBD&gt;CTRL+&lt;/KBD&gt;click to quickly open the top 3-5 results so I can scan them for the information I am looking for. By highlighting the tabs with various colors, it gives this scenario an improved user experience (for example, it is very easy to quickly close tabs that I no longer want open).&lt;/P&gt;
&lt;P&gt;I've also started using some of the &lt;A href="http://msdn.microsoft.com/en-us/library/dd565628(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd565628(VS.85).aspx"&gt;IE8 Developer Tools&lt;/A&gt; -- and I must say these are a vast improvement over the previous IE Developer Toolbar. However, it's much too early to say whether you'll be able to pry &lt;A href="http://blogs.msdn.com/jjameson/archive/2008/10/20/fessing-up-about-firefox.aspx" mce_href="http://blogs.msdn.com/jjameson/archive/2008/10/20/fessing-up-about-firefox.aspx"&gt;Firefox and its various add-ons&lt;/A&gt; out of my toolbox ;-)&lt;/P&gt;
&lt;P&gt;[Update 2009-03-25: Yesterday I forgot to mention another vastly improved feature in IE8.&lt;/P&gt;
&lt;P&gt;I tend to use &lt;KBD&gt;CTRL+F&lt;/KBD&gt; frequently to find a particular string on a page (error messages, method names, etc.). When compared with Firefox, the user experience of the "Find on this page" feature in versions prior to IE8&amp;nbsp;left a little to be desired -- to put it mildly.&lt;/P&gt;
&lt;P&gt;Prior to IE8, your could &lt;KBD&gt;CTRL+F&lt;/KBD&gt;, start typing your search term, and then press &lt;KBD&gt;Enter&lt;/KBD&gt; to quickly find the specified string on the page; however, if you decided that you wanted to search for something else, then a subsequent &lt;KBD&gt;CTRL+F&lt;/KBD&gt; would only cause the &lt;STRONG&gt;Find&lt;/STRONG&gt; dialog window to get focus, but you couldn't immediately start typing your new search term (because the focus would be on the &lt;STRONG&gt;Next &lt;/STRONG&gt;button).&lt;/P&gt;
&lt;P&gt;Fortunately, this has been overhauled in IE8 by eliminating the &lt;STRONG&gt;Find&lt;/STRONG&gt; dialog altogether and instead integrating this feature into the main window. You can now quickly use &lt;KBD&gt;CTRL+F&lt;/KBD&gt; repeatedly to search for different terms on a page. IE8 even has "hit highlighting" similar to Firefox.]&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9504163" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx">Web Development</category></item><item><title>Fessing Up About Firefox</title><link>http://blogs.msdn.com/jjameson/archive/2008/10/20/fessing-up-about-firefox.aspx</link><pubDate>Mon, 20 Oct 2008 16:27:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9007413</guid><dc:creator>Jeremy Jameson</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jjameson/comments/9007413.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jjameson/commentrss.aspx?PostID=9007413</wfw:commentRss><description>&lt;P&gt;My name is Jeremy, and I'm a Firefox user.&lt;/P&gt;
&lt;P&gt;There, I've said it.&lt;/P&gt;
&lt;P&gt;I know, I know...what am I thinking, a Microsoft employee telling the world that Internet Explorer isn't the end all, be all browser for everyone?!&lt;/P&gt;
&lt;P&gt;Well, first let me clarify a little. I actually do use Internet Explorer as my primary browser. Internet Explorer 7 is a great browser! Although honestly, I cringe whenever I think about the large market share still held by IE6. In my humble opinion, enterprise IT organizations are doing their users a great disservice by not allowing them -- or, heck, even forcing them -- to upgrade to IE7. The improved security alone should be enough to justify upgrading to IE7 as soon as possible.&lt;/P&gt;
&lt;P&gt;Now, I know that there were definitely &lt;EM&gt;some&lt;/EM&gt; compatibility issues with IE7 immediately after its release. For example, all of those "bad" Web applications that were hard-coded to detect version 6, rather than version 6 or later -- but surely all the owners of those Web applications have resolved these issues by now ;-)&lt;/P&gt;
&lt;P&gt;I also acknowledge that IE6 is actually fairly poor -- at least by comparison -- in its support for &lt;A href="http://en.wikipedia.org/wiki/Web_standards" mce_href="http://en.wikipedia.org/wiki/Web_standards"&gt;Web standards&lt;/A&gt;. Anybody who has done any significant amount of Web development can tell you about their own personal frustrations -- er, I mean &lt;EM&gt;experiences&lt;/EM&gt; -- dealing with &lt;A href="http://en.wikipedia.org/wiki/Internet_Explorer_box_model_bug" mce_href="http://en.wikipedia.org/wiki/Internet_Explorer_box_model_bug"&gt;box model hacks&lt;/A&gt; and &lt;A href="http://en.wikipedia.org/wiki/Quirks_mode" mce_href="http://en.wikipedia.org/wiki/Quirks_mode"&gt;quirks mode&lt;/A&gt;. [I can't tell you how much I am looking forward to the improved standards support in IE8.]&lt;/P&gt;
&lt;P&gt;But alas, the purpose of this post is not to rant about IE6 or IE7, but rather to tell you about why I often use Firefox.&lt;/P&gt;
&lt;P&gt;It is true that Firefox currently supports Web standards, um, &lt;EM&gt;differently&lt;/EM&gt; than Internet Explorer -- and as a Web developer, I am responsible for making sure the my pages look great in both Internet Explorer and Firefox (and occasionally other browsers as well). However, that's not the real reason I use Firefox, or at least not the most important reason.&lt;/P&gt;
&lt;P&gt;Why I use Firefox can easily be summed up in one word: &lt;EM&gt;add-ons&lt;/EM&gt;. [Okay, technically speaking that may actually be two words, but...whatever.]&lt;/P&gt;
&lt;P&gt;In the beginning, my dependency on Firefox started with &lt;A href="https://addons.mozilla.org/en-US/firefox/addon/1146" mce_href="https://addons.mozilla.org/en-US/firefox/addon/1146"&gt;Screengrab!&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;However, over time, and especially after I got serious about Web development (such as &lt;A href="http://www.stopdesign.com/articles/throwing_tables/" mce_href="http://www.stopdesign.com/articles/throwing_tables/"&gt;dumping table-based layout&lt;/A&gt; and eliminating &lt;A href="http://en.wikipedia.org/wiki/Spacer_GIF" mce_href="http://en.wikipedia.org/wiki/Spacer_GIF"&gt;spacer GIFs&lt;/A&gt; in favor of pure CSS -- &lt;SPAN class=style1&gt;á&lt;/SPAN&gt; la, Douglas Bowman), I began to rely heavily on other add-ons as well -- in particular, &lt;A href="https://addons.mozilla.org/en-US/firefox/addon/60" mce_href="https://addons.mozilla.org/en-US/firefox/addon/60"&gt;Web Developer&lt;/A&gt; and &lt;A href="https://addons.mozilla.org/en-US/firefox/addon/1843" mce_href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Most recently, I have also added &lt;A href="https://addons.mozilla.org/en-US/firefox/addon/5369" mce_href="https://addons.mozilla.org/en-US/firefox/addon/5369"&gt;YSlow&lt;/A&gt; to my virtual Toolbox (referring to my standard set of tools that I ensure are installed on every laptop, desktop, and VM that I develop on).&lt;/P&gt;
&lt;H3&gt;My Essential Firefox Add-ons&lt;/H3&gt;
&lt;DIV class=imgGallery&gt;
&lt;DIV class=imgGalleryAltItem&gt;
&lt;H4&gt;Screengrab!&lt;/H4&gt;
&lt;DIV class=img&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9004807/original.aspx" mce_href="http://blogs.msdn.com/photos/jjameson/images/9004807/original.aspx"&gt;&lt;IMG src="http://blogs.msdn.com/photos/jjameson/images/9004807/407x375.aspx" mce_src="http://blogs.msdn.com/photos/jjameson/images/9004807/407x375.aspx"&gt;&lt;/A&gt;&lt;/DIV&gt;
&lt;P&gt;When creating feature specs, or other documentation, I often embed screenshots of Web pages.&lt;/P&gt;
&lt;P&gt;Back in the Middle Ages -- or at least before I discovered Screengrab! -- I used to use &lt;KBD&gt;ALT+PRINT SCREEN&lt;/KBD&gt; to get a an image of the page into Microsoft Paint, where I would then trim it as necessary and subsequently copy/paste into a document.&lt;/P&gt;
&lt;P&gt;While this works great for certain pages, it is terrribly inefficient when you want to capture an entire Web page, but the page is too long to fit on screen (in other words, the vertical scrollbar appears in the browser). Believe it or not, I actually used to scroll down, &lt;KBD&gt;ALT+PRINT SCREEN&lt;/KBD&gt; again, and then delicately "append" the new capture to the bottom of the previous capture in Paint! Needless to say, I didn't do this very often, because it could literally take a couple of minutes to repeat this process several times for single page.&lt;/P&gt;
&lt;P&gt;Then I discovered a &lt;A href="http://www.codeproject.com/KB/graphics/IECapture.aspx?fid=192174&amp;amp;df=90&amp;amp;mpp=25&amp;amp;noise=3&amp;amp;sort=Position&amp;amp;view=Quick&amp;amp;fr=101#xx0xx" mce_href="http://www.codeproject.com/KB/graphics/IECapture.aspx?fid=192174&amp;amp;df=90&amp;amp;mpp=25&amp;amp;noise=3&amp;amp;sort=Position&amp;amp;view=Quick&amp;amp;fr=101#xx0xx"&gt;utility on CodeProject&lt;/A&gt; that allowed me to capture the entire Web page all at once. This actually worked fairly well for a while. However, I found that after I upgraded from IE6 to IE7, I frequently encountered the problem where the captured image would be entirely black.&lt;/P&gt;
&lt;P&gt;Shortly thereafter, I found Screengrab! and I've never since looked for anything else. It is extremely "lightweight" and, unlike some of the other screen capture utilities for Firefox, it provides just the essential features:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Capture only the visible portion of the page, the entire page, or just a selected portion&lt;/LI&gt;
&lt;LI&gt;Copy the image to the clipboard or save directly to a PNG file&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;The only quirk that I've noticed is that I can't copy a Web page and paste it directly into Microsoft Office programs. Instead, I still use Paint as an "intermediary" -- which isn't really an issue due to the speed at which this can be accomplished with &lt;KBD&gt;CTRL+V&lt;/KBD&gt; (to paste from Screengrab! into Paint), &lt;KBD&gt;CTRL+C&lt;/KBD&gt; (to copy the entire selection in Paint -- thus replacing the clipboard content), followed by &lt;KBD&gt;CTRL+V&lt;/KBD&gt; (to paste the image into Word or Powerpoint).&lt;/P&gt;&lt;/DIV&gt;
&lt;DIV class=imgGalleryItem&gt;
&lt;H4&gt;Web Developer&lt;/H4&gt;
&lt;DIV class=img&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9004809/original.aspx" mce_href="http://blogs.msdn.com/photos/jjameson/images/9004809/original.aspx"&gt;&lt;IMG src="http://blogs.msdn.com/photos/jjameson/images/9004809/407x375.aspx" mce_src="http://blogs.msdn.com/photos/jjameson/images/9004809/407x375.aspx"&gt;&lt;/A&gt;&lt;/DIV&gt;
&lt;P&gt;Chris Pederick's Web Developer add-on provides a toolbar chock-full of goodies for Web development. Honestly, there are a lot more features in this add-on than I've ever even begun to use. However, I've found it very helpful simply for the following:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Quickly disabling/enabling various browser features, such as caching, JavaScript, cookies, and CSS&lt;/LI&gt;
&lt;LI&gt;Viewing and managing cookies&lt;/LI&gt;
&lt;LI&gt;Resizing the browser window to view a page in standard sizes, such as 1024x768 or (shudder) even 800x600&lt;/LI&gt;
&lt;LI&gt;Outlining specific HTML elements (such as all block level elements) to quickly gain familiarity with the structure of a Web page&lt;/LI&gt;
&lt;LI&gt;Validating HTML, CSS, and JavaScript&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;A long time ago, I tried out the Internet Explorer Developer Toolbar. However, while it worked well with IE6, I subsequently discovered issues after I attempted to install it in IE7. I believe these issues have since been fixed, but honestly I haven't looked at in a few years.&lt;/P&gt;
&lt;P&gt;I am looking forward to the new developer tools in Internet Explorer 8 to see how they stack up to this add-on and Firebug.&lt;/P&gt;&lt;/DIV&gt;
&lt;DIV class=imgGalleryAltItem&gt;
&lt;H4&gt;Firebug&lt;/H4&gt;
&lt;DIV class=img&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9004810/original.aspx" mce_href="http://blogs.msdn.com/photos/jjameson/images/9004810/original.aspx"&gt;&lt;IMG src="http://blogs.msdn.com/photos/jjameson/images/9004810/407x375.aspx" mce_src="http://blogs.msdn.com/photos/jjameson/images/9004810/407x375.aspx"&gt;&lt;/A&gt;&lt;/DIV&gt;
&lt;P&gt;Compared to anything I had ever seen before or since (including the Web Developer toolbars for Firefox and Internet Explorer), Firebug takes Web development to a whole new level.&lt;/P&gt;
&lt;P&gt;If you have used the &lt;STRONG&gt;View Source&lt;/STRONG&gt; feature of your browser more than, say, two or three times, then you owe it to yourself to stop what you are doing immediately (that means reading this post), and downloading Firefox and Firebug.&lt;/P&gt;
&lt;P&gt;Even if you can do without the previous two add-ons I've covered, if you are a Web developer I don't see how you can possibly justify continued ignorance to this beauty of a tool. It is truly amazing!&lt;/P&gt;
&lt;P&gt;Seriously, I'm not even going to attempt to tell you how much Firebug has changed my life -- at least from a Web development perspective.&lt;/P&gt;
&lt;P&gt;Get it. Learn it. Use it. Exploit it.&lt;/P&gt;
&lt;P&gt;It really is that good! You will quickly start to wonder how you ever managed without it.&lt;/P&gt;&lt;/DIV&gt;
&lt;DIV class=imgGalleryItem&gt;
&lt;H4&gt;YSlow&lt;/H4&gt;
&lt;DIV class=img&gt;&lt;A href="http://blogs.msdn.com/photos/jjameson/images/9004811/original.aspx" mce_href="http://blogs.msdn.com/photos/jjameson/images/9004811/original.aspx"&gt;&lt;IMG src="http://blogs.msdn.com/photos/jjameson/images/9004811/283x375.aspx" mce_src="http://blogs.msdn.com/photos/jjameson/images/9004811/283x375.aspx"&gt;&lt;/A&gt;&lt;/DIV&gt;
&lt;P&gt;As I mentioned earlier, I only recently added YSlow to my list of "must have" add-ons.&lt;/P&gt;
&lt;P&gt;Honestly, while I think the "performance report card" that it generates for a particular page to be helpful, the real reason why I consider this add-on to be essential is simply the ubiquitous "stopwatch" that it adds to the status bar in Firefox. With this feature, you no longer have to estimate how long it took to download a particular page on your site. Rather you can see that, for example, the current page took 1.032 seconds to download and render.&lt;/P&gt;
&lt;P&gt;Personally speaking, I think all browsers should include some kind of "stopwatch" feature out-of-the-box (or at least the option to turn it on). It is a fantastic way for team members to quickly answer the question, how is our site doing in terms of performance? I'm certainly not saying this is a replacement for load testing and perf monitoring. It's just a good "finger in the air" kind of thing.&lt;/P&gt;
&lt;P&gt;If a Web page is slow, you can then use the other features of YSlow to quickly investigate the reasons (e.g. large page size, too many external resources that need to be downloaded, etc.).&lt;/P&gt;
&lt;P&gt;Kudos to the Yahoo! development team for packaging up a bunch of their internal tools and best practices and making them easily usable by Web developers around the world.&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=clearBoth&gt;&lt;/DIV&gt;
&lt;H3&gt;Conclusion&lt;/H3&gt;
&lt;P&gt;I want to emphasize again that the intent of this post is not to say that I prefer Firefox over Internet Explorer, because, honestly, I don't.&lt;/P&gt;
&lt;P&gt;To be completely truthful, it's not the Web browser itself that I get excited about, but rather what gets rendered &lt;EM&gt;inside&lt;/EM&gt; the browser that I occasionally find myself saying "wow!" when I see it.&lt;/P&gt;
&lt;P&gt;I do believe in some ways, we were caught flat footed at Microsoft by Firefox and are now playing catch-up with Internet Explorer 8. However, it's very important to keep in mind that competition is a very good thing, especially in technology. It keeps us innovating and fuels our passion of changing the world through software.&lt;/P&gt;
&lt;P&gt;Will the new developer tools in Internet Explorer 8 be enough to win back some of the Web developer market share that we have lost? For that, I guess only time will tell.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9007413" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jjameson/archive/tags/My+System/default.aspx">My System</category><category domain="http://blogs.msdn.com/jjameson/archive/tags/Web+Development/default.aspx">Web Development</category></item></channel></rss>