<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Michael Thomas</title>
        <link>http://geekswithblogs.net/mikethomas/Default.aspx</link>
        <description>asp.net and c#</description>
        <language>en-US</language>
        <copyright>Michael Thomas</copyright>
        <managingEditor>mbthomas@gmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <image>
            <title>Michael Thomas</title>
            <url>http://geekswithblogs.net/images/RSS2Image.gif</url>
            <link>http://geekswithblogs.net/mikethomas/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>technical issues</title>
            <category>asp.net</category>
            <link>http://geekswithblogs.net/mikethomas/archive/2007/01/14/103590.aspx</link>
            <description>Sorry for the brokenness of the last post, I am having trouble posting with .Text Right now I can't post more than 1800ish bytes...
&lt;br /&gt;&lt;br /&gt;
&lt;span class="edit"&gt;[EDIT] I found the solution to the problem. I started investigating with &lt;a href="http://www.wireshark.org/"&gt;Wireshark&lt;/a&gt; and the traffic looked odd - not normal HTTP packets - almost as if it were encrypted.  So, on a gut feeling I tried posting using https://geekswithblogs.net/mikethomas/admin/EditPosts.aspx rather than http://geekswithblogs.net/mikethomas/admin/EditPosts.aspx and all now seems to work.&lt;/span&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=103590"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=103590" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/mikethomas/aggbug/103590.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Michael Thomas</dc:creator>
            <guid>http://geekswithblogs.net/mikethomas/archive/2007/01/14/103590.aspx</guid>
            <pubDate>Sun, 14 Jan 2007 22:49:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/mikethomas/comments/103590.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/mikethomas/archive/2007/01/14/103590.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/mikethomas/comments/commentRss/103590.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/mikethomas/services/trackbacks/103590.aspx</trackback:ping>
        </item>
        <item>
            <title>Custom auto-bound Drop Down List</title>
            <category>asp.net</category>
            <link>http://geekswithblogs.net/mikethomas/archive/2007/01/15/103686.aspx</link>
            <description>&lt;p&gt;I am currently working or a project that, like many projects has many sets of code values.  Some examples of code values in the project that I am working on would be Call Results, Degree Types, or Genders.  On the UI of this project these are (generally) represented as drop down lists.  In order to create a more consistent development environment, I decided to create a CodeDropDownList.  This is a custom control, extending a System.Web.UI.WebControls.DropDownList that has one extra parameter: 
CodeName.  The goal is to be able to do something like &amp;lt;mike:CodeDropDownList runat=”server” id=”ddlGender” CodeName=”Gender” /&amp;gt; and have the drop down list auto populated with (“Male”, “Female”).&lt;/p&gt; &lt;p&gt; There are a few issues that you need to be aware of:
&lt;ol&gt;
&lt;li&gt;Where to put your data loading code.&lt;/li&gt; &lt;li&gt;How to cause the “DataBind” method to be called when it should be called.&lt;/li&gt; &lt;li&gt;Performance improvements.&lt;/li&gt; &lt;/ol&gt;

&lt;h2&gt;Where to load the data&lt;/h2&gt;
&lt;p&gt;The ideal time to load the data, is right before the list is DataBound.  I accomplish this by overriding the DataBind method of the DropDownList with something like:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DataBind() {
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlConnection conn = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlConnection(&lt;span class="str"&gt;@"Data Source=.\SQLEXPRESS;Initial Catalog=TestingAjax;Integrated Security=True;"&lt;/span&gt;))
    {
        conn.Open();
        &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = &lt;span class="str"&gt;"code_gender_select"&lt;/span&gt;;
            cmd.CommandType = CommandType.StoredProcedure;

            
            &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlDataReader dtr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataSource = dtr;
                &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataTextField = &lt;span class="str"&gt;"GenderName"&lt;/span&gt;;
                &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataValueField = &lt;span class="str"&gt;"GenderId"&lt;/span&gt;;

                &lt;span class="kwrd"&gt;base&lt;/span&gt;.DataBind();
            }
        }
    }   
}
&lt;/pre&gt;
&lt;p&gt;I have changed this to use generic ADO.NET database access rather than any framework so that his will be as easy to understand (and dependant free) as possible.&lt;/p&gt;

&lt;p&gt;The problem with this is that it does not work.  When a page loads with this custom control on it the control is not databound, unless it is inside another databound control.&lt;/p&gt;

