<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/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>ShowUsYour&amp;lt;Blog&amp;gt; : Code Snippets</title><link>http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx</link><description>Tags: Code Snippets</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Code to easily create zip files on the fly</title><link>http://weblogs.asp.net/dneimke/archive/2005/02/25/380273.aspx</link><pubDate>Fri, 25 Feb 2005 11:54:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:380273</guid><dc:creator>digory</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=380273</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/02/25/380273.aspx#comments</comments><description>&lt;p&gt;The other day I posted about a free .NET library for creating zip files on 
the fly:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://weblogs.asp.net/dneimke/archive/2005/02/23/378781.aspx"&gt;http://weblogs.asp.net/dneimke/archive/2005/02/23/378781.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here's a little method that I wrote which wraps the functionality of the 
ICSharpCode library to easily&amp;nbsp;package one or more files into a zip 
file.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; WriteZipFile( &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;[] filesToZip, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; writeToFilePath ) {

  &lt;span style="COLOR: blue"&gt;try&lt;/span&gt; {
    &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; ( EnsureDirectory(writeToFilePath) ) {
      
      Crc32 crc = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; Crc32();
      ZipOutputStream s = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; ZipOutputStream(File.Create(writeToFilePath));
      s.SetLevel(&lt;span style="COLOR: maroon"&gt;9&lt;/span&gt;); &lt;span style="COLOR: green"&gt;// 0 - store only to 9 - means best compression
&lt;/span&gt;
      &lt;span style="COLOR: blue"&gt;for&lt;/span&gt;( &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; i=&lt;span style="COLOR: maroon"&gt;0&lt;/span&gt;; i&amp;lt;filesToZip.Length; i++ ) {
      
        &lt;span style="COLOR: green"&gt;// Must use a relative path here so that files show up in the Windows Zip File Viewer
&lt;/span&gt;        &lt;span style="COLOR: green"&gt;// .. hence the use of Path.GetFileName(...)
&lt;/span&gt;        ZipEntry entry = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; ZipEntry(Path.GetFileName(filesToZip[i]));
        entry.DateTime = DateTime.Now;

        &lt;span style="COLOR: green"&gt;// Read in the 
&lt;/span&gt;        &lt;span style="COLOR: blue"&gt;using&lt;/span&gt;(FileStream fs = File.OpenRead(filesToZip[i])) {
  
          &lt;span style="COLOR: blue"&gt;byte&lt;/span&gt;[] buffer = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: blue"&gt;byte&lt;/span&gt;[fs.Length];
          fs.Read(buffer, &lt;span style="COLOR: maroon"&gt;0&lt;/span&gt;, buffer.Length);

          &lt;span style="COLOR: green"&gt;// set Size and the crc, because the information
&lt;/span&gt;          &lt;span style="COLOR: green"&gt;// about the size and crc should be stored in the header
&lt;/span&gt;          &lt;span style="COLOR: green"&gt;// if it is not set it is automatically written in the footer.
&lt;/span&gt;          &lt;span style="COLOR: green"&gt;// (in this case size == crc == -1 in the header)
&lt;/span&gt;          &lt;span style="COLOR: green"&gt;// Some ZIP programs have problems with zip files that don't store
&lt;/span&gt;          &lt;span style="COLOR: green"&gt;// the size and crc in the header.
&lt;/span&gt;          entry.Size = fs.Length;
          fs.Close();
      
          crc.Reset();
          crc.Update(buffer);
          entry.Crc  = crc.Value;
          s.PutNextEntry(entry);
          s.Write(buffer, &lt;span style="COLOR: maroon"&gt;0&lt;/span&gt;, buffer.Length);
        }
      }
  
      s.Finish();
      s.Close();
    }
  } 
  &lt;span style="COLOR: blue"&gt;catch&lt;/span&gt;( Exception ex ) {
    HttpContext.Current.Trace.Warn( ex.ToString() ) ;
  }
}&lt;/pre&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=380273" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category></item><item><title>Nested sub-queries always elude me</title><link>http://weblogs.asp.net/dneimke/archive/2005/02/24/379539.aspx</link><pubDate>Thu, 24 Feb 2005 12:28:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:379539</guid><dc:creator>digory</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=379539</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/02/24/379539.aspx#comments</comments><description>
&lt;p&gt;Tonight I was writing the stored procedure which will return lists of data to 
the Codewise nighly updates.&amp;nbsp; Basically, each night, Codewise will call a 
webservice and you need to return a list of all GUID's which have been either 
ADDED, UPDATED or REMOVED since the last time they called your service.&amp;nbsp; 
The return Xml will look something like this:&lt;/p&gt;&lt;font face="Courier New" size="1"&gt;&lt;pre&gt;&lt;font size="2"&gt;  &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;ContentItemIds&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;Added&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;Guid&lt;/span&gt; ... /&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="COLOR: maroon"&gt;Added&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;Updated&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;Guid&lt;/span&gt; ... /&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="COLOR: maroon"&gt;Updated&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;Removed&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;Guid&lt;/span&gt; ... /&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="COLOR: maroon"&gt;Removed&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="COLOR: maroon"&gt;ContentItemIds&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;&lt;br&gt;I wanted to have a stored procedure that I could pass a "type" and a 
start date and get back a list of Guids that have changed to that type since the 
starting date.&amp;nbsp; This kind of Sql is often munged-up as a string and Exec'd 
back to the caller.&amp;nbsp; I'm not a big fan of sql strings in the middle-tier or 
building strings in the database so I thought that I'd find a straight sql 
approach.&amp;nbsp; I was trying the following query which was failing:&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;pre&gt;SELECT CASE 
    WHEN @diffType = &lt;span style="COLOR: maroon"&gt;1&lt;/span&gt; AND [CreationDate] &amp;gt; @beginDate THEN [GUID]
    WHEN @diffType = &lt;span style="COLOR: maroon"&gt;2&lt;/span&gt; AND [LastUpdatedDate] &amp;gt; @beginDate THEN [GUID]
    WHEN @diffType = &lt;span style="COLOR: maroon"&gt;3&lt;/span&gt; AND [RemovedDate] &amp;gt; @beginDate THEN [GUID]
