<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Bloodyflux.com</title>
    <description>ASP.NET, AJAX, JavaScript, SQL and SubSonic Articles</description>
    <link>http://www.bloodyflux.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.5.0</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://www.bloodyflux.com/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Bloodyflux.com</dc:creator>
    <dc:title>Bloodyflux.com</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Bloodyfluxcom" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>A Couple Must Read ASP.NET Articles</title>
      <description>&lt;h3&gt;&lt;a href="http://googleajaxsearchapi.blogspot.com/2008/05/speed-up-access-to-your-favorite.html" target="_blank" title="Speed up access to your favorite frameworks via the AJAX Libraries API"&gt;Speed up access to your favorite frameworks via the AJAX Libraries API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;
This is just a fantastic idea. It&amp;#39;s very simple. Use Google&amp;#39;s extensive infrastructure to serve those common JavaScript libraries you love to use. I&amp;#39;ve recently started using jQuery so all I have to do is point the link to the URL provided by Google and that&amp;#39;s 17kb per request my server won&amp;#39;t have to turn out. Thanks, Google!
&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://www.jankoatwarpspeed.com/post/2008/05/22/CSS-Message-Boxes-for-different-message-types.aspx" target="_blank" title="CSS Message Boxes for different message types"&gt;CSS Message Boxes for different message types&lt;/a&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;
This comes from one of the best new sites out there &amp;quot;Janko At Warp Speed&amp;quot;. This article shows us how to handle a few common message types within our applications. It&amp;#39;s all CSS and very sharp!
&lt;/p&gt;
</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/Yp1MR_xv8Jk/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2008/06/10/A-Couple-Must-Read-ASPNET-Articles.aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=d22539e8-f8fb-46a3-9c0a-04b7d2cf6636</guid>
      <pubDate>Tue, 10 Jun 2008 21:13:00 -0300</pubDate>
      <category>ASP.NET</category>
      <category>Tip/Trick</category>
      <category>General</category>
      <category>Javascript</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=d22539e8-f8fb-46a3-9c0a-04b7d2cf6636</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=d22539e8-f8fb-46a3-9c0a-04b7d2cf6636</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2008/06/10/A-Couple-Must-Read-ASPNET-Articles.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=d22539e8-f8fb-46a3-9c0a-04b7d2cf6636</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=d22539e8-f8fb-46a3-9c0a-04b7d2cf6636</feedburner:origLink></item>
    <item>
      <title>A Few Quick Tips to Get More Visitors</title>
      <description>&lt;p&gt;
Its fairly easy to get people to visit your website. All you need is a few dollars for advertising and you can get people on your site. The problem is getting people to actually stay and interact. I would guess that around 1% of the people that arrive from Google advertisements actually stay around and/or come back. That&amp;#39;s not a very good rate if you ask me. Is it worth the money? Not at all. Its just my opinion, but I think using Google Adwords should only be used when you first start up your site and have no other way of becoming visible.&lt;br /&gt;
&lt;br /&gt;
The best way I&amp;#39;ve found to get people to hang around is posting stories on social bookmarking sites like &lt;a href="http://www.dotnetkicks.com" target="_blank"&gt;DotNetKicks&lt;/a&gt;, &lt;a href="http://www.dzone.com" target="_blank"&gt;DZone&lt;/a&gt; and &lt;a href="http://www.digg.com" target="_blank"&gt;Digg&lt;/a&gt;. This is nothing groundbreaking, but you should know that these are wonderful sources of &amp;quot;free&amp;quot; traffic if you don&amp;#39;t already. The visitors tend to stay longer, read related posts and even sign up for your rss feeds. You just never know what&amp;#39;s going to be a &amp;quot;hit&amp;quot; and cause lots of traffic to come your way.&amp;nbsp; I had a &lt;a href="http://www.bloodyflux.com/post/2007/10/5-Reasons-why-SubSonic-is-Better-than-Sliced-Bread.aspx" target="_blank"&gt;story about SubSonic&lt;/a&gt; make the main page on DotNetKicks and DZone at the same time. That was fun and very satisfying.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
I tried &lt;a href="http://www.stumbleupon.com" target="_blank"&gt;StumbleUpon&lt;/a&gt;&amp;#39;s advertising service for another site, &lt;a href="http://www.conservativekicks.com" target="_blank"&gt;ConservativeKicks.com&lt;/a&gt;, but the results were even less &lt;span class="unmark"&gt;impressive&lt;/span&gt; than the Google ads. I recommend these actions when you start a new web site:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Start posting comments on related websites (make sure you have links back to your website in your sig)&lt;/li&gt;
	&lt;li&gt;Buy some Google ad space. You&amp;#39;ve got to get people on your site, but don&amp;#39;t go overboard. Set a daily budget you can afford&lt;/li&gt;
	&lt;li&gt;Post links to your posts on social bookmarking sites. They are the best way to drive traffic to your site&lt;/li&gt;
	&lt;li&gt;Submit your site to StumbleUpon and consider using their paid service because it does drive a lot of traffic to your site and you never know what will make them stay on your site.&lt;/li&gt;
	&lt;li&gt;Make friends with other website owners. Cross-site linking can help everyone &lt;span class="unmark"&gt;involved&lt;/span&gt;.&lt;br /&gt;
	&lt;/li&gt;
&lt;/ul&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.bloodyflux.com%2fpost.aspx%3fid%3ddff2b559-d3fd-4463-b1bf-2e03b82ac036"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.bloodyflux.com%2fpost.aspx%3fid%3ddff2b559-d3fd-4463-b1bf-2e03b82ac036" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/BUg9vjywtlA/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/11/28/The-hardest-part-is-getting-people-to-come-back-to-your-website.aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=dff2b559-d3fd-4463-b1bf-2e03b82ac036</guid>
      <pubDate>Wed, 28 Nov 2007 19:46:00 -0300</pubDate>
      <category>ASP.NET</category>
      <category>SubSonic</category>
      <category>General</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=dff2b559-d3fd-4463-b1bf-2e03b82ac036</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=dff2b559-d3fd-4463-b1bf-2e03b82ac036</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/11/28/The-hardest-part-is-getting-people-to-come-back-to-your-website.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=dff2b559-d3fd-4463-b1bf-2e03b82ac036</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=dff2b559-d3fd-4463-b1bf-2e03b82ac036</feedburner:origLink></item>
    <item>
      <title>3 Open Source Apps I'm Thankful For</title>
      <description>&lt;p&gt;
Its the time of year again (for us in the US) to stuff ourselves even more than usual. I love turkey and all the other traditional Thanksgiving foods. Its a day where I tend to lose all self control.
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;m thankful for the following things (.NET related):&lt;br /&gt;
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;
	&lt;h2&gt;&lt;a href="http://www.subsonicproject.com"&gt;SubSonic &lt;/a&gt;&lt;/h2&gt;The program I use the most by far. I use it in nearly every new project I start. It has saved me an incredible amount of time over the last year. Its all about finding ways of being more productive and eliminating CRUD. I spent too many years coding SQL right into my pages. Bad times. I can&amp;#39;t say too many good things about SubSonic. Its worth using now just to be ready for when its included in some later version of dotnet. &lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;h2&gt;&lt;a href="http://www.dotnetkicks.com" target="_blank"&gt;DotNetKicks&lt;/a&gt;&lt;/h2&gt; The site and the open source software. I&amp;#39;ve been visiting DotNetKicks.com for most of this last year and I consider it to the leading resource for everything dotnet. I love the site and I love the open source software powering it. I liked it so much that I started my own site, &lt;a href="http://www.conservativekicks.com/" target="_blank"&gt;ConservativeKicks.com&lt;/a&gt;, with it. It was a pain to get going, but it was well worth it. It also uses SubSonic so its easy as pie to deal with on the backend.&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;h2&gt;&lt;a href="http://dotnetblogengine.net/" target="_blank"&gt;BlogEngine.NET&lt;/a&gt;&lt;/h2&gt;I use this software for this blog. It was very simple to setup and get going. It has all the features I need and &lt;strong&gt;it just works&lt;/strong&gt;. I suggest giving it a try if you&amp;#39;re looking for a good blogging engine. It doesn&amp;#39;t use SubSonic, but I&amp;#39;m not looking for an application that I&amp;#39;ll need to customize too much. I just want to hit start and write. BlogEngine.NET does that very well. &lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