&lt;h2&gt;How to get this to work correctl&lt;/h2&gt;

&lt;p&gt;To resolve this issue I used the &lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;Reflector&lt;/a&gt; and looked at what was causing this problem.  The method at fault ended up being the EnsureDataBound() method in the BaseDataList class.  &lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; EnsureDataBound() {
      &lt;span class="kwrd"&gt;try&lt;/span&gt;
      {
            &lt;span class="kwrd"&gt;this&lt;/span&gt;._throwOnDataPropertyChange = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.RequiresDataBinding &amp;amp;&amp;amp; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.DataSourceID.Length &amp;gt; 0))
            {
                  &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataBind();
            }
      }
      &lt;span class="kwrd"&gt;finally&lt;/span&gt;
      {
            &lt;span class="kwrd"&gt;this&lt;/span&gt;._throwOnDataPropertyChange = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
      }
}
&lt;/pre&gt;

&lt;p&gt;According to Microsoft, the EnsureDataBound method does the following: “Verifies that the data listing control requires data binding and that a valid data source control is specified before calling the DataBind method.”  We can change this method to the following:&lt;/p&gt; &lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; EnsureDataBound() {
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.RequiresDataBinding)
        {
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataBind();
        }
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; { }
}
&lt;/pre&gt;

&lt;p&gt;This small change makes everything work great.  &lt;/p&gt; &lt;h2&gt;Performance Improvements&lt;/h2&gt; &lt;p&gt;These code tables represent relatively static data, so a huge performance boost can be gained by caching the data from the database.  The following methods are realtivley self explanatory. 
I use the following class to help cache the data:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DropDownListItm {
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _Text;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Text
    {
        get {&lt;span class="kwrd"&gt;return&lt;/span&gt; _Text;}
    }

    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _Value;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Value
    {
        get {&lt;span class="kwrd"&gt;return&lt;/span&gt; _Value;}
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; DropDownListItm(&lt;span class="kwrd"&gt;string&lt;/span&gt; text, &lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)
    {
        _Text=text;
        _Value=&lt;span class="kwrd"&gt;value&lt;/span&gt;;
    }
}&lt;/pre&gt;

&lt;p&gt;A new method that encapsulates the database access:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; IEnumerable GetDataFromDB() {
    List&amp;lt;DropDownListItm&amp;gt; lItems = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;DropDownListItm&amp;gt;();
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlConnection conn = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlConnection(&lt;span class="str"&gt;@"Data Source=.\SQLEXPRESS;Initial Catalog=TestingAjax;Integrated Security=True;"&lt;/span&gt;))
    {
        conn.Open();
        &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = &lt;span class="str"&gt;"code_gender_select"&lt;/span&gt;;
            cmd.CommandType = CommandType.StoredProcedure;

            
            &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlDataReader dtr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                &lt;span class="kwrd"&gt;while&lt;/span&gt;(dtr.Read())
                {
                    lItems.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; DropDownListItm(dtr[&lt;span class="str"&gt;"GenderName"&lt;/span&gt;].ToString(), dtr[&lt;span class="str"&gt;"GenderId"&lt;/span&gt;].ToString()));
                }
            }
        }
    }

    &lt;span class="kwrd"&gt;return&lt;/span&gt; lItems; }&lt;/pre&gt;

&lt;p&gt;A new method for managing the caching:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; IEnumerable GetDataSource() {
    &lt;span class="kwrd"&gt;string&lt;/span&gt; key = &lt;span class="str"&gt;"CodeDrowDownListTest_"&lt;/span&gt; + CodeName;

    &lt;span class="kwrd"&gt;object&lt;/span&gt; item = Page.Cache.Get(key);
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (item == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        item = GetDataFromDB();
        Page.Cache.Insert(key, item, &lt;span class="kwrd"&gt;null&lt;/span&gt;, System.DateTime.UtcNow.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration);
    }

    &lt;span class="kwrd"&gt;return&lt;/span&gt; (IEnumerable)item; }&lt;/pre&gt;

&lt;p&gt;And finally, our DataBind() method:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DataBind() {
    &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataSource = GetDataSource();
    &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataTextField = &lt;span class="str"&gt;"Text"&lt;/span&gt;;
    &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataValueField = &lt;span class="str"&gt;"Value"&lt;/span&gt;;
    
    &lt;span class="kwrd"&gt;base&lt;/span&gt;.DataBind();
}&lt;/pre&gt;