END As [GUID]
FROM dbo.Codewise_ContentItem
WHERE &lt;span style="COLOR: maroon"&gt;1&lt;/span&gt; IS NOT NULL&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;So, I pinged &lt;a href="http://weblogs.asp.net/tjohansen"&gt;Thomas&lt;/a&gt; who 
whipped up&amp;nbsp;the following&amp;nbsp;pre-breakfast solution:&lt;/p&gt;&lt;pre&gt;SELECT [GUID]
FROM dbo.Codewise_ContentItem
WHERE [GUID] IN (
    SELECT 
        CASE 
            WHEN @diffType = &lt;span style="COLOR: maroon"&gt;1&lt;/span&gt; AND [CreationDate] &amp;gt; @beginDate THEN [GUID]
            WHEN @diffType = &lt;span style="COLOR: maroon"&gt;2&lt;/span&gt; AND [LastUpdatedDate] &amp;gt; @beginDate THEN [GUID]
            WHEN @diffType = &lt;span style="COLOR: maroon"&gt;3&lt;/span&gt; AND [RemovedDate] &amp;gt; @beginDate THEN [GUID]
        END As [GUID]
    FROM dbo.Codewise_ContentItem
)&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=379539" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Codewise/default.aspx">Codewise</category></item><item><title>Zip'ping files</title><link>http://weblogs.asp.net/dneimke/archive/2005/02/23/378781.aspx</link><pubDate>Wed, 23 Feb 2005 13:17:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:378781</guid><dc:creator>digory</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=378781</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/02/23/378781.aspx#comments</comments><description>&lt;p&gt;Tonight I was using the ICSharpCode zip library to zip files for my Codewise 
implementation.&amp;nbsp; Basically, when users nominate to make a Relase visible to 
Codeshare, I create a manifest file and package it and the Release file into a 
Codewise package.&lt;/p&gt;
&lt;p&gt;I ran the code which comes in the .chm file but, noticed that my .zip files 
wouldn't show any content when viewing them through the default Windows Zip File 
viewer.&amp;nbsp; I little bit of investigation led me to the FAQ site for the 
library which answered my question.&amp;nbsp; Basically, you cannot pass a fullpath 
to the ZipEntry class if you want it to be visible to Windows.&amp;nbsp; So, you 
just remove the path portion of the filename:&lt;/p&gt;&lt;pre&gt;ZipEntry entry = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; ZipEntry(&lt;strong&gt;&lt;font style="BACKGROUND-COLOR: yellow"&gt;Path.GetFileName&lt;/font&gt;&lt;/strong&gt;(fullPath)); &lt;/pre&gt;
&lt;hr&gt;
ICSharpCode Zip Library:&amp;nbsp; &lt;a href="http://www.icsharpcode.net/OpenSource/SharpZipLib"&gt;www.icsharpcode.net/OpenSource/SharpZipLib&lt;/a&gt;&lt;br&gt;FAQ 
Wiki: &lt;a href="http://wiki.sharpdevelop.net/default.aspx/SharpZipLib.FrequentlyAskedQuestions"&gt;http://wiki.sharpdevelop.net/default.aspx/SharpZipLib.FrequentlyAskedQuestions&lt;/a&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=378781" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Tools/default.aspx">Tools</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category></item><item><title>Koders - searchable repository of code snippets</title><link>http://weblogs.asp.net/dneimke/archive/2005/01/24/359374.aspx</link><pubDate>Mon, 24 Jan 2005 10:14:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:359374</guid><dc:creator>digory</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=359374</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/01/24/359374.aspx#comments</comments><description>&lt;p&gt;Found this site via &lt;a title="" href="http://notgartner.com/" &gt;Mitch&lt;/a&gt;'s blog:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.koders.com/"&gt;http://www.koders.com/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=359374" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Bookmarks/default.aspx">Bookmarks</category></item><item><title>Using metadata and reflection to dynamically manage message routing</title><link>http://weblogs.asp.net/dneimke/archive/2005/01/20/357029.aspx</link><pubDate>Thu, 20 Jan 2005 08:40:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:357029</guid><dc:creator>digory</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=357029</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/01/20/357029.aspx#comments</comments><description>&amp;nbsp;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;Most 
routing systems have a transformation phase where, based on its current state, a 
message is transformed into a document and routed to an endpoint.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Systems such as BizTalk provide GUI's 
and designers to remove the need for cumbersome coding by making the rules and 
subsequent transformations configurable; here's an example of a switch statement 
in a listener class where the rules of the routing engine are hard-coded:&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; MessageArrived( Message message ) {&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;switch&lt;/span&gt;( 
message.MessageState ) {&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;case&lt;/span&gt; 
MessageState.Initial:&lt;br&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Console.Write( 
Transformer.CreateRequest( message ) );&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;break&lt;/span&gt; ;&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;case&lt;/span&gt; 
MessageState.Submitted:&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;/span&gt;Console.Write( Transformer.CreateApproval( message ) );&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;break&lt;/span&gt; ;&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;case&lt;/span&gt; 
MessageState.Approved:&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;/span&gt;Console.Write( Transformer.CreateInvoice( message ) );&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;break&lt;/span&gt; ;&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;case&lt;/span&gt; 
MessageState.Saved:&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;/span&gt;Console.Write( Transformer.CreateReport( message ) );&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;break&lt;/span&gt; ;&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;default&lt;/span&gt;:&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;/span&gt;Console.Write( Notifier.NotifyError( message ) );&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;break&lt;/span&gt; ;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;}&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;If 
there's extra "noise" in the MessageArrived method, it can become hard to 
maintain as the length of the switch gets longer.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;It can also become hard to maintain if 
there are repetitive code chunks within each case.&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;In 
the above cases you can - at a moderate performance cost - re-factor the common 
code away into a generic method.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; 
&lt;/span&gt;Looking at the above example, one neat way to achieve this is to ascribe 
metadata to the MessageState enum so that it can be inspected at runtime and the 
routing lookup driven from that metadata.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; 
&lt;/span&gt;First, let's create an attribute to contain our lookup data and add it to 
the MessageState enum:&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;[AttributeUsage(AttributeTargets.Field, 
Inherited=&lt;span style="COLOR: maroon"&gt;false&lt;/span&gt;, AllowMultiple=&lt;span style="COLOR: maroon"&gt;true&lt;/span&gt;)]&lt;br&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; 
&lt;span style="COLOR: blue"&gt;class&lt;/span&gt; WorkflowAttribute : Attribute {&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;public&lt;/span&gt; 
WorkflowAttribute(Type type, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; methodName) 
{&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this&lt;/span&gt;.Type = type 
;&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this&lt;/span&gt;.MethodName = 
methodName ;&lt;br&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;public&lt;/span&gt; 
Type Type;&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; 
&lt;/span&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; MethodName 
;&lt;br&gt;}&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;br&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;enum&lt;/span&gt; 
MessageState : &lt;span style="COLOR: blue"&gt;short&lt;/span&gt; {&lt;br&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;[WorkflowAttribute(&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(Transformer), &lt;span style="COLOR: maroon"&gt;"CreateRequest"&lt;/span&gt;)]&lt;br&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Initial = &lt;span style="COLOR: maroon"&gt;1&lt;/span&gt;,&lt;br&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;[WorkflowAttribute(&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(Transformer), &lt;span style="COLOR: maroon"&gt;"CreateApproval"&lt;/span&gt;)]&lt;br&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Submitted = &lt;span style="COLOR: maroon"&gt;2&lt;/span&gt;,&lt;br&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;[WorkflowAttribute(&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(Transformer), &lt;span style="COLOR: maroon"&gt;"CreateInvoice"&lt;/span&gt;),&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;WorkflowAttribute(&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(Notifier), &lt;span style="COLOR: maroon"&gt;"NotifySalesGuy"&lt;/span&gt;)]&lt;br&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Approved = &lt;span style="COLOR: maroon"&gt;3&lt;/span&gt;,&lt;br&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;[WorkflowAttribute(&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(Transformer), &lt;span style="COLOR: maroon"&gt;"CreateReport"&lt;/span&gt;)]&lt;br&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Saved = &lt;span style="COLOR: maroon"&gt;4&lt;/span&gt;,&lt;br&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;[WorkflowAttribute(&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(Notifier), &lt;span style="COLOR: maroon"&gt;"NotifyError"&lt;/span&gt;)]&lt;br&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Unknown = &lt;span style="COLOR: blue"&gt;short&lt;/span&gt;.MaxValue&lt;br&gt;}&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;Notice 
that I applied 2 worklow attributes to the MessageState.Submitted enum 
value.&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;Now 
I can re-factor the original MessageArrived method into a generic message 
handler routine:&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; MessageArrived( Message message ) {&lt;br&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;MessageState state = 
message.MessageState ;&lt;br&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; 
&lt;/span&gt;FieldInfo field = state.GetType().GetField(state.ToString()) ;&lt;br&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; 
&lt;/span&gt;object&lt;/span&gt;[] attribs = field.GetCustomAttributes(&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(WorkflowAttribute), &lt;span style="COLOR: maroon"&gt;false&lt;/span&gt;) ;&lt;br&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;for&lt;/span&gt;( 
&lt;span style="COLOR: blue"&gt;int&lt;/span&gt; i=&lt;span style="COLOR: maroon"&gt;0&lt;/span&gt;; 
i&amp;lt;attribs.Length; i++ ) {&lt;br&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;WorkflowAttribute att = 
attribs[i] &lt;span style="COLOR: blue"&gt;as&lt;/span&gt; WorkflowAttribute ;&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;if&lt;/span&gt;( att != &lt;span style="COLOR: blue"&gt;null&lt;/span&gt; ) {&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;/span&gt;MethodInfo method = &lt;span style="COLOR: blue"&gt;null&lt;/span&gt; 
;&lt;br&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if&lt;/span&gt;( 
att.Type.GetMethod(att.MethodName).IsStatic ) {&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;/span&gt;method = att.Type.GetMethod(att.MethodName) ;&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;/span&gt;Console.Write(method.Invoke(&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;, 
&lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: blue"&gt;object&lt;/span&gt;[] 
{message}));&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;}&lt;span style="COLOR: blue"&gt;else&lt;/span&gt;{&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;object&lt;/span&gt; instance = Activator.CreateInstance(att.Type) ;&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;/span&gt;method = instance.GetType().GetMethod(att.MethodName);&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;/span&gt;Console.Write(method.Invoke(instance, &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: blue"&gt;object&lt;/span&gt;[] 
{message}));&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;/span&gt;}&lt;br&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;}&lt;br&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;}&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;I've 
uploaded a working demo of this to &lt;a title="ProjectDistributor" href="http://ProjectDistributor.net" &gt;ProjectDistributor&lt;/a&gt;:&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;a href="http://projectdistributor.net/Releases/Release.aspx?releaseId=82"&gt;http://projectdistributor.net/Releases/Release.aspx?releaseId=82&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=357029" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category></item><item><title>Prototype of a small trackback system</title><link>http://weblogs.asp.net/dneimke/archive/2005/01/09/349237.aspx</link><pubDate>Sat, 08 Jan 2005 21:32:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:349237</guid><dc:creator>digory</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=349237</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/01/09/349237.aspx#comments</comments><description>&lt;p&gt;Last night I prototyped a small trackback system:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://ProjectDistributor.net/"&gt;Project 
Distributor&lt;/a&gt; :: &lt;a href="http://ProjectDistributor.net/Groups/Group.aspx?groupId=3"&gt;MarkItUp &lt;/a&gt;:: 
&lt;a href="http://ProjectDistributor.net/Projects/Project.aspx?projectId=50"&gt;TrackBack 
Prototype &lt;/a&gt;:: &lt;a href="http://ProjectDistributor.net/Releases/Release.aspx?releaseId=65"&gt;1.0.0.0 
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is quick and dirty but it was enough to allow me to understand the 
concept of trackbacks.&amp;nbsp; Code and inspiration was taken from .Text source 
code as well as this fine article:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.wwwcoder.com/main/parentid/262/site/2344/68/default.aspx"&gt;http://www.wwwcoder.com/main/parentid/262/site/2344/68/default.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=349237" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Web+Forms/default.aspx">Web Forms</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category></item><item><title>A couple of Windows Services resources</title><link>http://weblogs.asp.net/dneimke/archive/2004/11/27/270934.aspx</link><pubDate>Sat, 27 Nov 2004 09:47:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:270934</guid><dc:creator>digory</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=270934</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2004/11/27/270934.aspx#comments</comments><description>&lt;p&gt;I've had a couple of Windows Services snippets that I've been meaning to 
"rip-to-blog" for a while now...&lt;/p&gt;
&lt;p&gt;Advanced Installer... a free, advanced MSI creation tool&lt;br&gt;&lt;a href="http://www.advancedinstaller.com/"&gt;http://www.advancedinstaller.com/&lt;/a&gt;&lt;br&gt;&lt;br&gt;Code 
snippet to add a description to your Windows Services (note that, in Whidbey 
this is all exposed via the API)...&lt;/p&gt;&lt;pre style="COLOR: #000000"&gt;&lt;br&gt;&lt;span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right"&gt;1&lt;/span&gt;&lt;font color="#0000ff"&gt;Public&lt;/font&gt; &lt;font color="#0000ff"&gt;Overrides&lt;/font&gt; &lt;font color="#0000ff"&gt;Sub&lt;/font&gt; Install(&lt;font color="#0000ff"&gt;ByVal&lt;/font&gt; stateSaver &lt;font color="#0000ff"&gt;As&lt;/font&gt; System.Collections.IDictionary)
&lt;br&gt;&lt;span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right"&gt;2&lt;/span&gt;	&lt;font color="#0000ff"&gt;MyBase&lt;/font&gt;.Install(stateSaver)
&lt;br&gt;&lt;span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right"&gt;3&lt;/span&gt;	
&lt;br&gt;&lt;span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right"&gt;4&lt;/span&gt;	&lt;font color="#0000ff"&gt;Dim&lt;/font&gt; serviceDescription &lt;font color="#0000ff"&gt;As&lt;/font&gt; Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(&lt;font color="#004884"&gt;"System\CurrentControlSet\Services\" &amp;amp; yourInstaller.ServiceName, True)
&lt;br&gt;&lt;span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right"&gt;5&lt;/span&gt;	
&lt;br&gt;&lt;span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right"&gt;6&lt;/span&gt;	serviceDescription.SetValue("&lt;/font&gt;Description&lt;font color="#004884"&gt;", "&lt;/font&gt;This is the FileMonitorService.")
&lt;br&gt;&lt;span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right"&gt;7&lt;/span&gt;	serviceDescription.Close()
&lt;br&gt;&lt;span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right"&gt;8&lt;/span&gt;&lt;font color="#0000ff"&gt;End&lt;/font&gt; &lt;font color="#0000ff"&gt;Sub&lt;/font&gt;
&lt;br&gt;&lt;span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right"&gt;9&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="media"&gt;[ Currently Playing : Let's Get Lost - Elliott Smith - From a 
Basement on the Hill (02:27) ]&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=270934" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Tools/default.aspx">Tools</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Bookmarks/default.aspx">Bookmarks</category></item><item><title>Some golden rules to adhere by when thinking about features</title><link>http://weblogs.asp.net/dneimke/archive/2004/11/04/251886.aspx</link><pubDate>Wed, 03 Nov 2004 21:09:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:251886</guid><dc:creator>digory</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=251886</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2004/11/04/251886.aspx#comments</comments><description>&lt;p&gt;When we started doing a spec for &lt;a title="ProjectDistributor" href="http://markitup.aspxconnection.com" &gt;ProjectDistributor&lt;/a&gt; Justin and I had some long chats about what features we wanted in and how they would be implemented.&amp;nbsp; In fact, there were dozens of features that we discussed and, as we progressed we found that we needed a better methodology for quickly deciding whether features would be winners or losers.&amp;nbsp; Additionally, we needed a better way to describe new features to one another so that we didn't waste cycles trying to understand what the other person was trying to say.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Justin quickly decided that anything we planned on adding or any new derivations, we should bounce these questions off:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;What problem are we trying to solve (or innovation we are trying to make)?&lt;/li&gt; &lt;li&gt;How do we solve that problem?&lt;/li&gt; &lt;li&gt;What are some existing systems that solve the same problem in the same or different ways?&lt;/li&gt; &lt;li&gt;How is our system different from previous systems and what innovation are we adding? &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;We've found that this allows us to trade the ideas back and forth in an idea oriented way while allowing us to show any innovations in a problem solving way.&lt;/p&gt; &lt;p&gt;We've now decided - based on our success with them - to add these to &lt;a title="ProjectDistributor" href="http://markitup.aspxconnection.com" &gt;ProjectDistributor&lt;/a&gt;.&amp;nbsp; Soon, when adding projects, you will be offered the choice to answer each of these questions.&amp;nbsp; This will allow people who are viewing your project to quickly gain a better understanding of why your tool rocks!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=251886" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Tools/default.aspx">Tools</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/goals2004_5F00_PairProgramming/default.aspx">goals2004_PairProgramming</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/goals2004_5F00_CodeQuality/default.aspx">goals2004_CodeQuality</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/goals2004_5F00_ProjectManagement/default.aspx">goals2004_ProjectManagement</category></item><item><title>ProjectDistributor - online storage for tools and code snippets</title><link>http://weblogs.asp.net/dneimke/archive/2004/10/26/247841.aspx</link><pubDate>Tue, 26 Oct 2004 12:24:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:247841</guid><dc:creator>digory</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=247841</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2004/10/26/247841.aspx#comments</comments><description>&lt;p&gt;&lt;a title="ProjectDistributor" href="http://markitup.aspxconnection.com"&gt;ProjectDistributor&lt;/a&gt; is now pretty stable and nearly feature complete for iteration 1.&amp;nbsp; This application was created as a place to store small or trivial pieces of code.&amp;nbsp; Either code which was expensive to create - such as a prototype - or code which will be useful again in the future - such as a macro, server control or stored procedure. &lt;/p&gt; &lt;p&gt;It's not that clear on the site "yet", but, there are 2 levels of membership on the site: Users and Groups.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Users have the ability to login and use their "User Profile" page to store bookmarks to their favourite online tools.&amp;nbsp; You can view my user profile page here:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://markitup.aspxconnection.com/Users/User.aspx?userId=7"&gt;http://markitup.aspxconnection.com/Users/User.aspx?userId=7&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Once you are a user you are eligible to create a Group.&amp;nbsp; You need a Group to upload and manage your own tools and widgets.&amp;nbsp; If you want a Group just let me know what you'd like the name of your group to be.&amp;nbsp; I need a GroupName - which will form part of the Url for your landing &lt;br /&gt;page and a GroupFriendlyName which will be used as the display name of your group.&amp;nbsp; For example, my group is:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;GroupName&lt;/strong&gt; :&amp;nbsp;&amp;nbsp;&amp;nbsp; MarkItUp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;GroupFriendlyName&lt;/strong&gt; :&amp;nbsp; MarkItUp&lt;/p&gt; &lt;p&gt;And you can see my Groups landing page here:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://markitup.aspxconnection.com/Groups/Group.aspx?groupId=3"&gt;http://markitup.aspxconnection.com/Groups/Group.aspx?groupId=3&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Groups can actually have multiple users and they can be either private or public, likewise, you can have Projects which are private or public.&lt;/p&gt; &lt;p&gt;One of the major drawcards of the site is the WebServices:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://markitup.aspxconnection.com/WebServices/ProjectDistributor.asmx"&gt;http://markitup.aspxconnection.com/WebServices/ProjectDistributor.asmx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;...these could allow you to potentially host your tools (and their source) on &lt;a title="ProjectDistributor" href="http://markitup.aspxconnection.com"&gt;ProjectDistributor&lt;/a&gt; and serve them up on your own site via Webservice calls.&lt;/p&gt; &lt;p&gt;If you'd like to host your tools/widgets/etc on &lt;a title="ProjectDistributor" href="http://markitup.aspxconnection.com"&gt;ProjectDistributor&lt;/a&gt;, create yourself a User account and shoot me an e-mail with your preferred Group details and I'll set it straight up for you.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=247841" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Tools/default.aspx">Tools</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Web+Forms/default.aspx">Web Forms</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category></item><item><title>Project Distributor - new features uploaded.</title><link>http://weblogs.asp.net/dneimke/archive/2004/10/11/240687.aspx</link><pubDate>Mon, 11 Oct 2004 09:56:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:240687</guid><dc:creator>digory</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=240687</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2004/10/11/240687.aspx#comments</comments><description>Tonight I uploaded a new build of my application, you can view it here: &lt;p&gt;&lt;a href="http://markitup.aspxconnection.com/" target="_blank"&gt;http://markitup.aspxconnection.com/&lt;/a&gt; &lt;p&gt;There are 2 cool new features that weren't present previously. &lt;p&gt;1) When you create an account (option available via the Login page) you have the ability to add "Bookmarks" and categorize them. Bookmarks are intended to be a store of all your favourite online tools and widgets. You can bookmark both internal and external projects. When you view an internal project and you are signed in, you will see a "Add to Bookmarks" link. To add external bookmarks and categories, go to your user profile page and add them from there. &lt;p&gt;2) You can now mark Groups/Projects/Releases as "private" and they will only be available to members of your Group. This is a great option if you have a Group which you've made public but you might have a certain project that you only want to be visible to yourself (such as a special Sql script or something). &lt;p&gt;You can start with the Bookmarks immediately by going to the site and creating a User account. To get setup with a Group (which allows you to upload your own projects), create a User account and send me an e-mail requesting a Group.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=240687" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Tools/default.aspx">Tools</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category></item><item><title>How to use the ASP Page Framework</title><link>http://weblogs.asp.net/dneimke/archive/2004/07/28/199291.aspx</link><pubDate>Wed, 28 Jul 2004 03:29:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:199291</guid><dc:creator>digory</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=199291</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2004/07/28/199291.aspx#comments</comments><description>&lt;P&gt;I had a couple of e-mail requests asking me how to use the Classic ASP Page Framework which I discussed in my last blog entry so I thought that I'd make a couple of notes in an attempt to try an clear things up a bit.&amp;nbsp; First, the code for the Framework can be found here:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="http://flws.com.au/AuthenticateModel.html"&gt;http://flws.com.au/AuthenticateModel.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;To use it you include the code in each page as a server-side include and configure the security. &lt;/P&gt;
&lt;P&gt;To configure security you just create a comma-delimited string of pages which should be secured like so:&lt;/P&gt;&lt;PRE class=CodeSnippet&gt;   Application( "MIU_PAGES_TO_SECURE" ) = "Foo.asp, Bar.asp, etc"
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Whenever a user browses to one of those pages they are automagically taken to the login page (if they are not already authenticated). You set the login page via an Application variable too:&lt;/P&gt;&lt;PRE class=CodeSnippet&gt;    Application( "MIU_LOGIN_PATH" ) = "Login.asp"
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If a user successfully logs in they are automagically redirected back to the page that they came from:&lt;/P&gt;&lt;PRE class=CodeSnippet&gt;    ElseIf Me.Page.IsAuthenticationPage And Not Me.User.IsAuthenticated() Then
        FormsAuthentication.RedirectUrl = Request.QueryString( "RedirectUrl" )
    End If
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;When a user logs out you can specify which page they should be re-directed to:&lt;/P&gt;&lt;PRE class=CodeSnippet&gt;    Application( "MIU_DEFAULT_ENTRY_PATH" ) = "Default.asp"
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The framework also has some for RoleBased authentication which you can query off of the current user at anytime like so:&lt;/P&gt;&lt;PRE class=CodeSnippet&gt;    If User.IsInRole( "admin" ) Then
        ' do something based on the admin role
    End If
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=199291" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category></item><item><title>Classic ASP Page Framework</title><link>http://weblogs.asp.net/dneimke/archive/2004/07/28/199217.aspx</link><pubDate>Wed, 28 Jul 2004 00:53:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:199217</guid><dc:creator>digory</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=199217</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2004/07/28/199217.aspx#comments</comments><description>&lt;P&gt;The other day I asked a question on a list about the perf. Implications of using VBScript classes in classic ASP applications.&amp;nbsp; After participating in that thread I was reminded that, a while back I actually wrote an object oriented, event-driven classic ASP Page model which mimics some of the services which are built into the ASP.NET pages - such as Authentication, Users/Identities and Page properties.&amp;nbsp; The page automagically serializes it's state (which could be abstracted by implementing a Provider model).&amp;nbsp; The model also contained an in-built AuthenticationProvider which handles re-directs when secured resources are requested.&lt;/P&gt;
&lt;P&gt;The whole framework weighed in at less than 350 lines of code!&amp;nbsp; You can see the code for it here:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="http://flws.com.au/AuthenticateModel.html"&gt;http://flws.com.au/AuthenticateModel.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;For me one of the big things about abstracting things into object models is that, because people relate to objects well object - such as Person.MiddleName - they enable you to easily build robust frameworks by pushing essential services down a layer.&amp;nbsp; It's only through building reliable frameworks that you can achieve true manageability - especially when project sizes need to be be scalable.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=199217" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Web+Forms/default.aspx">Web Forms</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category></item><item><title>Mixing Server and Client-side - is it hard to be elegant?</title><link>http://weblogs.asp.net/dneimke/archive/2004/05/03/124695.aspx</link><pubDate>Sun, 02 May 2004 13:01:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:124695</guid><dc:creator>digory</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=124695</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2004/05/03/124695.aspx#comments</comments><description>&lt;P&gt;I had to write some functionality for a friend tonight based on the following request :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;When double-clicking on a textbox, toggle the enabled/disabled state of the textbox and, if it's disabled set it's background to red. Also, make sure that the settings persist across postbacks.&lt;/BLOCKQUOTE&gt;
&lt;P&gt;All up the task took about 1/2 an hour to achieve and, I often think that it would be nice if the ASP Team gave us more "hooks" into client side programming to make this stuff easier. I'm not sure that this qualifies as elegant, in fact I'm sure that I'd class it as a dodgy-hack, but, here's what I went for:&lt;/P&gt;&lt;PRE class=codeSnippet&gt;&amp;lt;%@ Page language="c#" %&amp;gt;
&amp;lt;%@ import namespace="System.Drawing" %&amp;gt;
&amp;lt;script runat="server"&amp;gt;
&lt;SPAN class=CSharp_Modifier&gt;private&lt;/SPAN&gt; &lt;SPAN class=CSharp_ValueType&gt;void&lt;/SPAN&gt; btnSubmit_Click(&lt;SPAN class=CSharp_ReferenceType&gt;object&lt;/SPAN&gt; sender, System.EventArgs e)
{
  &lt;SPAN class=CSharp_ReferenceType&gt;string&lt;/SPAN&gt; fields = &lt;SPAN class=CSharp_Keyword&gt;this&lt;/SPAN&gt;.hdnFields.Value ;
   
  &lt;SPAN class=CSharp_Statement&gt;foreach&lt;/SPAN&gt;( Control ctl &lt;SPAN class=CSharp_Statement&gt;in&lt;/SPAN&gt; &lt;SPAN class=CSharp_Keyword&gt;this&lt;/SPAN&gt;.Controls ) 
  {  
    &lt;SPAN class=CSharp_Statement&gt;if&lt;/SPAN&gt;( ctl &lt;SPAN class=CSharp_Keyword&gt;is&lt;/SPAN&gt; HtmlForm ) 
    {
        &lt;SPAN class=CSharp_Statement&gt;foreach&lt;/SPAN&gt;( Control childControl &lt;SPAN class=CSharp_Statement&gt;in&lt;/SPAN&gt; ctl.Controls ) 
        {
            &lt;SPAN class=CSharp_Statement&gt;if&lt;/SPAN&gt;( childControl &lt;SPAN class=CSharp_Keyword&gt;is&lt;/SPAN&gt; TextBox ) 
            {
                &lt;SPAN class=CSharp_ValueType&gt;int&lt;/SPAN&gt; pos = fields.IndexOf( childControl.ID + &lt;SPAN class=CSharp_String&gt;":"&lt;/SPAN&gt; ) ;
                &lt;SPAN class=CSharp_Statement&gt;if&lt;/SPAN&gt;( pos &amp;gt;= 0 ) 
                {
                    &lt;SPAN class=CSharp_ReferenceType&gt;string&lt;/SPAN&gt; state = fields.Substring( pos, fields.IndexOf(';',pos) - pos ) ;
                    &lt;SPAN class=CSharp_Statement&gt;if&lt;/SPAN&gt;( state.Length &amp;gt; 0 ) 
                    {
                        &lt;SPAN class=CSharp_ReferenceType&gt;string&lt;/SPAN&gt; val = state.Split(':')[1] ;
                        ((TextBox) childControl).Text = val ;
                    }
                }
                
                ((TextBox) childControl).Enabled = ( pos == -1 ) ;
                ((TextBox) childControl).BackColor = ( pos &amp;gt;=0 ) ? Color.Red : Color.White ;
            }
        }
    }
  }
}
&amp;lt;/script&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
  &amp;lt;script language="javascript"&amp;gt;
 
    &lt;SPAN class=Javascript_Objects&gt;function&lt;/SPAN&gt; ToggleEnabled( e ) {
        &lt;SPAN class=Javascript_Statements&gt;var&lt;/SPAN&gt; tb = e.children[0] ;
        &lt;SPAN class=Javascript_Statements&gt;var&lt;/SPAN&gt; disabled = !tb.disabled ;
        
        tb.disabled = disabled ;
        tb.style.backgroundColor = ( disabled ) ? &lt;SPAN class=Javascript_String&gt;"Red"&lt;/SPAN&gt; : &lt;SPAN class=Javascript_String&gt;"White"&lt;/SPAN&gt; ; 
        
        &lt;SPAN class=Javascript_Statements&gt;if&lt;/SPAN&gt;( !disabled ) tb.focus() ;
        
        UpdateHiddenField( tb, disabled ) ;
    }
    
    
    &lt;SPAN class=Javascript_Objects&gt;function&lt;/SPAN&gt; UpdateHiddenField( e, disabled ) {
        &lt;SPAN class=Javascript_Statements&gt;var&lt;/SPAN&gt; txt = Form1.hdnFields.value ;
        Form1.hdnFields.value = &lt;SPAN class=Javascript_String&gt;""&lt;/SPAN&gt; ;
    
        &lt;SPAN class=Javascript_Statements&gt;if&lt;/SPAN&gt;( disabled )
            Form1.hdnFields.value = e.id + &lt;SPAN class=Javascript_String&gt;":"&lt;/SPAN&gt; + e.value + &lt;SPAN class=Javascript_String&gt;";"&lt;/SPAN&gt; ;
            
        &lt;SPAN class=Javascript_Statements&gt;var&lt;/SPAN&gt; flds = txt.&lt;SPAN class=Javascript_Methods&gt;split&lt;/SPAN&gt;( &lt;SPAN class=Javascript_String&gt;";"&lt;/SPAN&gt; ) ;
            
        &lt;SPAN class=Javascript_Statements&gt;for&lt;/SPAN&gt;( &lt;SPAN class=Javascript_Statements&gt;var&lt;/SPAN&gt; i=0; i&amp;lt;flds.length; i++ ) {
            &lt;SPAN class=Javascript_Statements&gt;if&lt;/SPAN&gt;( e.id != flds[i].&lt;SPAN class=Javascript_Methods&gt;split&lt;/SPAN&gt;(&lt;SPAN class=Javascript_String&gt;":"&lt;/SPAN&gt;)[0] &amp;amp;&amp;amp; flds[i].length &amp;amp;&amp;amp; flds[i].length &amp;gt; 0 )
                Form1.hdnFields.value += flds[i] + &lt;SPAN class=Javascript_String&gt;";"&lt;/SPAN&gt; ; 
        }
    }
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form id="Form1" method="post" runat="server"&amp;gt;
&amp;lt;input type="hidden" id="hdnFields" runat="server" &amp;gt;
   
&amp;lt;p&amp;gt;
    &amp;lt;span id="foo1" ondblclick="ToggleEnabled( this ) ;"&amp;gt;
        TextBox 1: &amp;lt;asp:textbox id="txtTest1" runat="server" /&amp;gt;
    &amp;lt;/span&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
    &amp;lt;span id="foo2" ondblclick="ToggleEnabled( this ) ;"&amp;gt;
        TextBox 2: &amp;lt;asp:textbox id="txtTest2" runat="server" /&amp;gt;
    &amp;lt;/span&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
    &amp;lt;span id="foo3" ondblclick="ToggleEnabled( this ) ;"&amp;gt;
        TextBox 3: &amp;lt;asp:textbox id="txtTest3" runat="server" /&amp;gt;
    &amp;lt;/span&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
    &amp;lt;span id="foo4" ondblclick="ToggleEnabled( this ) ;"&amp;gt;
        TextBox 4: &amp;lt;asp:textbox id="txtTest4" runat="server" /&amp;gt;
    &amp;lt;/span&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
    &amp;lt;span id="foo5" ondblclick="ToggleEnabled( this ) ;"&amp;gt;
        TextBox 5: &amp;lt;asp:textbox id="txtTest5" runat="server" /&amp;gt;
    &amp;lt;/span&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
    &amp;lt;asp:button id="btnSubmit" onclick="btnSubmit_Click" runat="server" text="Submit" /&amp;gt;
&amp;lt;/p&amp;gt;
   
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/PRE&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=124695" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Web+Forms/default.aspx">Web Forms</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category></item><item><title>How to build a comma-separated list</title><link>http://weblogs.asp.net/dneimke/archive/2004/04/30/123561.aspx</link><pubDate>Fri, 30 Apr 2004 03:23:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:123561</guid><dc:creator>digory</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=123561</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2004/04/30/123561.aspx#comments</comments><description>&lt;P&gt;Dave has an interesting little thread going about how to do build a comma-separated list and what you can do with that annoying, left-over ',':&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="http://weblogs.asp.net/dburke/archive/2004/04/28/122332.aspx"&gt;http://weblogs.asp.net/dburke/archive/2004/04/28/122332.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Who'd've thought that there would be so many options!&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=123561" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/goals2004_5F00_CodeQuality/default.aspx">goals2004_CodeQuality</category></item><item><title>Rotor resources</title><link>http://weblogs.asp.net/dneimke/archive/2004/03/18/91582.aspx</link><pubDate>Thu, 18 Mar 2004 00:35:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:91582</guid><dc:creator>digory</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=91582</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2004/03/18/91582.aspx#comments</comments><description>&lt;P&gt;Recently &lt;A href="http://weblogs.asp.net/Justin_Rogers/"&gt;Justin Rogers&lt;/A&gt; got me enthusiastic about &lt;A href="http://123aspx.com/rotor/default.aspx"&gt;Rotor source code&lt;/A&gt; and today I see that &lt;A href="http://weblogs.asp.net/joelpob"&gt;Joel&lt;/A&gt; has uploaded a list of places where Rotor is discussed:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://weblogs.asp.net/joelpob/archive/2004/03/17/91506.aspx"&gt;http://weblogs.asp.net/joelpob/archive/2004/03/17/91506.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=91582" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Code+Snippets/default.aspx">Code Snippets</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Rotor/default.aspx">Rotor</category></item></channel></rss>