Happy Thanksgiving, everybody. Be safe and have fun. See you all after the holiday.&amp;nbsp;
</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/7iuphg_zsX4/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/11/21/3-Open-Source-Apps-Im-Thankful-For.aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=fa38090a-1df1-4691-bac5-382398fcb046</guid>
      <pubDate>Wed, 21 Nov 2007 22:17:00 -0300</pubDate>
      <category>ASP.NET</category>
      <category>Open Source</category>
      <category>SubSonic</category>
      <category>General</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=fa38090a-1df1-4691-bac5-382398fcb046</pingback:target>
      <slash:comments>47</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=fa38090a-1df1-4691-bac5-382398fcb046</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/11/21/3-Open-Source-Apps-Im-Thankful-For.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=fa38090a-1df1-4691-bac5-382398fcb046</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=fa38090a-1df1-4691-bac5-382398fcb046</feedburner:origLink></item>
    <item>
      <title>Microsoft Access is Still Extremely Useful</title>
      <description>&lt;p&gt;
Part of my new job has been to automate a few spreadsheets and
joining data from separate systems. I&amp;#39;m much more comfortable working
in ASP.NET, but I have a lot of background with &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Access/" target="_blank"&gt;MS Access&lt;/a&gt; so I don&amp;#39;t
mind at all. In fact its nice to &amp;quot;go back&amp;quot; a little and see how quickly
you can do simple things in Access. You can set up tables, queries and
forms in minutes. The built-in wizards make creating a basic form in a
crunch very easy. The reporting component is extremely powerful. It has
its limitations, of course, but with a little hacking you can get it to
do that &lt;a href="http://en.wikipedia.org/wiki/Gantt_chart/" target="_blank"&gt;Gantt chart&lt;/a&gt; you needed or some crazy conditional formatting if
you must. There haven&amp;#39;t been many times where I&amp;quot;ve had to go outside of Access to build a report. Mostly roll-your-own type of things. 
&lt;/p&gt;
&lt;p&gt;
Its refreshing to jump into Access, create a couple
tables or import data from &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Excel/" target="_blank"&gt;Excel&lt;/a&gt;, run the form creation wizard and your
done. You now have an easy way to navigate through your records and the
ability to change the data within the form.&amp;nbsp; In ASP.NET you&amp;#39;ve got to
jump through a few hoops to get to that point (&lt;a href="http://www.subsonicproject.com/" target="_blank"&gt;SubSonic&amp;#39;s wonders aside&lt;/a&gt;).
Using Access for non-authenticated forms and reports in a pinch is a
fantastic alternative to a full-blown ASP.NET application. Its
unmatched in its RAD capabilities and most people in your office will
already have it installed on their PC.&amp;nbsp;
&lt;/p&gt;
&lt;blockquote&gt;
	Its refreshing to jump into Access, create a couple tables or import data from Excel, run the form creation wizard and your done.
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;p&gt;
There are many times when
creating a web-based application just isn&amp;#39;t possible so using Access to
merge some data is the way I look to go in those cases. Most people are
already familiar with the standard Access forms and reports so the
learning curve is fairly low. Don&amp;#39;t depend on Access as your backend
for a many-user environment because you will be flirting with disaster,
but that wasn&amp;#39;t the reason Access came into being. Use it for what it
was meant for. &lt;strong&gt;Rapid application developement, prototyping and
reporting.&lt;/strong&gt; 
&lt;/p&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f11%2fMicrosoft-Access-is-Still-Extremely-Useful.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f11%2fMicrosoft-Access-is-Still-Extremely-Useful.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/6Y9rUjIvBkk/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/11/12/Microsoft-Access-is-Still-Extremely-Useful.aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=4b0ae1c3-669e-4f5d-b6ab-1666514225f9</guid>
      <pubDate>Mon, 12 Nov 2007 22:15:00 -0300</pubDate>
      <category>SQL</category>
      <category>Database</category>
      <category>MS Access</category>
      <category>General</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=4b0ae1c3-669e-4f5d-b6ab-1666514225f9</pingback:target>
      <slash:comments>15</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=4b0ae1c3-669e-4f5d-b6ab-1666514225f9</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/11/12/Microsoft-Access-is-Still-Extremely-Useful.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=4b0ae1c3-669e-4f5d-b6ab-1666514225f9</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=4b0ae1c3-669e-4f5d-b6ab-1666514225f9</feedburner:origLink></item>
    <item>
      <title>Job Changes are Life Changes</title>
      <description>&lt;div&gt;
&lt;p&gt;
&amp;nbsp;
I started a new job this week after spending four years with my
previous company. I was completely burnt out working crazy hours. I
managed it well enough for the first three years, but in the end it was
just too much stress. I&amp;#39;ve never put this much effort into any other
company I had ever worked for. I actually relocated to another state
for two years when requested to do so. I was given an offer that I
couldn&amp;#39;t refuse thus my soul had been sold. 
&lt;/p&gt;
&lt;div align="center"&gt;
&lt;img src="http://www.ilru.org/html/publications/newsletters/2002/ilnet_Mayburnedout.gif" alt="" width="162" height="229" align="middle" /&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;br /&gt;
You hear this often, but I can tell you for sure that it ts completely correct. &lt;strong&gt;Money isn&amp;#39;t everything. &lt;/strong&gt;You
can&amp;#39;t live without it, true, but happiness it does not bring. You come
to realize that family is the most important thing in life when you&amp;#39;re
away from them for an extended period. We made many trips back home, but it was really exhausting. We finally made the choice to move back home and were lucky enough to do so with the same company.
&lt;/p&gt;
&lt;p&gt;
Avoiding burnout is basically about pressure and time. How
much can you take for how long? This is different for everybody, but
make no mistake that we all have a limit. The difference is some of us
choose to act to change the situation and others find it easier to just
exist as one of the &amp;quot;working dead&amp;quot;. I probably waited a little too long, but in the end it worked out just fine. My new company seems great and my free time has increased.
&lt;/p&gt;
&lt;p&gt;
The way you act
when you come home from work can change dramatically when you have a
rewarding job with lower stress. How much quality time you spend with your family is how
happiness should be defined. Not working till 2am to get some
rediculous deadline met. This will not happen and my new job and I will
be able to spend more time with my family. I hope that anybody out
there reading this who is in a stressful situation at their job takes
this advise: &lt;strong&gt;get out now!&lt;/strong&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f11%2fJob-Changes-are-Life-Changes.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f11%2fJob-Changes-are-Life-Changes.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/-OT1pv-YLIM/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/11/08/Job-Changes-are-Life-Changes.aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=7ba6bafa-fa61-45c4-96c6-3c5389d83593</guid>
      <pubDate>Thu, 08 Nov 2007 00:24:00 -0300</pubDate>
      <category>Life</category>
      <category>General</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=7ba6bafa-fa61-45c4-96c6-3c5389d83593</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=7ba6bafa-fa61-45c4-96c6-3c5389d83593</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/11/08/Job-Changes-are-Life-Changes.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=7ba6bafa-fa61-45c4-96c6-3c5389d83593</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=7ba6bafa-fa61-45c4-96c6-3c5389d83593</feedburner:origLink></item>
    <item>
      <title>Announcing ConservativeKicks.com</title>
      <description>I&amp;#39;ve created a new site called &lt;a href="http://www.conservativekicks.com/" target="_blank"&gt;ConservativeKicks.com&lt;/a&gt; using the &lt;a href="http://www.dotnetkicks.com/" target="_blank"&gt;DotNetKicks&lt;/a&gt; open source project software. For those that don&amp;#39;t know DotNetKicks is software that allows you to create a community driven news and article link site. Its very similar to Digg.com in functionality. You post a story and if you get enough &amp;quot;Kicks&amp;quot; then it will show on the front page where you will get a lot more exposure. Another great feature is that it allows the users posting a story to share 50% of the google ad money. &lt;br /&gt;
&lt;br /&gt;
I launched the site because I noticed a lot of liberal-leaning articles and comments on sites such as Digg.com. I thought it would be a nice balance to have a place where you know you will find conservative news, opinions and articles. For the moment all the ad money is going back to the DotNetKicks to help support them. Please feel free to provide feedback. Comments are always welcome. 
</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/B7VXE_2zANI/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/11/05/Announcing-ConservativeKickscom.aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=8775fae3-b2bd-44a1-97a9-0655668f42b3</guid>
      <pubDate>Mon, 05 Nov 2007 19:39:00 -0300</pubDate>
      <category>General</category>
      <category>Open Source</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=8775fae3-b2bd-44a1-97a9-0655668f42b3</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=8775fae3-b2bd-44a1-97a9-0655668f42b3</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/11/05/Announcing-ConservativeKickscom.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=8775fae3-b2bd-44a1-97a9-0655668f42b3</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=8775fae3-b2bd-44a1-97a9-0655668f42b3</feedburner:origLink></item>
    <item>
      <title>Formal education often means nothing</title>
      <description>&lt;p&gt;
If you have ever been in the position to hire a programmer then chances are
you already agree with me. I&amp;#39;ve been involved in lots of interviews with
candidates for programming/web development jobs. After reviewing a candidate&amp;#39;s
resume it is still difficult to really judge their knowledge. Even if the
candidate has every certification you can think of with tons of education and
the do very well in the interview you still don&amp;#39;t have a good enough idea
whether to hire them or not. I&amp;#39;ve seen people hired with these qualifications,
but when they start working they don&amp;#39;t even know how to connect to a SQL
database or grab code from a Subversion repository.
&lt;/p&gt;
&lt;p&gt;
The best way to judge a candidate, in my opinion, is to see samples of their
work. Hopefully they&amp;#39;ve created their own web site(s) on the side that can
easily show their talents. If not they need to show me work they&amp;#39;ve done at
their previous job. I will never approve of a candidate that I&amp;#39;ve not seen
samples of their work that has been verified as their own. No set of interview
questions can truly replace this. 
&lt;/p&gt;
</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/NTjaTjkLUvw/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/11/02/Formal-education-often-means-nothing.aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=bb0bc6a3-d3a7-43dd-9517-50e33846cf47</guid>
      <pubDate>Fri, 02 Nov 2007 08:47:00 -0300</pubDate>
      <category>General</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=bb0bc6a3-d3a7-43dd-9517-50e33846cf47</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=bb0bc6a3-d3a7-43dd-9517-50e33846cf47</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/11/02/Formal-education-often-means-nothing.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=bb0bc6a3-d3a7-43dd-9517-50e33846cf47</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=bb0bc6a3-d3a7-43dd-9517-50e33846cf47</feedburner:origLink></item>
    <item>
      <title>Howto: Create a Custom Control in ASP.NET (C#)</title>
      <description>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;
Creating custom controls can save you a lot of time and effort when building an application. The built-in sever controls provided can do just about anything you need them to, but sometimes it takes a great deal of coding (hacking) to make it do &lt;strong&gt;exactly&lt;/strong&gt; what you want it to do. Consider the possibility that you need a textbox control that you would like to be able to assign a readony property to it so it either renders as a regular textbox if false or plain text if true. You may also want a textbox that will cause it&amp;#39;s on &amp;quot;OnTextChanged&amp;quot; to bubble up in the &amp;quot;GridViewCommandEvent&amp;quot; of a Gridview control. By default the textbox does not support that. 
&lt;/p&gt;
&lt;h2&gt;Afterwards there will be Cake&lt;/h2&gt;
&lt;p&gt;
Create a new Web Control Library project within the solution you want to add the control to. Here is the location to do so in my Visual Studio installation. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.bloodyflux.com/image.axd?picture=CustomControl1.gif" alt="" /&gt;&lt;br /&gt;
&lt;br /&gt;
Visual Studio has created a file called &amp;quot;WebCustomControl1.cs&amp;quot; within that project. You can rename it to whatever you like. This file is where you can insert the code that I&amp;#39;ll show below. I&amp;#39;m going to show you the entire code right now. I&amp;#39;ve put some comments in to explain what&amp;#39;s going on. Just copy and paste this code inside the cs file.
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI;&lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.WebControls;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kwrd"&gt;namespace&lt;/span&gt; CustomControls.UI.Controls&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; [DefaultProperty(&amp;quot;Text&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; [ToolboxData(&amp;quot;&amp;lt;{0}:CustomTextBox runat=server&amp;gt;&amp;lt;/{0}:CustomTextBox&amp;gt;&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CustomTextBox : TextBox &lt;span class="rem"&gt;//with this you can override all the normal &amp;quot;stuff&amp;quot; within the textbox control&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Here are the properties that will be used for the command event &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Bindable(&lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Category(&amp;quot;Custom&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DefaultValue(&amp;quot;&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Localizable(&lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; CommandName&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;string&lt;/span&gt; s = ViewState[&amp;quot;CommandName&amp;quot;] &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;return&lt;/span&gt; s == &lt;span class="kwrd"&gt;null&lt;/span&gt; ? String.Empty : s;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewState[&amp;quot;CommandName&amp;quot;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Bindable(&lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Category(&amp;quot;Custom&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DefaultValue(&amp;quot;&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Localizable(&lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; CommandArgument&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;string&lt;/span&gt; s = ViewState[&amp;quot;CommandArgument&amp;quot;] &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;return&lt;/span&gt; s == &lt;span class="kwrd"&gt;null&lt;/span&gt; ? String.Empty : s;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewState[&amp;quot;CommandArgument&amp;quot;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Bindable(&lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Category(&amp;quot;Custom&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DefaultValue(&amp;quot;False&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Localizable(&lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; IsReadOnly&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;string&lt;/span&gt; s = ViewState[&amp;quot;IsReadOnly&amp;quot;] &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;return&lt;/span&gt; s == &lt;span class="kwrd"&gt;null&lt;/span&gt; ? String.Empty : s;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewState[&amp;quot;IsReadOnly&amp;quot;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; EventCommandObj = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; CommandEventHandler Command&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Events.AddHandler(EventCommandObj, &lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; remove&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Events.RemoveHandler(EventCommandObj, &lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//this will raise the bubble event&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnCommand(CommandEventArgs commandEventArgs)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CommandEventHandler eventHandler = (CommandEventHandler)Events[EventCommandObj];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (eventHandler != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eventHandler(&lt;span class="kwrd"&gt;this&lt;/span&gt;, commandEventArgs);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;base&lt;/span&gt;.RaiseBubbleEvent(&lt;span class="kwrd"&gt;this&lt;/span&gt;, commandEventArgs);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//this overrides the OnTextChanged event on the normal textbox&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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; OnTextChanged(EventArgs e)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnTextChanged(e);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (AutoPostBack)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//pass the event arguments to the OnCommand event to bubble up&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CommandEventArgs args = &lt;span class="kwrd"&gt;new&lt;/span&gt; CommandEventArgs(&lt;span class="kwrd"&gt;this&lt;/span&gt;.CommandName, &lt;span class="kwrd"&gt;this&lt;/span&gt;.CommandArgument);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnCommand(args);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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; CreateChildControls()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;base&lt;/span&gt;.CreateChildControls();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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; Render(HtmlTextWriter writer)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//if its readonly then render the text in a span tag&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (IsReadOnly == &amp;quot;True&amp;quot;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.AddAttribute(HtmlTextWriterAttribute.Id, &lt;span class="kwrd"&gt;this&lt;/span&gt;.ClientID);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.RenderBeginTag(HtmlTextWriterTag.Span);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.Write(&lt;span class="kwrd"&gt;this&lt;/span&gt;.Text);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.RenderEndTag();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//if not then render the textbox&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;base&lt;/span&gt;.Render(writer);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
} &lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;h2&gt;
The Cake is a Lie&lt;/h2&gt;
&lt;p&gt;
Now anytime you need to have the OnTextChanged event fire and bubble up within a Gridview than just use this control. It will also be very handy to do able to cause the textbox to become truely readonly.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2flocalhost%2fpost%2f2007%2f10%2fHowto-Create-a-Custom-Control-in-ASPNET-(C).aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2flocalhost%2fpost%2f2007%2f10%2fHowto-Create-a-Custom-Control-in-ASPNET-(C).aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/KKseiR7M5qg/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/10/30/Howto-Create-a-Custom-Control-in-ASPNET-(C).aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=ed77106a-243d-4015-9192-3e6adaa50d39</guid>
      <pubDate>Tue, 30 Oct 2007 12:34:00 -0300</pubDate>
      <category>ASP.NET</category>
      <category>Custom Controls</category>
      <category>Asp.net Controls</category>
      <category>General</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=ed77106a-243d-4015-9192-3e6adaa50d39</pingback:target>
      <slash:comments>8</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=ed77106a-243d-4015-9192-3e6adaa50d39</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/10/30/Howto-Create-a-Custom-Control-in-ASPNET-(C).aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=ed77106a-243d-4015-9192-3e6adaa50d39</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=ed77106a-243d-4015-9192-3e6adaa50d39</feedburner:origLink></item>
    <item>
      <title>SubSonic Quickie - How to Delete using the Query Tool</title>
      <description>Here&amp;#39;s a quick little bit of code that shows how to delete records in your database using SubSonic&amp;#39;s Query Tool. I know you can write this is fewer lines of code, but I think this shows a little more clearly what&amp;#39;s going on.
&lt;div class="code"&gt;Query qryDelete = &lt;span class="kwrd"&gt;new&lt;/span&gt; Query(DeliverableCategoriesSelected.Schema);
&lt;br /&gt;
qryDelete.QueryType = QueryType.Delete;
&lt;br /&gt;
&lt;span class="rem"&gt;// You can also do the following line in this way: qryDelete.WHERE(&amp;quot;ProductId&amp;quot;, productId);&lt;/span&gt;
&lt;br /&gt;
qryDelete.WHERE(Products.Columns.ProductId, productId);
&lt;span class="rem"&gt;//where productId equals the product ID number you want to delete&lt;br /&gt;&lt;/span&gt;
qryDelete.Execute();
&lt;/div&gt;SubSonic also supports logical deletes so if you have your tables setup with the extra fields (isDeleted being the most important) than you record will not disappear. You can still do that with the &amp;quot;Destroy&amp;quot; method if you really feel the need to kill something.
</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/jNFwrokUnMA/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/10/29/SubSonic-Quickie-How-to-Delete-using-the-Query-Tool.aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=a02e5fcf-1b25-4ec1-a0ea-42285f0cf702</guid>
      <pubDate>Mon, 29 Oct 2007 12:37:00 -0300</pubDate>
      <category>ASP.NET</category>
      <category>SubSonic</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=a02e5fcf-1b25-4ec1-a0ea-42285f0cf702</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=a02e5fcf-1b25-4ec1-a0ea-42285f0cf702</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/10/29/SubSonic-Quickie-How-to-Delete-using-the-Query-Tool.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=a02e5fcf-1b25-4ec1-a0ea-42285f0cf702</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=a02e5fcf-1b25-4ec1-a0ea-42285f0cf702</feedburner:origLink></item>
    <item>
      <title>Speaking of SubSonic</title>
      <description>&lt;p&gt;
&lt;a href="http://blog.wekeroad.com/2007/10/26/microsoft-subsonic-and-me/" target="_blank"&gt;Rob is now of the collective.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Rob called me a star once for helping with some VB translations in SubSonic. Does that make me famous now?
&lt;/p&gt;
&lt;p&gt;
Congrats and good luck, Rob!&amp;nbsp;
&lt;/p&gt;
</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/yP5HZsg67PU/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/10/26/Speaking-of-SubSonic.aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=2a18435b-ea1f-43c6-a737-84e2ca7e8d6b</guid>
      <pubDate>Fri, 26 Oct 2007 15:36:00 -0300</pubDate>
      <category>SubSonic</category>
      <category>General</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=2a18435b-ea1f-43c6-a737-84e2ca7e8d6b</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=2a18435b-ea1f-43c6-a737-84e2ca7e8d6b</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/10/26/Speaking-of-SubSonic.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=2a18435b-ea1f-43c6-a737-84e2ca7e8d6b</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=2a18435b-ea1f-43c6-a737-84e2ca7e8d6b</feedburner:origLink></item>
    <item>
      <title>5 Reasons why SubSonic is Better than Sliced Bread</title>
      <description>&lt;br /&gt;
&lt;blockquote&gt;
	Toast your bread before you put gravy on it. Use &lt;a href="http://subsonicproject.com/" target="_blank"&gt;SubSonic&lt;/a&gt; in your applications.
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;h2&gt;
1. It gets better with age
&lt;/h2&gt;
&lt;p&gt;
There are still things that I discover almost on a daily basis that I didn&amp;#39;t know it could do. One of the coolest features I&amp;#39;ve discovered lately is the built-in table relations it implements in its generated classes. You can very easily reference a related record in another table with a tiny bit of code. Check this out.
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="rem"&gt;//grab a product object&lt;br /&gt;&lt;/span&gt;
Products product = Products.FetchByID(productId);&lt;br /&gt;
&lt;br /&gt;
&lt;span class="rem"&gt;//if you have a relation setup to a Vendors table you can do this&lt;br /&gt;&lt;/span&gt;
&lt;span class="rem"&gt;//the Vendors table has an Address field for the vendor&lt;br /&gt;&lt;/span&gt;
String vendorAddress = product.Vendors.Address;&amp;nbsp;
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
How rediculously simple is that?
&lt;/p&gt;
&lt;h2&gt;
2. It doesn&amp;#39;t make you fat if you use it too much
&lt;/h2&gt;
&lt;p&gt;
The more you use it the more time it will save you. Your developement will get faster not slower. Its the ultimate DAL generator that just makes things faster and easier to do.&amp;nbsp; It doesn&amp;#39;t create tons of useless code either. You can even tell it to only generate the class files on the tables you want it to. I can honestly say that I write about 1/4 less code than I used to because of SubSonic.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
For example this is just one way to generate a collection that you can bind to a data countrol.
&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="rem"&gt;//this one line of code will populate a collection of products with a specified vendorId&lt;br /&gt;&lt;/span&gt;
ProductsCollection coll = &lt;span class="kwrd"&gt;new&lt;/span&gt; ProductsCollection().Where(&amp;quot;VendorId&amp;quot;, vendorId).Load();
&lt;/div&gt;&lt;h2&gt;
3. It won&amp;#39;t get soggy if you pour gravy on it&lt;br /&gt;
&lt;/h2&gt;
&lt;p&gt;
That has nothing to do with SubSonic, but I just hate when my bread gets soggy. A restaurant should know that they need to &lt;strong&gt;TOAST&lt;/strong&gt; the bread before they pour gravy all over it. Why can&amp;#39;t they understand this simple concept? &lt;br /&gt;
&lt;br /&gt;
As far as SubSonic goes... if you consider the ASP.NET AJAX framework as gravy and the generating of the class files during compile as toasting than no, it won&amp;#39;t get soggy. They work perfectly well together.&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;
4. If you want to change something about it you don&amp;#39;t have to buy a whole new loaf
&lt;/h2&gt;
&lt;p&gt;
I see two meaning with that statement. First, its open source. &lt;a href="http://blog.wekeroad.com/" target="_blank"&gt;Rob&lt;/a&gt; and &lt;a href="http://monk.thelonio.us/" target="_blank"&gt;Eric&lt;/a&gt; do a wonderful job, but if you don&amp;#39;t like something about it or want to add something new than go right ahead and do so. The wonderful thing about open source is you don&amp;#39;t have to depend on anybody else to fix a bug if you don&amp;#39;t want to. We&amp;#39;ll not talk about having bugs in your bread. The other is that if you need to change something in your database you don&amp;#39;t need to manually change your DAL code. Make a change in the database, recompile, you now have access to the changes in your application.&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;
5. Transparency is a good thing
&lt;/h2&gt;
&lt;p&gt;
As a developer using &lt;a href="http://subsonicproject.com/" target="_blank"&gt;SubSonic&lt;/a&gt; you really need not worry about what&amp;#39;s going on under the hood. You can be as oblivious as you like. It works best when you let it be transparent. Make it a part of developing the majority of your applications and your life will be better for it. 
&lt;/p&gt;
&lt;p&gt;
Bread would have to be really really soggy to become transparent. That is something that most certainly would not make your life better.&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f10%2f5-Reasons-why-SubSonic-is-Better-than-Sliced-Bread.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f10%2f5-Reasons-why-SubSonic-is-Better-than-Sliced-Bread.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/X4XgvYtAI-I/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/10/26/5-Reasons-why-SubSonic-is-Better-than-Sliced-Bread.aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=7dd33000-c8b6-43bb-af7d-c0a30d947e6e</guid>
      <pubDate>Fri, 26 Oct 2007 10:01:00 -0300</pubDate>
      <category>SubSonic</category>
      <category>General</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=7dd33000-c8b6-43bb-af7d-c0a30d947e6e</pingback:target>
      <slash:comments>48</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=7dd33000-c8b6-43bb-af7d-c0a30d947e6e</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/10/26/5-Reasons-why-SubSonic-is-Better-than-Sliced-Bread.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=7dd33000-c8b6-43bb-af7d-c0a30d947e6e</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=7dd33000-c8b6-43bb-af7d-c0a30d947e6e</feedburner:origLink></item>
    <item>
      <title>Showing the Users Currently on your Site (Part 2)</title>
      <description>&lt;h2&gt;An Evolution&lt;/h2&gt;
&lt;p&gt;
The first part (&lt;a href="http://www.bloodyflux.com/post.aspx?id=32e36f54-6064-4902-9f40-66148280fd64" target="_blank"&gt;read it here&lt;/a&gt;) was a simple implementation that just showed the number of active users on your site. It used the global.asax file to count the sessions and retain the total in a cached object. I thought that was all I really wanted to see, but after I realized I could take it up a notch with bit more effort I decided to do so. &lt;strong&gt;You can see the working product over there on the left.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
I thought it would be usefull to show how many people are on your site, which page they are on and where they came from (URL referrer). Getting away from simple session tracking was a must. This implementation should be a set of controls that could be used in any ASP.NET application whether it had the membership provider enabled or not. Just drop a control on any page you want tracked or on a master page if you wanted them all tracked. Another control that shows the stats and one more to show a history of activity for a specified duration. Drag and drop DLL into bin folder. Drag and drop control onto page.&amp;nbsp; So easy even a manager could do it.
&lt;/p&gt;
&lt;p&gt;
I want to release the source, but I&amp;#39;ve been debating on the best way to go about it. I&amp;#39;ve been leaning towards creating an open source project for the controls so everybody can download and improve it. I&amp;#39;m a huge fan of open source .net projects. I use &lt;a href="http://www.subsonicproject.com/" target="_blank"&gt;SubSonic &lt;/a&gt;on just about every new project I work on. Of course, &lt;a href="http://dotnetblogengine.net/Default.aspx" target="_blank"&gt;BlogEngine.net&lt;/a&gt; is what I&amp;#39;m using for this blog. Anyway, what are your thoughts? Should I create an open source project for these controls?
&lt;/p&gt;
&lt;blockquote&gt;
	So easy even a manager could do it
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;h2&gt;An Overview&lt;br /&gt;
&lt;/h2&gt;
&lt;p&gt;
I created a user object which stores the information for each online user. The best way to keep a collection of like objects is to user Generics. A UsersOnlineCollection object was created for this purpose. I also created one to track the &amp;quot;history&amp;quot;. The history collection keeps track of the last 50 (or whatever number you choose) users that have hit your site. With tracking control on the page everytime it loads the &amp;quot;ProcessOnlineUsers&amp;quot; method is called. This is where all the action happens. It does the following:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Grabs the current users online collection&lt;/li&gt;
	&lt;li&gt;Checks to see if the current user is in the collection (checks IP address rather than sessionId) &lt;/li&gt;
	&lt;li&gt;If the user is already in the collection then the stats for the user are updated (current page, last activity time, timeout time, etc)&lt;/li&gt;
	&lt;li&gt;If the user is not in the collection then they are added. They are also added to the history collection. &lt;/li&gt;
	&lt;li&gt;Then the users that are inactive are deleted from the collection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
All the statistics are still stored in a cached object. No database interaction is needed. I wanted this to have no adverse effects on the performance of my site. 
&lt;/p&gt;
&lt;h2&gt;Cluster Issues&lt;/h2&gt;
&lt;p&gt;
If your site is served by a cluster of servers you will have issues. This is due to the fact that the cached object is localized to whichever server you are currently on. You&amp;#39;ll notice the stats may change when you look at the working demo on the left. This, of course, is because my site is on a cluster. You can see the name of the current server in the cluster right below the users online list. This is to allow you to see the effects of switching to another server in the cluster. 
&lt;/p&gt;
&lt;p&gt;
There are ways to fix this problem with additional software (&lt;a href="http://www.alachisoft.com/ncache/" target="_blank"&gt;NCache&lt;/a&gt; for one) and server configurations. I&amp;#39;m not sure if keeping the state within SQL Server would solve the issue, but I don&amp;#39;t believe its an option in my situation. Regardless, this solution will working just fine for the majority of people who&amp;#39;d like to use it.
&lt;/p&gt;
&lt;h2&gt;Conclusion&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;
I need some feedback at this point. Anybody interested in the source? Should I just create an open source project? I think this could be really usefull to a lot of people. There&amp;#39;s a bunch of stuff I&amp;#39;d still like to add/fix/change to make the controls work better so I&amp;#39;m hoping there enough interest for me to continue to do so. &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Feel free to leave a comment to voice your opinions.
&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f10%2fShowing-the-Users-Currently-on-your-Site-(Part-2).aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f10%2fShowing-the-Users-Currently-on-your-Site-(Part-2).aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/tkk2j8Ho1eo/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/10/24/Showing-the-Users-Currently-on-your-Site-(Part-2).aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=a9c3c515-7b82-4d65-bf9b-879ac86ccc83</guid>
      <pubDate>Wed, 24 Oct 2007 13:14:00 -0300</pubDate>
      <category>Custom Controls</category>
      <category>Asp.net Controls</category>
      <category>General</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=a9c3c515-7b82-4d65-bf9b-879ac86ccc83</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=a9c3c515-7b82-4d65-bf9b-879ac86ccc83</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/10/24/Showing-the-Users-Currently-on-your-Site-(Part-2).aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=a9c3c515-7b82-4d65-bf9b-879ac86ccc83</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=a9c3c515-7b82-4d65-bf9b-879ac86ccc83</feedburner:origLink></item>
    <item>
      <title>Showing the Users Currently on your Site (Part 1)</title>
      <description>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;
I love to see a live look at who&amp;#39;s currently on my site. The detailed stats I get from Google Analytics is really nice, but it only gets updated every 24 hours. Sometimes I just want to see if anybody is on my site. Quick and simple. Just give me a number!
&lt;/p&gt;
&lt;p&gt;
This is pretty easy to pull off when you use ASP.NET&amp;#39;s built-in membership provider. You can show basic users online statistics on any site that uses it with just a few lines of code. In part 1 I&amp;#39;ll show you how to get the very basic info to display. In the later parts I&amp;#39;ll make it much more robust by showing the current authinticated and anonymous users and adding AJAX support to truely show live data without having to refresh the page. I plan on releasing the source code when it&amp;#39;s all complete.
&lt;/p&gt;
&lt;h2&gt;So you&amp;#39;re doing what... how?&lt;/h2&gt;
&lt;p&gt;
This first thing you need do it is make sure Session State is enabled. If you use BlogEngine.NET 1.2 then it&amp;#39;s disabled by default. You need to go into the web.config file and make a change. I&amp;#39;ll show you the section in the web.config for BlogEngine.NET, but its the same in any application.
&lt;/p&gt;
&lt;div class="code"&gt;
&amp;lt;pages &lt;strong&gt;enableSessionState=&amp;quot;true&amp;quot;&lt;/strong&gt; enableViewStateMac=&amp;quot;true&amp;quot;
enableEventValidation=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;controls&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add namespace=&amp;quot;Controls&amp;quot; tagPrefix=&amp;quot;blog&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;/controls&amp;gt;&lt;br /&gt;
&amp;lt;/pages&amp;gt;
&lt;/div&gt;
&lt;p&gt;
Here you just set enableSessionState to true. I&amp;#39;m also assuming here that you&amp;#39;ve already set up the ASP.NET Membership provider for your site. There are examples of how to do that all around the interwebs. Actually, setting up the membership provider isn&amp;#39;t needed for part 1, but you&amp;#39;ll need it later for the more advanced stuff.&lt;br /&gt;
&lt;br /&gt;
Ah, our old friend &lt;strong&gt;Global.asax&lt;/strong&gt;. It is hardly ever used anymore, but it certainly has it&amp;#39;s uses. The counting goes on withing Global.asax. We are going to store the user count in a cache object rather than store anything in a database for performance sake. Here&amp;#39;s what your Global.asax file should look like.
&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre&gt;
&lt;span class="kwrd"&gt;void&lt;/span&gt; Application_Start(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpContext.Current.Cache.Insert(&amp;quot;UsersOnline&amp;quot;, 0);
}
&lt;span class="kwrd"&gt;void&lt;/span&gt; Session_Start(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpContext.Current.Cache[&amp;quot;UsersOnline&amp;quot;] = 
(&lt;span class="kwrd"&gt;int&lt;/span&gt;)HttpContext.Current.Cache[&amp;quot;UsersOnline&amp;quot;] + 1;
}
&lt;span class="kwrd"&gt;void&lt;/span&gt; Session_End(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpContext.Current.Cache[&amp;quot;UsersOnline&amp;quot;] = 
(&lt;span class="kwrd"&gt;int&lt;/span&gt;)HttpContext.Current.Cache[&amp;quot;UsersOnline&amp;quot;] - 1;
}
&lt;span class="kwrd"&gt;void&lt;/span&gt; Application_End(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpContext.Current.Cache.Remove(&amp;quot;UsersOnline&amp;quot;);
}
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;
When the application starts (compiles on the server) the cache object is created with a value of zero. When a session starts the value is increased by one. When the session ends the value is decreased by one. Finally, when the application stops the cache object is removed. All very simple and easy to insert into your Global.asax file.
&lt;/p&gt;
&lt;p&gt;
All that&amp;#39;s left is to display the cache object to the page. You can do it on any page you like within your application. All you need to use is this bit of code.
&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= HttpContext.Current.Cache[&lt;span class="str"&gt;"UsersOnline"&lt;/span&gt;].ToString() &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;
That will display the current number of users on your site. How long they are considered to be on your site is determined by the session timeout period you have set.
&lt;/p&gt;
&lt;h2&gt;Give me more&lt;/h2&gt;
&lt;p&gt;
The next part will start getting into showing the authenticated users who are logged in. Then we&amp;#39;ll get into the fun stuff. AJAX support. Please feel free to comment!
&lt;/p&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f10%2fShowing-the-Users-Currently-on-your-Site-(Part-1).aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f10%2fShowing-the-Users-Currently-on-your-Site-(Part-1).aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/uTOpvlDLFZ4/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/10/18/Showing-the-Users-Currently-on-your-Site-(Part-1).aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=32e36f54-6064-4902-9f40-66148280fd64</guid>
      <pubDate>Thu, 18 Oct 2007 13:59:00 -0300</pubDate>
      <category>Tip/Trick</category>
      <category>General</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=32e36f54-6064-4902-9f40-66148280fd64</pingback:target>
      <slash:comments>17</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=32e36f54-6064-4902-9f40-66148280fd64</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/10/18/Showing-the-Users-Currently-on-your-Site-(Part-1).aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=32e36f54-6064-4902-9f40-66148280fd64</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=32e36f54-6064-4902-9f40-66148280fd64</feedburner:origLink></item>
    <item>
      <title>Concatenate Column Values from Multiple Rows into a Single Column in SQL Server</title>
      <description>&lt;h4&gt;What I needed to happen&lt;/h4&gt;&lt;p&gt;&lt;br /&gt;There is likely many other more efficient ways to accomplish this, but this is the way I figured out how to do it in my particular situation. I needed to be able to combine column values in a table into a single column to be able to do a filter or search. I'll show you what I mean.&lt;/p&gt;&lt;h5&gt;First Table&amp;nbsp;&lt;/h5&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table width="400" cellspacing="0" cellpadding="2" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="200" valign="top" align="center" style="background-color: rgb(192, 192, 192);"&gt;&lt;strong&gt;RecordId&lt;/strong&gt;&lt;/td&gt;&lt;td width="200" valign="top" align="center" style="background-color: rgb(192, 192, 192);"&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="200" valign="top"&gt;1001&lt;/td&gt;&lt;td width="200" valign="top"&gt;Sandy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="200" valign="top"&gt;1002&lt;/td&gt;&lt;td width="200" valign="top"&gt;Tom&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="200" valign="top"&gt;1003&lt;/td&gt;&lt;td width="200" valign="top"&gt;Jim&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h5&gt;&lt;br /&gt;Second Table&lt;/h5&gt;&lt;p&gt;This table stores multiple records for each person.&lt;/p&gt;&lt;table width="362" cellspacing="0" cellpadding="2" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="199" valign="top" align="center" style="background-color: rgb(192, 192, 192);"&gt;&lt;strong&gt;RecordId&lt;/strong&gt;&lt;/td&gt;&lt;td width="161" valign="top" align="center" style="background-color: rgb(192, 192, 192);"&gt;&lt;strong&gt;FieldtoConcat&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="219" valign="top"&gt;1001&lt;/td&gt;&lt;td width="170" valign="top"&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="224" valign="top"&gt;1001&lt;/td&gt;&lt;td width="172" valign="top"&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="225" valign="top"&gt;1002&lt;/td&gt;&lt;td width="172" valign="top"&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="226" valign="top"&gt;1002&lt;/td&gt;&lt;td width="172" valign="top"&gt;3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="226" valign="top"&gt;1003&lt;/td&gt;&lt;td width="172" valign="top"&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="226" valign="top"&gt;1003&lt;/td&gt;&lt;td width="172" valign="top"&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="226" valign="top"&gt;1003&lt;/td&gt;&lt;td width="172" valign="top"&gt;3&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;I needed to have this data set returned so I could then filter the list by search for each &amp;quot;FieldtoConcat&amp;quot; in the list.&lt;/p&gt;&lt;table width="400" cellspacing="0" cellpadding="2" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="133" valign="top" style="background-color: rgb(192, 192, 192);"&gt;&lt;strong&gt;RecordId&lt;/strong&gt;&lt;/td&gt;&lt;td width="133" valign="top" style="background-color: rgb(192, 192, 192);"&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;&lt;td width="133" valign="top" style="background-color: rgb(192, 192, 192);"&gt;&lt;strong&gt;ConcatedFields&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="133" valign="top"&gt;1001&lt;/td&gt;&lt;td width="133" valign="top"&gt;Sandy&lt;/td&gt;&lt;td width="133" valign="top"&gt;^1^^2^&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="133" valign="top"&gt;1002&lt;/td&gt;&lt;td width="133" valign="top"&gt;Tom&lt;/td&gt;&lt;td width="133" valign="top"&gt;^1^^3^&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="133" valign="top"&gt;1003&lt;/td&gt;&lt;td width="133" valign="top"&gt;Jim&lt;/td&gt;&lt;td width="133" valign="top"&gt;^1^^2^^3^&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;The first question you may ask is what's up with the &amp;quot;^&amp;quot;. Its a simple reason. If there were any records with a value of, say, &amp;quot;10&amp;quot; when I would search for just &amp;quot;1&amp;quot; then I would get all the records that had &amp;quot;1&amp;quot; in them. So my solution was to search for &amp;quot;^1^&amp;quot; which would ensure that I would only get the desired records.&lt;/p&gt;&lt;h4&gt;How to do it&lt;/h4&gt;&lt;p&gt;&lt;br /&gt;To pull this off you need to create a function. Here it is:&lt;/p&gt;&lt;div class="code"&gt;&lt;p&gt;CREATE FUNCTION [dbo].[ConcatField](@RecordId int)&lt;br /&gt;RETURNS VARCHAR(1000)&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE @ReturnValue VARCHAR(1000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @ReturnValue = ''&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @ReturnValue =&amp;nbsp;&amp;nbsp;&amp;nbsp; CASE @ReturnValue &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN '' THEN '^' + CAST(FieldtoConcat AS VARCHAR(3)) + '^'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE @ReturnValue + '^' + CAST(FieldtoConcat AS VARCHAR(3)) + '^'&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM TableWithTheFieldtoConcat&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE Id = @RecordId&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ORDER BY FieldtoConcat&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN @ReturnValue&lt;br /&gt;END&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;It takes the RecordId as a parameter, combines all the numbers into @ReturnValue and returns the values as desired.&lt;br /&gt;&lt;br /&gt;After that it gets easy.&amp;nbsp; I'll just show you the SQL because it's pretty self explanatory.&lt;/p&gt;&lt;div class="code"&gt;SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RecordId, Name, CAST(ConcatField(RecordId) AS VARCHAR(1000)) AS ConcatedFields&lt;br /&gt;FROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FirstTable&lt;/div&gt;&lt;p&gt;&lt;br /&gt;You can insert a &amp;quot;WHERE ConcatedFields LIKE %^1^%&amp;quot; and it will only pull the records with &amp;quot;1&amp;quot;. That's all there is to it. Anybody have a better way? Please comment.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f10%2fConcatenate-Column-Values-from-Multiple-Rows-into-a-Single-Column-in-SQL-Server.aspx"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f10%2fConcatenate-Column-Values-from-Multiple-Rows-into-a-Single-Column-in-SQL-Server.aspx" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="http://technorati.com/claim/7uxvnbyj6i" rel="me"&gt;Technorati Profile&lt;/a&gt;</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/wYaZOSBcL90/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/10/11/Concatenate-Column-Values-from-Multiple-Rows-into-a-Single-Column-in-SQL-Server.aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=28dae36e-bacb-4ca8-9ca2-ecdb14b79efc</guid>
      <pubDate>Thu, 11 Oct 2007 11:46:00 -0300</pubDate>
      <category>SQL</category>
      <category>General</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=28dae36e-bacb-4ca8-9ca2-ecdb14b79efc</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=28dae36e-bacb-4ca8-9ca2-ecdb14b79efc</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/10/11/Concatenate-Column-Values-from-Multiple-Rows-into-a-Single-Column-in-SQL-Server.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=28dae36e-bacb-4ca8-9ca2-ecdb14b79efc</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=28dae36e-bacb-4ca8-9ca2-ecdb14b79efc</feedburner:origLink></item>
    <item>
      <title>Asp.net AJAX Progress Indicator by your Cursor</title>
      <description>&lt;p&gt;&lt;a href="../App_Data/files/AjaxCursorIndicator.zip"&gt;&lt;br /&gt;Download the source here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;Providing the user feedback to their actions is the most important aspect in creating a responsive application. No user ever wants to click on a button or link and not know if anything actually happened. This is especially common when AJAX is in use. The user no longer has the familiar page flash to indicate that &amp;quot;something&amp;quot; happened. With AJAX only the portion of the screen that needs changed will be updated. If no progress indicator is used then the user is left to figure out themselves if the action actually started and if it's even finished yet. &lt;br /&gt;&lt;br /&gt;Enter the Update Progress control for asp.net AJAX 1.0. This control is designed to give some visual feedback to the user when an asyn-postback is occuring. This does help the situation a bit, but it has problems and limitation. The main issue I have with a status indicator like this is that it will easily get lost on the page. The user may or may not even see the little spinning .gif that you have set to show within the control. &lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;If no progress indicator is used then the user is left to figure out themselves if the action actually started and if it's even finished yet.&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;A Better Way&lt;/h2&gt;&lt;p&gt;&lt;br /&gt; There needs to be a more clearly visible indication that something is going on. We must leave no doubt to the user that the following have taken place:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The click started the action and I can no longer click on anything else&lt;/li&gt;&lt;li&gt;The action is still being completed and I still can't click on anything else&lt;/li&gt;&lt;li&gt;The action is finished and I can now click on something else&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;There are many ways to make the above clear to the user, but I think the best way is to show the status by the user's cursor. There's little chance the user will not see the status indicator because it is attached to their cursor which is normally hovering over or close to what the user is looking at on the page. I want to accomplish this with the following requirements:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;No use of the built-in UpdateProgress control&lt;/li&gt;&lt;li&gt;Show the status for all async postbacks by the user's cursor&lt;/li&gt;&lt;li&gt;Disable the page while the postback takes place&lt;/li&gt;&lt;li&gt;Work on all major browsers&lt;/li&gt;&lt;li&gt;Do not slow down the page rendering&lt;/li&gt;&lt;li&gt;Work with or without an UpdatePanel&lt;/li&gt;&lt;li&gt;Use Asp.net AJAX 1.0&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Let's do it&lt;/h2&gt;&lt;p&gt;First we'll set up the aspx page. Here's the code:&lt;/p&gt;&lt;p class="code"&gt;&amp;nbsp;Page Load: &amp;lt;%= DateTime.Now.ToString() %&amp;gt;&lt;br /&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;asp:UpdatePanel ID=&amp;quot;UpdatePanel1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ContentTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Async-postback time:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Label ID=&amp;quot;StatusIndicator&amp;quot; runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Button ID=&amp;quot;doProcess&amp;quot; runat=&amp;quot;server&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Text=&amp;quot;Start&amp;quot; OnClick=&amp;quot;doProcess_Click&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ContentTemplate&amp;gt;&lt;br /&gt;&amp;lt;/asp:UpdatePanel&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Very simple stuff. Just an update panel with a button that when clicked gets the time on the server and assigns it to a label control. The original page load time is displayed at the top to compare to the async-postback time. &lt;br /&gt;&lt;br /&gt;Next let's look at the JavaScript. I'm using the standard way to hook into the Asp.net AJAX PageRequestManager:&lt;br /&gt;&lt;/p&gt;&lt;p class="code"&gt;var prm = Sys.WebForms.PageRequestManager.getInstance();&lt;br /&gt;prm.add_initializeRequest(InitializeRequest);&lt;br /&gt;prm.add_endRequest(EndRequest);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Here is the most important part of the code.&lt;/strong&gt; This where the request is initialized and all the action starts. On every async-postback is made this is called. You can do all kinds of fun stuff here:&lt;/p&gt;&lt;p class="code"&gt;&amp;nbsp;/hook into InitializeRequest&lt;br /&gt;function InitializeRequest(sender, args) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //this will cancel a request if another one is already running&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (prm.get_isInAsyncPostBack()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; args.set_cancel(true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //show the disable mask on the page&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $get('ProgressMask').style.display = &amp;quot;block&amp;quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set initial animation text&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Animate(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Start animation using setInterval while request is processed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intervalID = window.setInterval(&amp;quot;Animate()&amp;quot;, 1000); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;There is a DIV on the aspx page called &amp;quot;ProgressMask&amp;quot;. This is how I am disabling the page when a request is made. The DIV covers the entire screen during the request with a higher z-index than anything else which prevents anything else from being clicked. There's also some code in there that prevents another request from coming in if one is already running.&lt;br /&gt;&lt;br /&gt;This is the bit of code that runs when the request finally ends. All I do here is stop the animation, set the styles back to normal and assign the &amp;quot;finished&amp;quot; text.&lt;br /&gt;&lt;/p&gt;&lt;p class="code"&gt;//hook into the EndRequest event&lt;br /&gt;function EndRequest(sender, args) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; window.clearInterval(intervalID); //process is done so stop animating&lt;br /&gt;&amp;nbsp;&amp;nbsp; $get(&amp;quot;ProgressAnimate&amp;quot;).className = &amp;quot;ProcessComplete&amp;quot;;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; $get(&amp;quot;ProgressAnimate&amp;quot;).innerHTML = &amp;quot;Complete&amp;quot;; //set the text of what you want to display when finished &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; intervalID = window.setInterval(&amp;quot;ClearAnimate()&amp;quot;, 3000) //Hide after 3 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp; $get('ProgressMask').style.display = &amp;quot;&amp;quot;; //hide the disable mask on the page&lt;br /&gt;&amp;nbsp;&amp;nbsp; window.clearInterval(intervalID);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function Animate()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $get(&amp;quot;ProgressAnimate&amp;quot;).className = &amp;quot;ActiveProcess&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $get(&amp;quot;ProgressAnimate&amp;quot;).innerHTML = GetStatusText($get(&amp;quot;ProgressAnimate&amp;quot;).innerHTML); //grabs the text while processing&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function ClearAnimate()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $get(&amp;quot;ProgressAnimate&amp;quot;).className = &amp;quot;AnimateNormal&amp;quot;; //set CSS back to normal&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function GetStatusText(ctrText)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set the animation text&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (ctrText==&amp;quot;Please wait.&amp;quot;)?&amp;quot;Saving...&amp;quot;:&amp;quot;Please wait.&amp;quot;;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;I have posted the source code at the top of the article. If you have any questions or comments please feel free to leave one below. Thanks!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f10%2fAspnet-AJAX-Progress-Indicator-by-your-Cursor.aspx"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.bloodyflux.com%2fpost%2f2007%2f10%2fAspnet-AJAX-Progress-Indicator-by-your-Cursor.aspx" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://feedproxy.google.com/~r/Bloodyfluxcom/~3/FCyzhuB1nAE/post.aspx</link>
      <author>wvdominick.nospam@nospam.gmail.com (Dominick)</author>
      <comments>http://www.bloodyflux.com/post/2007/10/09/Aspnet-AJAX-Progress-Indicator-by-your-Cursor.aspx#comment</comments>
      <guid isPermaLink="false">http://www.bloodyflux.com/post.aspx?id=8d04ce34-c750-4ab2-84ae-5671f1e15f13</guid>
      <pubDate>Tue, 09 Oct 2007 15:14:00 -0300</pubDate>
      <category>AJAX</category>
      <category>General</category>
      <category>Javascript</category>
      <dc:publisher>Dominick</dc:publisher>
      <pingback:server>http://www.bloodyflux.com/pingback.axd</pingback:server>
      <pingback:target>http://www.bloodyflux.com/post.aspx?id=8d04ce34-c750-4ab2-84ae-5671f1e15f13</pingback:target>
      <slash:comments>23</slash:comments>
      <trackback:ping>http://www.bloodyflux.com/trackback.axd?id=8d04ce34-c750-4ab2-84ae-5671f1e15f13</trackback:ping>
      <wfw:comment>http://www.bloodyflux.com/post/2007/10/09/Aspnet-AJAX-Progress-Indicator-by-your-Cursor.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bloodyflux.com/syndication.axd?post=8d04ce34-c750-4ab2-84ae-5671f1e15f13</wfw:commentRss>
    <feedburner:origLink>http://www.bloodyflux.com/post.aspx?id=8d04ce34-c750-4ab2-84ae-5671f1e15f13</feedburner:origLink></item>
  </channel>
</rss>