&lt;p&gt;All these methods and classes exist in the our CodeDropDownList class.&lt;/p&gt;

&lt;p&gt;Full class listing:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;using&lt;/span&gt; System; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Configuration; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Security; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.WebControls; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.WebControls.WebParts;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.HtmlControls; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.SqlClient; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; MikeThomas.CustomControls {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CodeDropDownList : DropDownList
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; CodeName
        {
            get
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (ViewState[&lt;span class="str"&gt;"CodeName"&lt;/span&gt;] != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    &lt;span class="kwrd"&gt;return&lt;/span&gt; ViewState[&lt;span class="str"&gt;"CodeName"&lt;/span&gt;].ToString();
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    &lt;span class="kwrd"&gt;return&lt;/span&gt; String.Empty;
                }
            }

            set { ViewState[&lt;span class="str"&gt;"CodeName"&lt;/span&gt;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }
        }

        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; EnsureDataBound()
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.RequiresDataBinding)
                {
                    &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataBind();
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; { }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DataBind()
        {
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataSource = GetDataSource();
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataTextField = &lt;span class="str"&gt;"Text"&lt;/span&gt;;
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataValueField = &lt;span class="str"&gt;"Value"&lt;/span&gt;;
            
            &lt;span class="kwrd"&gt;base&lt;/span&gt;.DataBind();
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; IEnumerable GetDataSource()
        {
            &lt;span class="kwrd"&gt;string&lt;/span&gt; key = &lt;span class="str"&gt;"CodeDrowDownListTest_"&lt;/span&gt; + CodeName;

            &lt;span class="kwrd"&gt;object&lt;/span&gt; item = Page.Cache.Get(key);
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (item == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
            {
                item = GetDataFromDB();
                Page.Cache.Insert(key, item, &lt;span class="kwrd"&gt;null&lt;/span&gt;, System.DateTime.UtcNow.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration);
            }

            &lt;span class="kwrd"&gt;return&lt;/span&gt; (IEnumerable)item;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; IEnumerable GetDataFromDB()
        {
            List&amp;lt;DropDownListItm&amp;gt; lItems = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;DropDownListItm&amp;gt;();
            &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlConnection conn = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlConnection(&lt;span class="str"&gt;@"Data Source=.\SQLEXPRESS;Initial Catalog=TestingAjax;Integrated Security=True;"&lt;/span&gt;))
            {
                conn.Open();
                &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = &lt;span class="str"&gt;"code_gender_select"&lt;/span&gt;;
                    cmd.CommandType = CommandType.StoredProcedure;

                    
                    &lt;span class="kwrd"&gt;using&lt;/span&gt; (SqlDataReader dtr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        &lt;span class="kwrd"&gt;while&lt;/span&gt;(dtr.Read())
                        {
                            lItems.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; DropDownListItm(dtr[&lt;span class="str"&gt;"GenderName"&lt;/span&gt;].ToString(), dtr[&lt;span class="str"&gt;"GenderId"&lt;/span&gt;].ToString()));
                        }
                    }
                }
            }

            &lt;span class="kwrd"&gt;return&lt;/span&gt; lItems;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DropDownListItm
        {
            &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _Text;
            &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Text
            {
                get {&lt;span class="kwrd"&gt;return&lt;/span&gt; _Text;}
            }

            &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _Value;
            &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Value
            {
                get {&lt;span class="kwrd"&gt;return&lt;/span&gt; _Value;}
            }

            &lt;span class="kwrd"&gt;public&lt;/span&gt; DropDownListItm(&lt;span class="kwrd"&gt;string&lt;/span&gt; text, &lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)
            {
                _Text=text;
                _Value=&lt;span class="kwrd"&gt;value&lt;/span&gt;;
            }
        }
    }
}&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=103686"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=103686" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/mikethomas/aggbug/103686.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Michael Thomas</dc:creator>
            <guid>http://geekswithblogs.net/mikethomas/archive/2007/01/15/103686.aspx</guid>
            <pubDate>Tue, 16 Jan 2007 03:22:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/mikethomas/comments/103686.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/mikethomas/archive/2007/01/15/103686.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/mikethomas/comments/commentRss/103686.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/mikethomas/services/trackbacks/103686.aspx</trackback:ping>
        </item>
    </channel>
</rss>