<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2352821992277058467</id><updated>2011-12-19T13:17:49.777+02:00</updated><category term='Cars'/><category term='Vista'/><category term='Sport'/><category term='Microsoft'/><category term='Internet'/><category term='Cape Town'/><category term='Music'/><category term='Software Development'/><category term='Controls'/><category term='Photography'/><category term='Gadgets'/><category term='Math'/><category term='Threads'/><category term='Widgets'/><category term='Delegates'/><category term='C#'/><category term='C++'/><category term='Code'/><category term='Database'/><category term='Inspiring'/><category term='Pictures'/><category term='Tools'/><category term='Work'/><category term='Nostalgic'/><category term='GDI+'/><category term='Rant'/><category term='Torrents'/><category term='Forms'/><category term='Events'/><category term='Video'/><category term='Health'/><category term='Facebook'/><category term='News'/><category term='Blog'/><category term='Funny'/><title type='text'>christo greeff</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>37</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-8599112408071211954</id><published>2011-09-28T19:29:00.001+02:00</published><updated>2011-09-28T19:29:11.536+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Gadgets'/><title type='text'>Amazon Kindle Fire</title><content type='html'>&lt;p&gt;The much speculated Amazon Kindle tablet was released earlier today. I must say, I should probably have waited a bit longer before ordering my Kindle. But then again, looking at the Kindle Fire my Kindle Keyboard is still what I would have bought.&lt;/p&gt; &lt;p&gt;I’ll wait for the reviews, but if you want the latest new toy from Amazon, buy the &lt;a href="http://www.amazon.com/gp/product/B0051VVOB2/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=chrisv2-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399373&amp;amp;creativeASIN=B0051VVOB2&amp;quot;&amp;gt;Kindle Fire, Full Color 7&amp;quot; Multi-touch Display, Wi-Fi&amp;lt;/a&amp;gt;&amp;lt;img src=&amp;quot;http://www.assoc-amazon.com/e/ir?t=chrisv2-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B0051VVOB2&amp;amp;camp=217145&amp;amp;creative=399373" target="_blank"&gt;Kindle Fire, Full Color 7" Multi-touch Display, Wi-Fi&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The most interesting aspect of the Kindle Fire seems to be the Silk browser. Watch the short video below. It does make sense from a tablet perspective to leverage the Amazon EC2 service to speed up browsing on the device. Time will tell if it really makes such a big difference.&lt;/p&gt; &lt;p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:43608eff-582b-43c7-8f0f-e545adbdfe2a" class="wlWriterEditableSmartContent"&gt;&lt;div id="1eadd187-8e9f-44b0-bfff-950a0571ff71" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=_u7F_56WhHk&amp;amp;feature=player_embedded" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/-_kwkba5WfBU/ToNZZXc0wYI/AAAAAAAABZ0/BV1fGFu6Uy8/videod7e3a93df6c2%25255B15%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('1eadd187-8e9f-44b0-bfff-950a0571ff71'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;580\&amp;quot; height=\&amp;quot;326\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/_u7F_56WhHk?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/_u7F_56WhHk?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;580\&amp;quot; height=\&amp;quot;326\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="width:580px;clear:both;font-size:.8em"&gt;Silk Browser&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-8599112408071211954?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/8599112408071211954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=8599112408071211954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8599112408071211954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8599112408071211954'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2011/09/amazon-kindle-fire.html' title='Amazon Kindle Fire'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-_kwkba5WfBU/ToNZZXc0wYI/AAAAAAAABZ0/BV1fGFu6Uy8/s72-c/videod7e3a93df6c2%25255B15%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-8199908857026568509</id><published>2010-03-07T12:52:00.000+02:00</published><updated>2010-03-09T12:54:57.083+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Rant'/><category scheme='http://www.blogger.com/atom/ns#' term='Work'/><title type='text'>Recruiters and talent</title><content type='html'>&lt;p&gt;From time to time I get emails from &lt;strong&gt;recruiters&lt;/strong&gt; who either have my details on record or from my publicly available &lt;a href="http://www.linkedin.com/in/christogreeff"&gt;profile&lt;/a&gt; on LinkedIn. Now I don’t have a problem with them sending me the emails. It is always the content or the lack thereof that determines whether or not I click the delete button – a number of occasions the real position might have been wonderful, but the email (which is on many occasions just a copy and paste from the actual posting) did not address the true nature of the job. Many of these job emails always seem to lack the basic information that any potential job seeker need to make a decision.  &lt;p&gt;There are many recruitment companies that are very good at what they do, but I wish *&lt;strong&gt;all&lt;/strong&gt;* of them would read &lt;a href="http://blogs.msdn.com/ericlippert/archive/2010/03/08/attracting-talent-summarized.aspx"&gt;this post&lt;/a&gt; by &lt;a href="http://blogs.msdn.com/ericlippert/about.aspx"&gt;Eric Lippert&lt;/a&gt; of &lt;a href="http://blogs.msdn.com/ericlippert/"&gt;Fabulous Adventures In Coding&lt;/a&gt;.  &lt;p&gt;Information &lt;strong&gt;inadequacy&lt;/strong&gt; of job postings seems to be a problem for many software developers looking for the next interesting position. I think recruiters should be made aware of this fact. And I think I will from now on be more vocal about what I expect to see in job emails/postings.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-8199908857026568509?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/8199908857026568509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=8199908857026568509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8199908857026568509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8199908857026568509'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2010/03/recruiters-and-talent.html' title='Recruiters and talent'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-2787982993020238300</id><published>2009-07-27T08:12:00.001+02:00</published><updated>2009-07-27T08:12:11.476+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pictures'/><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Cape Town'/><category scheme='http://www.blogger.com/atom/ns#' term='Blog'/><title type='text'>Taking the road less travelled</title><content type='html'>&lt;p&gt;Sometimes making a rash decision, turns out to be quite fulfilling. I took a couple of photographs and amongst them were these 2 pictures. Taken on my way home, just outside Cape Town. I took a left turn at a certain intersection, instead of driving across, like I normally do.&lt;/p&gt; &lt;p&gt;Sometimes we should apply this to software development also. Try a different approach to a known solution.&amp;nbsp; It might end up being more interesting.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_4OwtBc_eTGY/Sm1FKW7pAzI/AAAAAAAAAU0/a7boSJnWLh4/s1600-h/09%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="09" border="0" alt="09" src="http://lh4.ggpht.com/_4OwtBc_eTGY/Sm1FL3yXbvI/AAAAAAAAAU4/PWxLcGDp8hs/09_thumb%5B1%5D.jpg?imgmax=800" width="433" height="301"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_4OwtBc_eTGY/Sm1FNCTPu3I/AAAAAAAAAU8/QQgAzKPzwrU/s1600-h/10%5B4%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="10" border="0" alt="10" src="http://lh6.ggpht.com/_4OwtBc_eTGY/Sm1FOT9326I/AAAAAAAAAVA/vonzSJgyFrg/10_thumb%5B2%5D.jpg?imgmax=800" width="435" height="302"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-2787982993020238300?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/2787982993020238300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=2787982993020238300' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/2787982993020238300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/2787982993020238300'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2009/07/taking-road-less-travelled.html' title='Taking the road less travelled'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_4OwtBc_eTGY/Sm1FL3yXbvI/AAAAAAAAAU4/PWxLcGDp8hs/s72-c/09_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-1430297564948126648</id><published>2009-07-23T09:59:00.001+02:00</published><updated>2009-07-23T10:10:29.422+02:00</updated><title type='text'>Pre-order Windows 7</title><content type='html'>&lt;p&gt;No, you can’t. Not in South Africa anyway. I spent a good couple of minutes (maybe more than 20) this morning trying how to pre-order, order, buy, rent and/or lease Windows 7. &lt;/p&gt; &lt;p&gt;So I’ve concluded that Microsoft does not want to sell Windows 7 to us. The Microsoft South Africa website has a buy/offers/upgrade page, but this does not even work properly.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_4OwtBc_eTGY/SmgaxMm_EkI/AAAAAAAAARk/joQd3FE5T38/s1600-h/mssa01%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="mssa01" border="0" alt="mssa01" src="http://lh4.ggpht.com/_4OwtBc_eTGY/Smga1wWwAVI/AAAAAAAAARo/g3VmWaaTebQ/mssa01_thumb%5B1%5D.png?imgmax=800" width="436" height="362"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Click the link and… no. I did not mean “&lt;em&gt;South Africa 404 mspx&lt;/em&gt;”.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_4OwtBc_eTGY/Smga5yHPf9I/AAAAAAAAARs/BEuan9OlKAU/s1600-h/mssa02%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="mssa02" border="0" alt="mssa02" src="http://lh5.ggpht.com/_4OwtBc_eTGY/Smga8uGa05I/AAAAAAAAARw/2HsqRuzoapQ/mssa02_thumb%5B1%5D.png?imgmax=800" width="439" height="365"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;I recently (8 months ago) purchased a new notebook pre-installed with Windows Vista. So for a couple of months I’ve been running Windows 7 RC instead. Do I want to run Windows 7 in the future? Yes. Do I want to buy it? Yes.&lt;/p&gt; &lt;p&gt;So I pose this question to Microsoft: Will you please sell Windows 7 to me? Now? On pre-order?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-1430297564948126648?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/1430297564948126648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=1430297564948126648' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/1430297564948126648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/1430297564948126648'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2009/07/pre-order-windows-7.html' title='Pre-order Windows 7'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_4OwtBc_eTGY/Smga1wWwAVI/AAAAAAAAARo/g3VmWaaTebQ/s72-c/mssa01_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-3890490183833127466</id><published>2008-10-27T11:22:00.001+02:00</published><updated>2008-10-27T11:29:08.880+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>Paging records using the ROW_NUMBER() function in SQL Server 2005</title><content type='html'>&lt;p&gt;Early this morning I was confronted with a question. In general I like questions. I don't always know the answer (contrary to &lt;strong&gt;popular&lt;/strong&gt; belief), so it was one of those Monday morning questions that make you sit up and think for a couple of minutes.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;How easy is it to implement &lt;strong&gt;paging&lt;/strong&gt; in SQL Server?&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I don't know. I have never had to use paging in SQL. I do know MySQL provides the &lt;font size="2" face="Courier New"&gt;&lt;a title="12.2.8. SELECT Syntax" target="_blank" href="http://dev.mysql.com/doc/refman/5.0/en/select.html"&gt;LIMIT&lt;/a&gt;&lt;/font&gt; keyword that allow you to specify an offset with the amount of records you need. &lt;font size="2" face="Courier New"&gt;LIMIT 100,20&lt;/font&gt; will return results 100 to 120.&lt;/p&gt; &lt;p&gt;What about SQL Server 2005. Well, there's an temporary table solution that I've heard of but haven't seen implemented, partly because I try to avoid temporary tables.&lt;/p&gt; &lt;p&gt;Well, we're in &lt;strong&gt;luck&lt;/strong&gt;. SQL Server 2005 introduced a new function called &lt;font size="2" face="Courier New"&gt;&lt;a title="ROW_NUMBER (Transact-SQL)" target="_blank" href="http://msdn.microsoft.com/en-us/library/ms186734.aspx"&gt;ROW_NUMBER()&lt;/a&gt;&lt;/font&gt;. So how does it work?&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div style="padding-bottom: 0px; overflow-x: auto; overflow-y: auto; margin: 0px; padding-left: 0px; width: 480px; padding-right: 0px; display: inline; float: none; height: 216px; overflow: scroll; padding-top: 0px"&gt;&lt;pre style="overflow-x: scroll; overflow-y: scroll; background-color: white; overflow: auto"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;    result.Firstname,&lt;br /&gt;    result.Lastname,&lt;br /&gt;    result.Date&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;    (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;        Firstname, Lastname, Date,&lt;br /&gt;        row_number() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;over&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;order&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;by&lt;/span&gt;&lt;span style="color: #000000"&gt; Date &lt;/span&gt;&lt;span style="color: #0000ff"&gt;asc&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span style="color: #000000"&gt; row&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;        RegisteredUsers) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span style="color: #000000"&gt; result&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;where&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    result.row &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;20&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;and&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;    result.row &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;30&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;From the MSDN entry: "&lt;em&gt;Returns the sequential number of a row within a partition of a result set, starting at 1 for the first row in each partition.&lt;/em&gt;"&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So it returns a sequential row counter within a partition of a result set. The only major remark is that you have to specify the &lt;font size="2" face="Courier New"&gt;&lt;a title="ORDER BY Clause (Transact-SQL)" target="_blank" href="http://msdn.microsoft.com/en-us/library/ms188385.aspx"&gt;ORDER BY&lt;/a&gt;&lt;/font&gt; clause, because it determines the order in which rows are assigned their row numbers.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The stored procedure below takes everything into account. Calling it requires you to specify a page number and a page size. The result set is also limited by the &lt;a title="TOP (Transact-SQL)" target="_blank" href="http://msdn.microsoft.com/en-us/library/ms189463(sql.90).aspx"&gt;TOP&lt;/a&gt; expression to limit the number of results. I think it might help improve performance on large result sets.&lt;/p&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; overflow-x: auto; overflow-y: auto; margin: 0px; padding-left: 0px; width: 480px; padding-right: 0px; display: inline; float: none; height: 426px; overflow: scroll; padding-top: 0px"&gt;&lt;pre style="overflow-x: scroll; overflow-y: scroll; background-color: white; overflow: auto"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;create&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000"&gt; dbo.GetCustomersPage&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@PageNumber&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@PageSize&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;begin&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;declare&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@Offset&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;declare&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@Limit&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@Offset&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #008000"&gt;@PageNumber&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #808080"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@PageSize&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@Limit&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@Offset&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@PageSize&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;    result.Firstname,&lt;br /&gt;    result.Lastname,&lt;br /&gt;    result.Date&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;    (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;top&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #008000"&gt;@Limit&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;        Firstname, Lastname, Date,&lt;br /&gt;        row_number() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;over&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;order&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;by&lt;/span&gt;&lt;span style="color: #000000"&gt; Date &lt;/span&gt;&lt;span style="color: #0000ff"&gt;asc&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span style="color: #000000"&gt; row &lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;        RegisteredUsers) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span style="color: #000000"&gt; result&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;where&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    result.row &lt;/span&gt;&lt;span style="color: #808080"&gt;between&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@Offset&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;and&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@Limit&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;I think this solution is really simple and straightforward.&amp;nbsp; Comments are always welcome and appreciated.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;u&gt;Environment:&lt;/u&gt;&lt;br&gt;Microsoft ® Visual Studio 2008&lt;br&gt;Microsoft ® .NET framework 3.5&lt;br&gt;Microsoft ® Windows XP (SP3)&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-3890490183833127466?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/3890490183833127466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=3890490183833127466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3890490183833127466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3890490183833127466'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2008/10/paging-records-using-rownumber-function.html' title='Paging records using the ROW_NUMBER() function in SQL Server 2005'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-3237030353079014698</id><published>2008-10-13T13:39:00.001+02:00</published><updated>2008-10-27T09:14:25.942+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Delegates'/><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><category scheme='http://www.blogger.com/atom/ns#' term='Forms'/><category scheme='http://www.blogger.com/atom/ns#' term='Threads'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>C# Asynchronous methods with CallBack</title><content type='html'>&lt;p&gt;It has been quite a while since my last post, so I decided to create a &lt;strong&gt;follow-up&lt;/strong&gt; to &lt;a title="Cross-thread Calls" target="_blank" href="http://christogreeff.blogspot.com/2007/08/cross-thread-calls.html"&gt;a post&lt;/a&gt; I made last year. At the time I showed how to overcome the “cross-thread operation not valid” problem when updating the user interface. For this post I decided to tackle something more or less along the same lines, but instead focusing more on how to perform an &lt;a title="Performing Asynchronous Operations" target="_blank" href="http://msdn.microsoft.com/en-us/library/zw97wx20(VS.80).aspx"&gt;asynchronous operation&lt;/a&gt; with a callback.  &lt;p&gt;When creating a &lt;a title="Thread" target="_blank" href="http://en.wikipedia.org/wiki/Thread_(computer_science)"&gt;single-threaded&lt;/a&gt; application we normally have to wait for a long-running operation, such as a call to the database, to complete before we can update the user interface again. This creates an application that appears to be slow and unresponsive. The reason is that the long-running operations block other operations from continuing.  &lt;p&gt;So what do we do? Using C# it is fairly straightforward to &lt;strong&gt;delegate long-running operations&lt;/strong&gt; to background threads, so that our foreground thread updating the user interface stays responsive and allow other operations to be completed.  &lt;p&gt;For this post I chose to show the how to &lt;strong&gt;execute a callback&lt;/strong&gt; when an asynchronous method completes. There are other methods to use such as using the &lt;a title="How to call a Visual C# method asynchronously" target="_blank" href="http://support.microsoft.com/kb/315582"&gt;EndInvoke() Call Pattern&lt;/a&gt;, using &lt;a title="How to call a Visual C# method asynchronously" target="_blank" href="http://support.microsoft.com/kb/315582"&gt;WaitHandles to Wait for the Call to complete&lt;/a&gt; or the &lt;a title="How to call a Visual C# method asynchronously" target="_blank" href="http://support.microsoft.com/kb/315582"&gt;Polling Call Pattern&lt;/a&gt;. I find a Callback makes the most sense to me.  &lt;p&gt;From my experience I found the following events occur the most in the type of applications I write:  &lt;ol&gt; &lt;li&gt;A control is clicked, indicating that some long-running operation will be fired  &lt;li&gt;Controls on the user interface needs to be set  &lt;li&gt;Long-running operation is started  &lt;li&gt;Long-running operation retrieves/generates data/updates user interface and/or performs magic  &lt;li&gt;Long-running operation ends  &lt;li&gt;Controls on the user interface needs to be set/populated&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;If we look at my code example, the above-mentioned steps are mapped to the following methods:  &lt;ol&gt; &lt;li&gt;&lt;font size="1" face="Courier New"&gt;private void buttonGo_Click(object sender, EventArgs e)&lt;/font&gt;  &lt;li&gt;&lt;font size="1" face="Courier New"&gt;private void SetFormControls(bool Enabled)&lt;/font&gt; in Step 1  &lt;li&gt;&lt;font size="1" face="Courier New"&gt;private bool SomeLongOperation()&lt;/font&gt; in Step 1  &lt;li&gt;&lt;font size="1" face="Courier New"&gt;private bool SomeLongOperation()&lt;/font&gt;  &lt;li&gt;&lt;font size="1" face="Courier New"&gt;private void SomeLongOperationCallBack(IAsyncResult result)&lt;/font&gt;  &lt;li&gt;&lt;font size="1" face="Courier New"&gt;private void SetFormControls(bool Enabled)&lt;/font&gt; in Step 5&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Now for the code. I've (over-)commented the code to help explain. The example starts an asynchronous operation, updates a control on the form and executes a callback when done. It's a simple example, but I am of the opinion that it covers all of the basics. &lt;/p&gt; &lt;div style="padding-bottom: 0px; overflow-x: auto; overflow-y: auto; margin: 0px; padding-left: 0px; width: 480px; padding-right: 0px; display: inline; float: none; height: 1024px; overflow: scroll; padding-top: 0px" class="wlWriterSmartContent"&gt;&lt;pre style="overflow-x: scroll; overflow-y: scroll; background-color: white; overflow: auto"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Text;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Threading;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Windows.Forms;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000"&gt; WindowsFormsApplicationDemo&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;partial&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt; frmDemo : Form&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; frmDemo()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; Creates a delegate with the same signature as the method used for a long operation&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; In this case we'll use SomeLongOperation()&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&lt;span style="color: #000000"&gt; SomeLongOperationDelegate();&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; Creates a delegate with the same signature as the method used to update the UI&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; In this case we'll use UpdateUIHelper(string value)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; UpdateUIDelegate(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; value);&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; Creates a delegate with the same signature as the method used to set form controls&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; In this case we'll use SetFormControls(bool Enabled)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; SetFormControlsDelegate(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&lt;span style="color: #000000"&gt; Enabled);&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; User actions start the long-running operation&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Step 1, 2 and 3&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; buttonGo_Click(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt; sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            SetFormControls(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.UpdateUI(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Starting...&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; create an instance of SomeLongOperationDelegate&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            SomeLongOperationDelegate someLongOperationDelegate &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; SomeLongOperationDelegate(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SomeLongOperation);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; start asynchronous operation, pass someLongOperationDelegate as a parameter, so we can get it back later on callback&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            someLongOperationDelegate.BeginInvoke(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; AsyncCallback(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SomeLongOperationCallBack), someLongOperationDelegate);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Sets any controls on the form that you want to have set prior to starting the long operation&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="Enabled"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Enable or disable controls&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; SetFormControls(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&lt;span style="color: #000000"&gt; Enabled)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; update any controls here, if you want to (such as enable or disable controls)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; this.buttonGo.Enabled = Enabled;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Long operation such as a call to the database&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Step 4&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;bool value to indicate success&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&lt;span style="color: #000000"&gt; SomeLongOperation()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; perform some longish operation&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; i &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;; i &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;; i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.UpdateUI(&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; StringBuilder(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Operation busy &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).&lt;br /&gt;                        Append(i.ToString()).&lt;br /&gt;                        Append(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;... (Managed TID: &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).&lt;br /&gt;                        Append(Thread.CurrentThread.ManagedThreadId.ToString()).&lt;br /&gt;                        Append(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;)&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).ToString());&lt;br /&gt;&lt;br /&gt;                Thread.Sleep(&lt;/span&gt;&lt;span style="color: #800080"&gt;150&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; CallBack for the someLongOperationDelegate instance&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Step 5 and 6&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="result"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;IAsyncResult object&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; SomeLongOperationCallBack(IAsyncResult result)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; original delegate passed in the asyncState parameter, get it back here&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            ((SomeLongOperationDelegate)result.AsyncState).EndInvoke(result);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; update the user interface&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.UpdateUI(&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; StringBuilder(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;CallBack (Managed TID: &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).&lt;br /&gt;                    Append(Thread.CurrentThread.ManagedThreadId.ToString()).&lt;br /&gt;                    Append(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;)&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).ToString());&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; start an asynchronous operation to set the controls on the form&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.BeginInvoke(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; SetFormControlsDelegate(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SetFormControls), &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt;[] { &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt; });&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Checks whether or not an Invoke is required and calls the method accordingly&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="value"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;value of string to go into the listbox&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; UpdateUI(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; value)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; if the calling thread is not the same thread that created the controls to be updated&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; call an Invoke to update controls&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.InvokeRequired)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.Invoke(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; UpdateUIDelegate(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.UpdateUIHelper), &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt;[] { value });&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.UpdateUIHelper(value);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Updates the user interface with whatever needs to be updated&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="value"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;value of string to go into the listbox&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; UpdateUIHelper(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; value)&lt;br /&gt;        {&lt;br /&gt;            listboxResults.Items.Add(&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; StringBuilder(value).&lt;br /&gt;                    Append(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt; (Parent Managed TID: &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).&lt;br /&gt;                    Append(Thread.CurrentThread.ManagedThreadId.ToString()).&lt;br /&gt;                    Append(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;)&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).ToString());&lt;br /&gt;&lt;br /&gt;            listboxResults.SelectedIndex &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (listboxResults.Items.Count &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Some afterthoughts:&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Make sure that you understand delegates and their use&lt;/strong&gt;. They are very helpful and are needed when you want to make more use of events you application.&lt;br&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Disable the controls&lt;/strong&gt; that initiate the long-running operation if they are only needed for that purpose. Other controls such are grids or items that are updated to indicate progress, should be visible. Grids or controls populated with large amounts of data, may want to made invisible while the long-running operation is populating them.&lt;br&gt;&lt;br /&gt;&lt;li&gt;Make sure that you understand how Winforms &lt;strong&gt;managed threads&lt;/strong&gt; are used. It will help you understand why you need to Invoke to update controls.&lt;br&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;&lt;u&gt;&lt;/u&gt;&lt;/em&gt;When using BeginInvoke on a delegate, make sure you call EndInvoke to &lt;strong&gt;free any resources&lt;/strong&gt;.&amp;nbsp; When doing a this.BeginInvoke(...) and there are no results to harvest, you do not need to call EndInvoke(). Chris Sells has a paragraph or two in his book, &lt;a type="amzn" asin="0321116208"&gt;Windows Forms Programming in C#&lt;/a&gt;. There are numerous discussions on BeginInvoke/EndInvoke available on the Internet, but from my experience, when following this simple rule, you should be ok.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Please feel free to comment on this post.&amp;nbsp; It is always interesting to hear the opinions from other people.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;u&gt;Environment:&lt;/u&gt;&lt;br&gt;Microsoft ® Visual Studio 2008&lt;br&gt;Microsoft ® .NET framework 3.5&lt;br&gt;Microsoft ® Windows XP (SP3)&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-3237030353079014698?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/3237030353079014698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=3237030353079014698' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3237030353079014698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3237030353079014698'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2008/10/c-asynchronous-methods-with-callback.html' title='C# Asynchronous methods with CallBack'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-7953352435056962145</id><published>2008-08-22T11:12:00.000+02:00</published><updated>2008-08-22T11:19:04.850+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Base32 encoding in C#</title><content type='html'>&lt;p&gt;In my &lt;a title="sdbm hashing in C#" href="http://christogreeff.blogspot.com/2008/06/sdbm-hashing-in-c.html" target="_blank"&gt;previous post&lt;/a&gt;, I hashed a C# uint value using the sdbm hashing function. But what if you want to convert the hashed value to Base32? Unfortunately there's no built-in function to accomplish this, but help is at hand.&lt;/p&gt; &lt;p&gt;I based my function on &lt;a title="Computer Science, Business, Blogging, and Technology Blog by Luke Hoersten" href="http://humani.st/base32-encoding-in-c-java/" target="_blank"&gt;this&lt;/a&gt; implementation, making only 1 or 2 minor changes. You may also refer to &lt;a title="The Base16, Base32, and Base64 Data Encodings" href="http://www.ietf.org/rfc/rfc3548.txt" target="_blank"&gt;RFC3548&lt;/a&gt; for more reading on the subject.&lt;/p&gt; &lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline"&gt;&lt;pre style="overflow-y: auto; overflow-x: auto; overflow: scroll; width: 480px; height: 480px; background-color: white"&gt;&lt;div&gt;&lt;span style="color: #000000" ; overflow-y: overflow-x: scroll; overflow: auto;&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Encode to base 32 according to RFC3548&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="data"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;byte array to encode&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;string value&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; Base32Encode(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[] data, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; size)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; i &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; index &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; digit &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; current_byte;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; next_byte;&lt;br /&gt;&lt;br /&gt;        StringBuilder result &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; StringBuilder();&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt; (i &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; data.Length)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; unsign&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            current_byte &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (data[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt; data[i] : (data[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;256&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; is the current digit going to span a byte boundary&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (index &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; (IN_BYTE_SIZE &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; OUT_BYTE_SIZE))&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; ((i &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; data.Length)&lt;br /&gt;                    next_byte &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (data[i &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt; data[i &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;] : (data[i &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;256&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    next_byte &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;br /&gt;                digit &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; current_byte &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;0xFF&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; index);&lt;br /&gt;                index &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (index &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; OUT_BYTE_SIZE) &lt;/span&gt;&lt;span style="color: #000000"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt; IN_BYTE_SIZE;&lt;br /&gt;                digit &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; index;&lt;br /&gt;                digit &lt;/span&gt;&lt;span style="color: #000000"&gt;|=&lt;/span&gt;&lt;span style="color: #000000"&gt; next_byte &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; (IN_BYTE_SIZE &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; index);&lt;br /&gt;                i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                digit &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (current_byte &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; (IN_BYTE_SIZE &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; (index &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; OUT_BYTE_SIZE))) &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0x1F&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;                index &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (index &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; OUT_BYTE_SIZE) &lt;/span&gt;&lt;span style="color: #000000"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt; IN_BYTE_SIZE;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (index &lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                    i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            result.Append(alphabet[digit]);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; trim the result to a specific size&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; result.ToString().Substring(&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;, size &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; result.Length &lt;/span&gt;&lt;span style="color: #000000"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt; size : result.Length);&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;If you have a specific question (not necessarily related to this post), let me know and we can see what solutions are available.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;u&gt;Environment:&lt;/u&gt;&lt;br&gt;Microsoft ® Visual Studio 2008&lt;br&gt;Microsoft ® .NET framework 3.5&lt;br&gt;Microsoft ® Windows XP (SP3)&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-7953352435056962145?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/7953352435056962145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=7953352435056962145' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/7953352435056962145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/7953352435056962145'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2008/08/base32-encoding-in-c.html' title='Base32 encoding in C#'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-3103898606254395393</id><published>2008-08-21T11:26:00.000+02:00</published><updated>2008-08-21T11:26:57.585+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>sdbm hashing in C#</title><content type='html'>&lt;p&gt;&lt;a title="sdbm" href="http://search.cpan.org/src/RGARCIA/perl-5.10.0/ext/SDBM_File/sdbm/README" target="_blank"&gt;sdbm - Substitute DBM or Berkeley ndbm for Every UN*X Made Simple&lt;/a&gt; is a &lt;a title="Hash function" href="http://en.wikipedia.org/wiki/Hash_function" target="_blank"&gt;hashing&lt;/a&gt; function I have never used before. To be honest, hashing is something I hardly ever *cough*never*cough* use. &lt;/p&gt; &lt;p&gt;So, how do you convert the simple sdbm hashing function from C++ to C#. I'm not asking. I'm going to tell you, because from my search in Google, it seems not a lot of people have attempted. Luckily I remember most of the C++ basics. De-referencing (pointers), addresses... you know, the things you tend to forget when working with C#.&lt;/p&gt; &lt;p&gt;C++ code:&lt;/p&gt; &lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline"&gt;&lt;pre style="overflow: auto; background-color: white"&gt;&lt;div&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; unsigned &lt;/span&gt;&lt;span style="color: #0000ff"&gt;long&lt;/span&gt;&lt;span style="color: #000000"&gt; sdbm(unsigned &lt;/span&gt;&lt;span style="color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt;str)&lt;br /&gt;    {&lt;br /&gt;        unsigned &lt;/span&gt;&lt;span style="color: #0000ff"&gt;long&lt;/span&gt;&lt;span style="color: #000000"&gt; hash &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; c;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt; (c &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt;str&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;            hash &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; c &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; (hash &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;6&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; (hash &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;16&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; hash;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; hash;&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;C# code:&lt;/p&gt;&lt;br /&gt;&lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline"&gt;&lt;pre style="overflow: auto; background-color: white"&gt;&lt;div&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; sdbm hashing function&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="byteArr"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Array of bytes to hash&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;uint&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt; sdbm(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[] byteArr)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt; hash &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt; b &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; byteArr)&lt;br /&gt;            hash &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; b &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; (hash &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;6&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; (hash &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;16&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; hash;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; hash;&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The trick is to simply pass an array of bytes to the C# function. A byte in C# has the same size as the unsigned char datatype in C++. But how do I pass an uint object as an array of bytes? Simple.&lt;/p&gt;&lt;br /&gt;&lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline"&gt;&lt;pre style="overflow: auto; background-color: white"&gt;&lt;div&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; GetSomeIDFromSomewhere();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt; Hash &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; sdbm(BitConverter.GetBytes(value));&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The C# BitConverter class converts a value to an array of bytes, which is exactly what we needed for the sdbm function.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;That's it. For the next post, I'll encode&amp;nbsp; the hashed value to Base32. And as always, leave a comment if you found this useful.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;u&gt;Environment:&lt;/u&gt;&lt;br&gt;Microsoft ® Visual Studio 2008&lt;br&gt;Microsoft ® .NET framework 3.5&lt;br&gt;Microsoft ® Windows XP (SP3)&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-3103898606254395393?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/3103898606254395393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=3103898606254395393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3103898606254395393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3103898606254395393'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2008/06/sdbm-hashing-in-c.html' title='sdbm hashing in C#'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-4258299708565357459</id><published>2008-07-05T18:59:00.001+02:00</published><updated>2008-07-10T09:56:11.930+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rant'/><title type='text'>3G Data Charges</title><content type='html'>&lt;p&gt;Earlier I read a &lt;a title="Dear Facebook" href="http://www.arbitraryuser.com/blog/2008/07/04/dear-facebook/#comments" target="_blank"&gt;post&lt;/a&gt; by &lt;a title="Jonathan Endersby" href="http://www.arbitraryuser.com/blog/" target="_blank"&gt;Jonathan Endersby&lt;/a&gt; on how &lt;a title="Vodacom" href="http://www.vodacom.co.za" target="_blank"&gt;Vodacom&lt;/a&gt; is violating &lt;a title="Facebook" href="http://www.facebook.com" target="_blank"&gt;Facebook&lt;/a&gt; copyright, by displaying/adding advertisements on the mobile versions of Facebook.&lt;/p&gt; &lt;p&gt;Someone made the following comment on his post:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Plus, does it result in extra bandwidth charges for the consumer? (Those little bits of information do add up over time.)&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Yes, those little bits do add up over time, and recently &lt;strike&gt;I've&lt;/strike&gt; &lt;a href="http://hannesfoulds.blogspot.com" target="_blank"&gt;Hannes&lt;/a&gt; and I also started wondering about those &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;The data bundle on 2779....... has already been depleted and out-of-bundle rates are applicable...&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/christogreeff/SG-oWB5QW1I/AAAAAAAAAJ8/QP7-2tCylMI/lauchpad%5B3%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="lauchpad" align="left" src="http://lh3.ggpht.com/christogreeff/SG-oZL_f5ZI/AAAAAAAAAKA/xz3r9TRpRr8/lauchpad_thumb%5B1%5D.png" width="244" height="148"&gt;&lt;/a&gt;SMS's that I get whenever I've used my 3G data bundle. &lt;/p&gt; &lt;p&gt;These SMS's always arrive a day or two after I've depleted my bundle. I would have liked to be cut off immediately when I used my data bundle.&amp;nbsp; If Vodacom charges me and everyone else the out-of-bundle rates for a day or two, they stand to generate a lot of additional income. &lt;/p&gt; &lt;p&gt;Quite of clever way of generating income. Just delay those "out-of-bundle" SMS's a day or two. Or am I paranoid?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-4258299708565357459?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/4258299708565357459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=4258299708565357459' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/4258299708565357459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/4258299708565357459'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2008/07/3g-data-charges.html' title='3G Data Charges'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/christogreeff/SG-oZL_f5ZI/AAAAAAAAAKA/xz3r9TRpRr8/s72-c/lauchpad_thumb%5B1%5D.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-3946171234967788372</id><published>2008-06-30T11:19:00.001+02:00</published><updated>2008-07-01T08:36:34.131+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GDI+'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><title type='text'>HSL to RGB Conversion for GDI+</title><content type='html'>&lt;p&gt;I have something to confess. &lt;/p&gt; &lt;p&gt;I have never truly understood the difference between RGB and HSL. There, I said it. :-D&lt;/p&gt; &lt;p&gt;Sure, I understood the basic idea, but I have never made an effort to investigate exactly how to convert from HSL to RGB. So, in an attempt to form a better understanding, I wrote a simple class that can convert from a HSL colour to a RGB colour. C# already exposes the GetHue(), GetSaturation() and GetBrigtness() methods on an object instance of type System.Drawing.Color, so the conversion was a one way affair from HSL to RGB.&lt;/p&gt; &lt;p&gt;The code below is pretty self-explanatory. I implemented the conversion routine from &lt;a title="Wikipedia Conversion from HSL to RGB" href="http://en.wikipedia.org/wiki/HSV_color_space#Conversion_from_HSL_to_RGB" target="_blank"&gt;Wikipedia&lt;/a&gt; and tested drawing some graphs using GDI+.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div style="padding-right: 0px; overflow-y: auto; padding-left: 0px; float: none; overflow-x: auto; padding-bottom: 0px; margin: 0px; overflow: scroll; padding-top: 0px; display: inline;"&gt;&lt;pre style="overflow-y: scroll; overflow-x: scroll; overflow: auto; height: 480px; width: 480px; background-color: white"&gt;&lt;div&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;----------------------------------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; Namespace Christo.GFX.Conversion&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; Author: Christo Greeff&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; Date: 24/June/2008&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;----------------------------------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; 24/June/2008 : New: GFXConversionException, HSL&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;----------------------------------------------------------------------&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Drawing;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000"&gt; Christo.GFX.Conversion&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Color Util Exception&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt; GFXConversionException : Exception&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; GFXConversionException(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; message, Exception innerException)&lt;br /&gt;            : &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span style="color: #000000"&gt;(message, innerException)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;ToDo: Implement if needed&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; HSL (Hue/Saturation/Luminance) Class&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt; HSL&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;#region&lt;/span&gt;&lt;span style="color: #000000"&gt; Private members&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; private hue&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; _h;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; private saturation&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; _s;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; private luminance&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; _l;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;#endregion&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Constructor&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; HSL()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.HSLHelper(&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; (Exception ee)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; GFXConversionException(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;HSL Constructor Error&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, ee);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Constructor with ARGB color&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="color"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;System.Drawing.Color value&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; HSL(Color color)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.HSLHelper(color.GetHue() &lt;/span&gt;&lt;span style="color: #000000"&gt;/&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;360.0&lt;/span&gt;&lt;span style="color: #000000"&gt;, color.GetSaturation(), color.GetBrightness());&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; (Exception ee)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; GFXConversionException(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;HSL Constructor Error&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, ee);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Constructor with RGB color&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="R"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Red component with a value from 0 to 255&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="G"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Green component with a value from 0 to 255&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="B"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Blue component with a value from 0 to 255&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; HSL(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt; R, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt; G, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt; B)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                Color temp &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Color.FromArgb(R, G, B);&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.HSLHelper(temp.GetHue() &lt;/span&gt;&lt;span style="color: #000000"&gt;/&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;360.0&lt;/span&gt;&lt;span style="color: #000000"&gt;, temp.GetSaturation(), temp.GetBrightness());&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; (Exception ee)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; GFXConversionException(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;HSL Constructor Error&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, ee);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Constructor with HSL&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="Hue"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Varies from magenta - red - yellow - green - cyan - blue - magenta, described as an angle around a circle from 0.0 - 360.0 degrees&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="Saturation"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Varies from 0.0 and 1.0 and describes how "grey" the colour is, with 0 being completely unsaturated (grey, white or black) and 1 being completely saturated&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="Luminance"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Varies from 0.0 and 1.0 and ranges from black at 0.0, through the standard colour itself at 0.5 to white at 1.0&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; HSL(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; Hue, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; Saturation, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; Luminance)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.HSLHelper(Hue, Saturation, Luminance);&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; (Exception ee)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; GFXConversionException(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;HSL Constructor Error&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, ee);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; HSL Helper&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="Hue"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Varies from magenta - red - yellow - green - cyan - blue - magenta, described as an angle around a circle from 0.0 - 360.0 degrees&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="Saturation"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Varies from 0.0 and 1.0 and describes how "grey" the colour is, with 0 being completely unsaturated (grey, white or black) and 1 being completely saturated&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="Luminance"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Varies from 0.0 and 1.0 and ranges from black at 0.0, through the standard colour itself at 0.5 to white at 1.0&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; HSLHelper(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; Hue, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; Saturation, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; Luminance)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.H &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Hue;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.S &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Saturation;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.L &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Luminance;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; (Exception ee)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; GFXConversionException(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;HSL HSLHelper Error&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, ee);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Set helper function&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="value"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;value that must be between 0 and 1&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;double value&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; SetHelper(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; value)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; (value &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1.0&lt;/span&gt;&lt;span style="color: #000000"&gt; : (value &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt; : value;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; (Exception ee)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; GFXConversionException(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;HSL SetHelper Error&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, ee);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Gets or sets the Hue value&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; H&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._h;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._h &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SetHelper(value);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Gets or sets the Saturation value&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; S&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._s;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._s &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SetHelper(value);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Gets or sets the Luminance value&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; L&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._l;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._l &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SetHelper(value);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;para&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Convert from the current HSL to RGB&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/para&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;para&amp;gt;&lt;/span&gt;&lt;span style="color: #008000; text-decoration: underline"&gt;http://en.wikipedia.org/wiki/HSV_color_space&lt;/span&gt;&lt;span style="color: #008000"&gt;#Conversion_from_HSL_to_RGB&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/para&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; Color Color&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt;[] t &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt;[] { &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt; };&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; tH &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._h;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; tS &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._s;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; tL &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._l;&lt;br /&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (tS.Equals(&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;))&lt;br /&gt;                    {&lt;br /&gt;                        t[&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; t[&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; t[&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; tL;&lt;br /&gt;                    }&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    {&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; q, p;&lt;br /&gt;&lt;br /&gt;                        q &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; tL &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0.5&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt; tL &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; tS) : tL &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; tS &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; (tL &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; tS);&lt;br /&gt;                        p &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; tL &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; q;&lt;br /&gt;&lt;br /&gt;                        t[&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; tH &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;1.0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;/&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;3.0&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;                        t[&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; tH;&lt;br /&gt;                        t[&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; tH &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;1.0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;/&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;3.0&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt; i &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;; i &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;; i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                        {&lt;br /&gt;                            t[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; t[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt; t[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1.0&lt;/span&gt;&lt;span style="color: #000000"&gt; : t[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt; t[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1.0&lt;/span&gt;&lt;span style="color: #000000"&gt; : t[i];&lt;br /&gt;&lt;br /&gt;                            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (t[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;6.0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1.0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                                t[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; p &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; ((q &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; p) &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;6&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; t[i]);&lt;br /&gt;                            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (t[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;2.0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1.0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                                    t[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; q;&lt;br /&gt;                                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (t[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;3.0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;2.0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                                        t[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; p &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; ((q &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; p) &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;6&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; ((&lt;/span&gt;&lt;span style="color: #800080"&gt;2.0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;/&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;3.0&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; t[i]));&lt;br /&gt;                                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                                        t[i] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; p;&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; (Exception ee)&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; GFXConversionException(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;HSL Color Error&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, ee);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; Color.FromArgb((&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;)(t[&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;255&lt;/span&gt;&lt;span style="color: #000000"&gt;), (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;)(t[&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;255&lt;/span&gt;&lt;span style="color: #000000"&gt;), (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;)(t[&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;255&lt;/span&gt;&lt;span style="color: #000000"&gt;));&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Modify the current HSL brightness&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="brightness"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;brightness value&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;HSL&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; HSL BrightnessHelper(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; brightness)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.L &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.L &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; brightness;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; (Exception ee)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; GFXConversionException(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;HSL BrightnessHelper Error&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, ee);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; HSL(H, S, L);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Modify the current HSL brightness&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="brightness"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;brightness value&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;HSL&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; HSL Brightness(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; brightness)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.BrightnessHelper(brightness);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Modify the current HSL brightness&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="brightness"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;brightness value&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Color&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; Color BrightnessC(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt; brightness)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.BrightnessHelper(brightness).Color;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;As always, comments are welcome. Yes, even the critiquing ones.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;u&gt;Environment:&lt;br&gt;&lt;/u&gt;Microsoft ® Visual Studio 2008&lt;br&gt;Microsoft ® .NET framework 3.5&lt;br&gt;Microsoft ® Windows XP (SP3)&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-3946171234967788372?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/3946171234967788372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=3946171234967788372' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3946171234967788372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3946171234967788372'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2008/06/hsl-to-rgb-conversion-for-gdi.html' title='HSL to RGB Conversion for GDI+'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-2988178430140604733</id><published>2008-06-02T09:46:00.001+02:00</published><updated>2008-06-02T09:46:08.596+02:00</updated><title type='text'>Tetrominoe</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/christogreeff/SEOlOkTY20I/AAAAAAAAAJs/aFY8P0Z26LI/s1600-h/tetris%5B6%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="tetris" align="left" src="http://lh5.ggpht.com/christogreeff/SEOlPUTY21I/AAAAAAAAAJ0/_HtMEbtQrC8/tetris_thumb%5B4%5D.png?imgmax=800" width="135" height="297"&gt;&lt;/a&gt; I finished my &lt;a title="Tetris" href="http://en.wikipedia.org/wiki/Tetris" target="_blank"&gt;Tetris&lt;/a&gt; clone on the weekend. I found it quite a simple game to write, and my console version has 4 main parts:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;u&gt;Tetrominoe class:&lt;/u&gt;&lt;/em&gt;&lt;br&gt;Tetrominoe properties, information on how to draw each of the 7 Tetrominoes, moving and rotation.&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;u&gt;Grid class:&lt;/u&gt;&lt;/em&gt;&lt;br&gt;Grid properties, dropped Tetrominoes and processing of completed lines. Events indicate whether the Grid has been updated with a new Tetrominoe.&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;u&gt;TetrisProcessor class:&lt;/u&gt;&lt;/em&gt;&lt;br&gt;This class overlays the current Tetrominoe on the Grid, fills the Grid with dropped Tetrominoes, checks whether a Tetrominoe can move and handles creation of new Tetrominoes. This is the class that performs all the processing for the game.&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;u&gt;Main class:&lt;/u&gt;&lt;/em&gt;&lt;br&gt;The main class is the normal console application class, which interacts with the TetrisProcessor class. Keystrokes, drawing and timing of the game happens here.&lt;/p&gt; &lt;p&gt;The next step is to use this Tetris engine for a &lt;a title="Windows Presentation Foundation" href="http://en.wikipedia.org/wiki/Windows_Presentation_Foundation" target="_blank"&gt;WPF&lt;/a&gt; version of the game. So the next time I post about this, expect a WPF Tetris clone, which I'll make available for download. ;-)&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;u&gt;Environment:&lt;/u&gt;&lt;br&gt;Microsoft ® Visual Studio 2008&lt;br&gt;Microsoft ® .NET framework 3.5&lt;br&gt;Microsoft ® Windows XP (SP3)&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-2988178430140604733?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/2988178430140604733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=2988178430140604733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/2988178430140604733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/2988178430140604733'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2008/06/tetrominoe.html' title='Tetrominoe'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/christogreeff/SEOlPUTY21I/AAAAAAAAAJ0/_HtMEbtQrC8/s72-c/tetris_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-1201934909079996382</id><published>2008-05-08T08:09:00.001+02:00</published><updated>2008-07-01T08:39:17.673+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>How to rotate a non-jagged, rectangular (2d) array</title><content type='html'>&lt;p&gt;Have you ever needed to rotate (or turn) the contents of a 2d array (non-jagged: same width and height)? Well, recently I needed to do just that.&amp;nbsp; A single function makes it possible. &lt;/p&gt; &lt;p&gt;Luckily it's not difficult at all. The rotation is really just a matter of re-arranging the contents of the array. In other words, moving each y dimension from the source array to the x dimension in the destination array. &lt;/p&gt; &lt;div style="padding-right: 0px; overflow-y: auto; padding-left: 0px; float: none; overflow-x: auto; padding-bottom: 0px; margin: 0px; overflow: scroll; padding-top: 0px; display: inline"&gt;&lt;pre style="overflow-y: scroll; overflow-x: scroll; overflow: auto; background-color: white; height: 480px; width: 480px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000"&gt; ConsoleAppRotateArr&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt; Program&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; Main(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; create a shape&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt;[,] shape &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;];&lt;br /&gt;            shape[&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;            shape[&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;            shape[&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;            shape[&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;            shape[&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;            shape[&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;            shape[&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;            shape[&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;            shape[&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; rotate the shape left&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            shape &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Rotate(shape, Rotation.Left);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Rotation direction&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;enum&lt;/span&gt;&lt;span style="color: #000000"&gt; Rotation&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Turn left 90 degrees (counter clockwise)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            Left,&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Turn right 90 degrees (clockwise)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            Right&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Rotate a non-jagged, rectangular array&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="grid"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Non-jagged, rectangular array&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="rotate"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Rotation direction enum&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Non-jagged, rectangular array&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt;[,] Rotate(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt;[,] grid, Rotation rotate)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; get array dimensions&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt; xl &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt;)grid.GetLength(&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt; yl &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt;)grid.GetLength(&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; only rotate non-jagged, rectangular array&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (xl.Equals(yl))&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt;[,] temp &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;uint&lt;/span&gt;&lt;span style="color: #000000"&gt;[xl, yl];&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; y &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;; y &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; yl; y&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; x &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;; x &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; xl; x&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (rotate.Equals(Rotation.Right))&lt;br /&gt;                            temp[yl &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; y &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;, x] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; grid[x, y];&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                            temp[y, xl &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; x &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; grid[x, y];&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; temp;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; grid;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The approach is probably not suitable for very large arrays. This method however, was perfect for the small arrays, such as a tetris block. ;)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Like always, I would appreciate comments or suggestions on the code.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;u&gt;Environment:&lt;/u&gt;&lt;/em&gt;&lt;br&gt;&lt;em&gt;Microsoft ® Visual Studio 2008&lt;br&gt;Microsoft ® .NET framework 3.5&lt;br&gt;Microsoft ® Windows XP (SP2)&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-1201934909079996382?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/1201934909079996382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=1201934909079996382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/1201934909079996382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/1201934909079996382'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2008/05/how-to-rotate-non-jagged-rectangular-2d.html' title='How to rotate a non-jagged, rectangular (2d) array'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-8947052581577770088</id><published>2008-04-08T10:47:00.001+02:00</published><updated>2008-07-01T08:40:35.213+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Extending the TreeView control with drag &amp; drop</title><content type='html'>&lt;p&gt;The TreeView control in C# is quite a useful control used to visualize items in a tree. Unfortunately (or fortunately, if you like figuring things out) you still have to write your code to allow drag and drop of the TreeNode items when you have populated the control.&lt;/p&gt; &lt;p&gt;I've written a simple BuilderTreeView component based on the TreeView control, which allows the TreeNode items to be drag and dropped. &lt;/p&gt; &lt;p&gt;So far the control has the following additional characteristics over the normal TreeView control:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Drag &amp;amp; Drop nodes  &lt;li&gt;Move up/down of nodes  &lt;li&gt;Move child nodes to the root  &lt;li&gt;Auto scroll when dragging nodes up/down  &lt;li&gt;Basic context menu&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Below is the code. It's still in progress, and not final, but at least it's usable and I've tested it in some scenarios.&lt;/p&gt; &lt;p&gt;I do believe there are other ways of doing this, so leave a comment if you have experienced different ways of implementing drag &amp;amp; drop. :)&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div style="padding-right: 0px; overflow-y: auto; padding-left: 0px; float: none; overflow-x: auto; padding-bottom: 0px; margin: 0px; overflow: scroll; padding-top: 0px; display: inline;"&gt;&lt;pre style="width: 480px; height: 480px; overflow-y: scroll; overflow-x: scroll; overflow: auto; background-color: white"&gt;&lt;span style="color: #008080"&gt;  1&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000"&gt; Builder&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;  2&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;  3&lt;/span&gt; &lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt; BuilderTreeView : TreeView&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;  4&lt;/span&gt; &lt;span style="color: #000000"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;  5&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; private members&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;  6&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; TreeNode _draggedNode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;  7&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; ContextMenu _defaultContextMenu &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;  8&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;  9&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 10&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; MoveDirection enum&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 11&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 12&lt;/span&gt; &lt;span style="color: #808080"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;enum&lt;/span&gt;&lt;span style="color: #000000"&gt; MoveDirection&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 13&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 14&lt;/span&gt; &lt;span style="color: #000000"&gt;            MoveUp,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 15&lt;/span&gt; &lt;span style="color: #000000"&gt;            MoveDown&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 16&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 17&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 18&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; default constructor&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 19&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; BuilderTreeView()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 20&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 21&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; allow drag &amp;amp; drop&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 22&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.AllowDrop &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 23&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 24&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;#region&lt;/span&gt;&lt;span style="color: #000000"&gt; Create default context menu&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 25&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 26&lt;/span&gt; &lt;span style="color: #000000"&gt;            MenuItem[] menuItems &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; MenuItem[] { &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 27&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; MenuItem(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Move to &amp;amp;Root&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; EventHandler(DefaultContextMenu_MoveToRoot_Eventhandler)) { Name &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;mniMoveToRoot&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 28&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; MenuItem(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;-&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;),&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 29&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; MenuItem(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Move &amp;amp;Up&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; EventHandler(DefaultContextMenu_MoveUp_Eventhandler)) { Name &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;mniMoveUp&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 30&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; MenuItem(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Move &amp;amp;Down&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; EventHandler(DefaultContextMenu_MoveDown_Eventhandler)) { Name &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;mniMoveDown&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 31&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; MenuItem(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;-&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;),&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 32&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; MenuItem(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;amp;Expand&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; EventHandler(DefaultContextMenu_Expand_Eventhandler)) { Name &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;mniExpand&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 33&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; MenuItem(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;amp;Collapse&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; EventHandler(DefaultContextMenu_Collapse_Eventhandler)) { Name &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;mniCollapse&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 34&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; MenuItem(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;-&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;),&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 35&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; MenuItem(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;E&amp;amp;xpand All&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; EventHandler(DefaultContextMenu_ExpandAll_Eventhandler)) { Name &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;mniExpandAll&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 36&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; MenuItem(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;C&amp;amp;ollapse All&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; EventHandler(DefaultContextMenu_CollapseAll_Eventhandler)) { Name &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;mniCollapseAll&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 37&lt;/span&gt; &lt;span style="color: #000000"&gt;        };&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 38&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 39&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; create contect menu&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 40&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._defaultContextMenu &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; ContextMenu(menuItems);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 41&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._defaultContextMenu.Popup &lt;/span&gt;&lt;span style="color: #000000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; EventHandler(_defaultContextMenu_Popup);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 42&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 43&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; assign context menu&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 44&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.ContextMenu &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._defaultContextMenu;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 45&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 46&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;#endregion&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 47&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 48&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 49&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;#region&lt;/span&gt;&lt;span style="color: #000000"&gt; DefaultContextMenu/MenuItem Eventhandlers&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 50&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 51&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; DefaultContextMenu, Popup Eventhandler&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 52&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; _defaultContextMenu_Popup(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt; sender, EventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 53&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 54&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; enable MenuItems when a node is selected&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 55&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; i &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;; i &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; _defaultContextMenu.MenuItems.Count &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;; i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 56&lt;/span&gt; &lt;span style="color: #000000"&gt;                _defaultContextMenu.MenuItems[i].Enabled &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 57&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 58&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; enable nodes by criteria&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 59&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 60&lt;/span&gt; &lt;span style="color: #000000"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 61&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; check if node is a root node&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 62&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                _defaultContextMenu.MenuItems[&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;mniMoveToRoot&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;].Enabled &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode.Parent &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 63&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 64&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; check if node is at the top&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 65&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                _defaultContextMenu.MenuItems[&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;mniMoveUp&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;].Enabled &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode.PrevNode &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 66&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 67&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; check if node is at the bottom&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 68&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                _defaultContextMenu.MenuItems[&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;mniMoveDown&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;].Enabled &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode.NextNode &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 69&lt;/span&gt; &lt;span style="color: #000000"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 70&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 71&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 72&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; DefaultContextMenu, MoveToRoot MenuItem Eventhandler&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 73&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; DefaultContextMenu_MoveToRoot_Eventhandler(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt; sender, EventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 74&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 75&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.Nodes.Add((TreeNode)&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode.Clone());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 76&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode.Remove();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 77&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 78&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 79&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; DefaultContextMenu, MoveUp MenuItem Eventhandler&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 80&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; DefaultContextMenu_MoveUp_Eventhandler(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt; sender, EventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 81&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 82&lt;/span&gt; &lt;span style="color: #000000"&gt;            MoveNode(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode, MoveDirection.MoveUp);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 83&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 84&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 85&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; DefaultContextMenu, MoveDown MenuItem Eventhandler&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 86&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; DefaultContextMenu_MoveDown_Eventhandler(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt; sender, EventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 87&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 88&lt;/span&gt; &lt;span style="color: #000000"&gt;            MoveNode(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode, MoveDirection.MoveDown);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 89&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 90&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 91&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; DefaultContextMenu, Expand MenuItem Eventhandler&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 92&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; DefaultContextMenu_Expand_Eventhandler(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt; sender, EventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 93&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 94&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode.Expand();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 95&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 96&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 97&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; DefaultContextMenu, Collapse MenuItem Eventhandler&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 98&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; DefaultContextMenu_Collapse_Eventhandler(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt; sender, EventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 99&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;100&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode.Collapse();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;101&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;102&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;103&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; DefaultContextMenu, ExpandAll MenuItem Eventhandler&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;104&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; DefaultContextMenu_ExpandAll_Eventhandler(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt; sender, EventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;105&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;106&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.ExpandAll();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;107&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;108&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;109&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; DefaultContextMenu, CollapseAll MenuItem Eventhandler&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;110&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; DefaultContextMenu_CollapseAll_Eventhandler(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt; sender, EventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;111&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;112&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.CollapseAll();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;113&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;114&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;115&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;#endregion&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;116&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;117&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;#region&lt;/span&gt;&lt;span style="color: #000000"&gt; Drag Events&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;118&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;119&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; start node drag&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;120&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; OnItemDrag(ItemDragEventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;121&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;122&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._draggedNode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (TreeNode)e.Item;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;123&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._draggedNode;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;124&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;125&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.DoDragDrop(e.Item, DragDropEffects.Move);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;126&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;127&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;128&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; create new node location&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;129&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; OnDragDrop(DragEventArgs drgevent)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;130&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;131&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (drgevent.AllowedEffect.Equals(DragDropEffects.Move))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;132&lt;/span&gt; &lt;span style="color: #000000"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;133&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; get node at drop location&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;134&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                TreeNode dropNode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DroppedOnNode(drgevent);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;135&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;136&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; add to root if new node parent has no parent&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;137&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (dropNode &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;138&lt;/span&gt; &lt;span style="color: #000000"&gt;                    dropNode.Nodes.Add((TreeNode)&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._draggedNode.Clone());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;139&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;140&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.Nodes.Add((TreeNode)&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._draggedNode.Clone());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;141&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;142&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; remove original&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;143&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._draggedNode.Remove();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;144&lt;/span&gt; &lt;span style="color: #000000"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;145&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;146&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;147&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; set DragDropEffects&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;148&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; OnDragEnter(DragEventArgs drgevent)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;149&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;150&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; no external drag &amp;amp; drop allowed&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;151&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            drgevent.Effect &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DragDropEffects.None;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;152&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;153&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;154&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; set Effect when dragging over control items&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;155&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; OnDragOver(DragEventArgs drgevent)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;156&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;157&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; get node at drop location&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;158&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            TreeNode dropNode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DroppedOnNode(drgevent);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;159&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;160&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; scroll if next/prev node is not visible&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;161&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (dropNode &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;162&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (dropNode.NextVisibleNode &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;163&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;dropNode.NextVisibleNode.IsVisible)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;164&lt;/span&gt; &lt;span style="color: #000000"&gt;                        dropNode.NextVisibleNode.EnsureVisible();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;165&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;166&lt;/span&gt; &lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (dropNode.PrevVisibleNode &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;167&lt;/span&gt; &lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;dropNode.PrevVisibleNode.IsVisible)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;168&lt;/span&gt; &lt;span style="color: #000000"&gt;                                dropNode.PrevVisibleNode.EnsureVisible();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;169&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;170&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; valid if the node is not moving to itself, or to one of its child nodes&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;171&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (SameBranch(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;._draggedNode, dropNode))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;172&lt;/span&gt; &lt;span style="color: #000000"&gt;                drgevent.Effect &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DragDropEffects.None;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;173&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;174&lt;/span&gt; &lt;span style="color: #000000"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;175&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; expand collapsed node&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;176&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (dropNode &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;177&lt;/span&gt; &lt;span style="color: #000000"&gt;                    dropNode.Expand();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;178&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;179&lt;/span&gt; &lt;span style="color: #000000"&gt;                drgevent.Effect &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DragDropEffects.Move;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;180&lt;/span&gt; &lt;span style="color: #000000"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;181&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;182&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;183&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; set UseDefaultCursors&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;184&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; OnGiveFeedback(GiveFeedbackEventArgs gfbevent)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;185&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;186&lt;/span&gt; &lt;span style="color: #000000"&gt;            gfbevent.UseDefaultCursors &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;187&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;188&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;189&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;#endregion&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;190&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;191&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;#region&lt;/span&gt;&lt;span style="color: #000000"&gt; Helper functions&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;192&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;193&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;194&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Move a node&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;195&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;196&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="node"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;TreeNode to move&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;197&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="move"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;MoveDirection enum&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;198&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;int&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;199&lt;/span&gt; &lt;span style="color: #808080"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; MoveNode(TreeNode node, MoveDirection move)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;200&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;201&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; default to "no move"&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;202&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; Index &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;203&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt; (move)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;204&lt;/span&gt; &lt;span style="color: #000000"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;205&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; move up if a previous node is found&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;206&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt; MoveDirection.MoveUp:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;207&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (node.PrevNode &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;208&lt;/span&gt; &lt;span style="color: #000000"&gt;                        Index &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.PrevNode.Index;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;209&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;210&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;211&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; move down if a next node is found&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;212&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt; MoveDirection.MoveDown:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;213&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (node.NextNode &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;214&lt;/span&gt; &lt;span style="color: #000000"&gt;                        Index &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.NextNode.Index &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;215&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;216&lt;/span&gt; &lt;span style="color: #000000"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;217&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;218&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; if moveable&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;219&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (Index &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;220&lt;/span&gt; &lt;span style="color: #000000"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;221&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; check for root node&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;222&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (node.Parent &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;223&lt;/span&gt; &lt;span style="color: #000000"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;224&lt;/span&gt; &lt;span style="color: #000000"&gt;                    node.Parent.Nodes.Insert(Index, (TreeNode)node.Clone());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;225&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.Parent.Nodes[Index];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;226&lt;/span&gt; &lt;span style="color: #000000"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;227&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;228&lt;/span&gt; &lt;span style="color: #000000"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;229&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.Nodes.Insert(Index, (TreeNode)node.Clone());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;230&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.SelectedNode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.Nodes[Index];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;231&lt;/span&gt; &lt;span style="color: #000000"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;232&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;233&lt;/span&gt; &lt;span style="color: #000000"&gt;                node.Remove();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;234&lt;/span&gt; &lt;span style="color: #000000"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;235&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;236&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;237&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;238&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Get Node at mouse pointer location&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;239&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;240&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="drgevent"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;DragEventArgs&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;241&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;TreeNode&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;242&lt;/span&gt; &lt;span style="color: #808080"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; TreeNode DroppedOnNode(DragEventArgs drgevent)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;243&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;244&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; get the drop point on the control&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;245&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            Point dropLocation &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.PointToClient(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; Point(drgevent.X, drgevent.Y));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;246&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;247&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; get the node at the drop point&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;248&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;.GetNodeAt(dropLocation));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;249&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;250&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;251&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;252&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Check if a dragged node is the same, or on the same node branch&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;253&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;254&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="dragnode"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Node being dragged&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;255&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="targetnode"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Node being dragged to&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;256&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;bool&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;257&lt;/span&gt; &lt;span style="color: #808080"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&lt;span style="color: #000000"&gt; SameBranch(TreeNode draggedNode, TreeNode dropNode)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;258&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;259&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; at the root level&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;260&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (dropNode &lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;261&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;262&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;263&lt;/span&gt; &lt;span style="color: #000000"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;264&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; check if it is the same node, else call recursively&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;265&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (draggedNode.Equals(dropNode))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;266&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;267&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;268&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; SameBranch(draggedNode, dropNode.Parent); &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; ;-)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;269&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;270&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;271&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;272&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;#endregion&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;273&lt;/span&gt; &lt;span style="color: #000000"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;274&lt;/span&gt; &lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;u&gt;Environment:&lt;/u&gt;&lt;br&gt;Microsoft ® Visual Studio 2008&lt;br&gt;Microsoft ® .NET framework 3.5&lt;br&gt;Microsoft ® Windows XP (SP2)&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-8947052581577770088?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/8947052581577770088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=8947052581577770088' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8947052581577770088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8947052581577770088'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2008/04/extending-treeview-control-with-drag.html' title='Extending the TreeView control with drag &amp;amp; drop'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-8839447541226460593</id><published>2008-04-03T11:03:00.001+02:00</published><updated>2008-04-08T13:01:16.413+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><title type='text'>Building a TreeView tree from a MenuStrip</title><content type='html'>&lt;p&gt;Recently I needed to convert only the ToolStripMenuItems on a MenuStrip control to a tree in a TreeView control. &lt;/p&gt; &lt;p&gt;I created a simple static class which takes the MenuStrip object as the source, and fills a TreeView with the results. A single AddNode function is recursively called to add child nodes.&lt;/p&gt; &lt;p&gt;I have not looked at any optimizations or did much testing, but I thought someone might find it useful and make some insightful suggestions. :-)&lt;/p&gt; &lt;div style="padding-right: 0px; overflow-y: scroll; padding-left: 0px; float: none; overflow-x: scroll; padding-bottom: 0px; margin: 0px; overflow: auto; width: 480px; padding-top: 0px; display: inline; height: 480px" class="wlWriterSmartContent"&gt;&lt;pre style="overflow-y: scroll; overflow-x: scroll; overflow: auto; background-color: white"&gt;&lt;div&gt;&lt;span style="color: #008080"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000"&gt; Builder&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 2&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 3&lt;/span&gt; &lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 4&lt;/span&gt; &lt;span style="color: #008000"&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; BuilderException&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 5&lt;/span&gt; &lt;span style="color: #008000"&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 6&lt;/span&gt; &lt;span style="color: #808080"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt; BuilderException : Exception&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 7&lt;/span&gt; &lt;span style="color: #000000"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 8&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 9&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Default constructor&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="Message"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Exception Message&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="ee"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Inner Exception&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt; &lt;span style="color: #808080"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; BuilderException(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; Message, Exception ee) : &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span style="color: #000000"&gt;(Message, ee) { }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt; &lt;span style="color: #000000"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt; &lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt; &lt;span style="color: #008000"&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; TreeStructure class&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt; &lt;span style="color: #008000"&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt; &lt;span style="color: #808080"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt; TreeStructure&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt; &lt;span style="color: #000000"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; private members&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; TreeView temp_treeview;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Build a TreeView structure given a MenuStrip object&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="menustrip"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;MenuStrip source object&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="treeview"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;TreeView destination object&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt; &lt;span style="color: #808080"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; Build(MenuStrip menustrip, TreeView treeview)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;32&lt;/span&gt; &lt;span style="color: #000000"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;33&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; assign treeview object&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;34&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                temp_treeview &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; treeview;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;35&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;36&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; get enumerator and start with root nodes&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;37&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                IEnumerator ie &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; menustrip.Items.GetEnumerator();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;38&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;39&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt; (ie.MoveNext())&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;40&lt;/span&gt; &lt;span style="color: #000000"&gt;                    AddNode(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;, (ToolStripItem)ie.Current);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;41&lt;/span&gt; &lt;span style="color: #000000"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;42&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; (Exception ee)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;43&lt;/span&gt; &lt;span style="color: #000000"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;44&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; BuilderException(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Unable to build tree.&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, ee);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;45&lt;/span&gt; &lt;span style="color: #000000"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;46&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;47&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;48&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;49&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Add TreeView node (recursive)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;50&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;51&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="node"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;TreeNode&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;52&lt;/span&gt; &lt;span style="color: #008000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="item"ToolStripItem&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;53&lt;/span&gt; &lt;span style="color: #808080"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; AddNode(TreeNode node, ToolStripItem item)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;54&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;55&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;56&lt;/span&gt; &lt;span style="color: #000000"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;57&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (item.GetType().Equals(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000"&gt;(ToolStripMenuItem)))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;58&lt;/span&gt; &lt;span style="color: #000000"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;59&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; firstnode or child node&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;60&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (node &lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;61&lt;/span&gt; &lt;span style="color: #000000"&gt;                        node &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; temp_treeview.Nodes.Add(item.Text);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;62&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;63&lt;/span&gt; &lt;span style="color: #000000"&gt;                        node &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.Nodes.Add(item.Text);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;64&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;65&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; get enumerator for dropdownitems&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;66&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                    IEnumerator ie &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ((ToolStripMenuItem)item).DropDownItems.GetEnumerator();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;67&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt; (ie.MoveNext())&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;68&lt;/span&gt; &lt;span style="color: #000000"&gt;                        AddNode(node, (ToolStripItem)ie.Current);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;69&lt;/span&gt; &lt;span style="color: #000000"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;70&lt;/span&gt; &lt;span style="color: #000000"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;71&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; (Exception ee)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;72&lt;/span&gt; &lt;span style="color: #000000"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;73&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; BuilderException(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Unable to add node.&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, ee);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;74&lt;/span&gt; &lt;span style="color: #000000"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;75&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;76&lt;/span&gt; &lt;span style="color: #000000"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;77&lt;/span&gt; &lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;u&gt;Environment:&lt;/u&gt;&lt;br&gt;Microsoft ® Visual Studio 2008&lt;br&gt;Microsoft ® .NET framework 3.5&lt;br&gt;Microsoft ® Windows XP (SP2)&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-8839447541226460593?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/8839447541226460593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=8839447541226460593' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8839447541226460593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8839447541226460593'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2008/04/building-treeview-tree-from-menustrip.html' title='Building a TreeView tree from a MenuStrip'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-8987624404299439060</id><published>2008-04-02T09:03:00.001+02:00</published><updated>2008-04-02T09:03:15.733+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><title type='text'>Online Community vs. Creative Labs vs. Daniel_K</title><content type='html'>&lt;p&gt;A lot of "vs." in the title. As the owner of a &lt;a href="http://www.creative.com/" target="_blank"&gt;Creative&lt;/a&gt; &lt;a href="http://us.creative.com/products/product.asp?category=1&amp;amp;subcategory=206&amp;amp;product=50" target="_blank"&gt;Live!&lt;/a&gt; soundcard, I've recently followed the story about Daniel Kawakami (Daniel_K), who modded (changed) some Creative drivers allowing certain Creative soundcards to work better on &lt;a href="http://www.microsoft.com/windows/products/windowsvista/default.aspx" target="_blank"&gt;Vista&lt;/a&gt;. Non-support for my soundcard is one of the reasons I had not yet updated my home PC to Vista. &lt;/p&gt; &lt;p&gt;Creative in turn &lt;a href="http://forums.creative.com/creativelabs/board/message?board.id=soundblaster&amp;amp;message.id=116332" target="_blank"&gt;threatened&lt;/a&gt; Daniel_K online resulting in a mini online &lt;a href="http://blog.wired.com/gadgets/2008/03/silence-from-so.html" target="_blank"&gt;revolt&lt;/a&gt; against Creative.&lt;/p&gt; &lt;p&gt;Now Daniel_K has &lt;a href="http://blog.wired.com/gadgets/2008/04/daniel_k-who-fi.html" target="_blank"&gt;spoken&lt;/a&gt; about the happenings of the last couple of days. It's an interesting read, and answers some of the questions surrounding this whole issue. &lt;/p&gt; &lt;p&gt;Personally I really hope Creative does some soul-searching and assists many thousands of their users by just fixing the drivers to work on Vista. If not, I will also have to part with my Creative hardware... or I will just have to stick with XP. *sigh*&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-8987624404299439060?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/8987624404299439060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=8987624404299439060' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8987624404299439060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8987624404299439060'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2008/04/online-community-vs-creative-labs-vs.html' title='Online Community vs. Creative Labs vs. Daniel_K'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-3442208109464152245</id><published>2008-04-01T14:55:00.001+02:00</published><updated>2008-04-04T09:31:58.783+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Stupid System.Windows.Form.ToolTip()</title><content type='html'>&lt;p&gt;Last week I updated some legacy code (don't we all love that?). Updating the actual code was pretty straightforward, but I decided to add some visual elements to notify the user of validation issues.&lt;br&gt;To make a long story short, I decided to popup a ToolTip() whenever a user tabs away from a control and a validation error is raised.&lt;/p&gt; &lt;p&gt; &lt;p&gt;&lt;/p&gt; &lt;div style="padding-right: 0px; overflow-y: hidden; padding-left: 0px; float: none; overflow-x: scroll; margin: 0px; overflow: auto; width: 480px; padding-top: 0px; display: inline; adding-bottom: 0px" class="wlWriterSmartContent"&gt;&lt;pre style="overflow-y: hidden; overflow-x: scroll; overflow: auto; background-color: white"&gt;&lt;div&gt;&lt;span style="color: #008080"&gt; 1&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; textBox1_Leave(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt; sender, EventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 2&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 3&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; create new tooltip&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 4&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            ToolTip tt &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; ToolTip()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 5&lt;/span&gt; &lt;span style="color: #000000"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 6&lt;/span&gt; &lt;span style="color: #000000"&gt;                Active &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 7&lt;/span&gt; &lt;span style="color: #000000"&gt;                IsBalloon &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 8&lt;/span&gt; &lt;span style="color: #000000"&gt;                ToolTipIcon &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ToolTipIcon.Info,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 9&lt;/span&gt; &lt;span style="color: #000000"&gt;                ToolTipTitle &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Test&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt; &lt;span style="color: #000000"&gt;                InitialDelay &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt; &lt;span style="color: #000000"&gt;            };&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; associate tooltip with control&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            tt.SetToolTip(textBox1, &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Test&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; show the tooltip&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            tt.Show(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Stupid&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, textBox1, &lt;/span&gt;&lt;span style="color: #800080"&gt;3000&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now this code (which I've simplified to illustrate) seems to work fine, but there's a snag. If the &lt;em&gt;mouse cursor hovers above the control when the ToolTip() is displayed for &lt;u&gt;that&lt;/u&gt; control&lt;/em&gt;, the ToolTip() stem points to the wrong location.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.google.com/christogreeff/R_IwslJ1MmI/AAAAAAAAAIs/nZfI2kTT0eg/stupidtt%5B8%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="stupidtt" src="http://lh4.google.com/christogreeff/R_IwuFJ1MnI/AAAAAAAAAI0/Uy1zmWun54M/stupidtt_thumb%5B6%5D.png" width="244" height="244"&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Move the mouse cursor away from the control, tab to the next control and it will point to the control you have specified. Google didn't really help. Some mentioning of the issue, but vary vague and non-specific.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So in the end, I resorted to writing a (static) class to determine whether the mouse cursor is above the control which will receive the ToolTip(), move the mouse away from the control and back again after the ToolTip() has been displayed (hiding the cursor doesn't work... I've tried). Not really elegant, but it works.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;div style="padding-right: 0px; overflow-y: hidden; padding-left: 0px; float: none; overflow-x: scroll; padding-bottom: 0px; margin: 0px; overflow: auto; width: 480px; padding-top: 0px; display: inline; 0px: " class="wlWriterSmartContent"&gt;&lt;pre style="overflow-y: hidden; overflow-x: scroll; overflow: auto; background-color: white"&gt;&lt;div&gt;&lt;span style="color: #008080"&gt; 1&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; move mouse if mouse is over control, and show tooltip. else just show tooltip&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 2&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (m.OverControl(control))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 3&lt;/span&gt; &lt;span style="color: #000000"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 4&lt;/span&gt; &lt;span style="color: #000000"&gt;                m.MoveAway(control);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 5&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 6&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; associate tooltip with control&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 7&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                tt.SetToolTip(textBox1, &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Test&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 8&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 9&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; show the tooltip&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                tt.Show(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Stupid&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, textBox1, &lt;/span&gt;&lt;span style="color: #800080"&gt;3000&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt; &lt;span style="color: #000000"&gt;                m.MoveBack();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt; &lt;span style="color: #000000"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Maybe someone has encountered the same problem? Maybe there's a better solution?&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;u&gt;Environment:&lt;/u&gt;&lt;/em&gt;&lt;br&gt;&lt;em&gt;Microsoft ® Visual Studio 2008&lt;br&gt;Microsoft ® .NET framework 3.5&lt;br&gt;Microsoft ® Windows XP (SP2)&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-3442208109464152245?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/3442208109464152245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=3442208109464152245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3442208109464152245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3442208109464152245'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2008/04/stupid-systemwindowsformtooltip.html' title='Stupid System.Windows.Form.ToolTip()'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-6061632339146345518</id><published>2007-12-12T11:33:00.001+02:00</published><updated>2007-12-12T11:33:09.560+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pictures'/><category scheme='http://www.blogger.com/atom/ns#' term='Cape Town'/><category scheme='http://www.blogger.com/atom/ns#' term='Rant'/><title type='text'>It is not sunny</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.google.com/christogreeff/R1-qsftAvvI/AAAAAAAAAHk/mVD4r17a3ws/Clipboard01%5B5%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="104" alt="Todays forecast (12/12/2007)" src="http://lh4.google.com/christogreeff/R1-qtPtAvwI/AAAAAAAAAHs/8VNQM8JmavQ/Clipboard01_thumb%5B3%5D.png" width="244" align="left" border="0"&gt;&lt;/a&gt;Cape Town weather is harder to predict than the number of cash-in-transit heists that will be foiled today. Today was supposed to be sunny and warm... that's what my iGoogle page also tells me. I guess I'm still used to the ~330 days of sunshine in the Free State.&lt;/p&gt; &lt;p&gt;Look at the difference between today (left) and yesterday (right).&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.google.com/christogreeff/R1-quvtAvxI/AAAAAAAAAH0/9POErobcp3c/DSC00665%5B3%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="Today (12/12/2007)" src="http://lh3.google.com/christogreeff/R1-qv_tAvyI/AAAAAAAAAH8/C0px9G1XdD4/DSC00665_thumb%5B1%5D.jpg" width="184" border="0"&gt;&lt;/a&gt; &lt;a href="http://lh4.google.com/christogreeff/R1-qxPtAvzI/AAAAAAAAAIE/HVEeOWuWjFM/DSC00656%5B3%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="Yesterday (11/12/2007)" src="http://lh3.google.com/christogreeff/R1-qx_tAv0I/AAAAAAAAAIM/tixv7vwTFSE/DSC00656_thumb%5B1%5D.jpg" width="184" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Oh well. It will probably clear up a little later, and completely ruin the validity of my post.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-6061632339146345518?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/6061632339146345518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=6061632339146345518' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/6061632339146345518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/6061632339146345518'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/12/it-is-not-sunny.html' title='It is not sunny'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-6889856368595614643</id><published>2007-10-31T09:03:00.001+02:00</published><updated>2007-10-31T09:03:15.786+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='Cape Town'/><title type='text'>My Facebook shirt looks like a tent :)</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.google.com/christogreeff/RygoojwgZuI/AAAAAAAAAGc/V0d0NRdU_U4/DSC00593%5B6%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="128" alt="DSC00593" src="http://lh3.google.com/christogreeff/RygopjwgZvI/AAAAAAAAAGk/ImpzzDj9coQ/DSC00593_thumb%5B4%5D.jpg" width="97" align="right" border="0"&gt;&lt;/a&gt; I attended the first &lt;a href="http://www.facebook.com/event.php?eid=5112483650&amp;amp;ref=mf" target="_blank"&gt;Facebook Developers Garage&lt;/a&gt; at the &lt;a href="http://www.riverclub.co.za/" target="_blank"&gt;River Club Golf and Conference Centre&lt;/a&gt; (Liesbeek Parkway, Observatory, Cape Town, South Africa) last night. And I must admit that it was a very interesting event.&lt;/p&gt; &lt;p&gt;Let me see. The &lt;strong&gt;speakers&lt;/strong&gt; were: Joey da Silva (&lt;a href="http://www.moodia.co.za/" target="_blank"&gt;moodia&lt;/a&gt;), Trever Kinnear (&lt;a href="http://www.moodia.co.za/" target="_blank"&gt;moodia&lt;/a&gt;), Grant Flemming (&lt;a href="http://www.fontera.com/" target="_blank"&gt;Fontera&lt;/a&gt;), Eben de Wit (&lt;a href="http://www.microsoft.com" target="_blank"&gt;Microsoft&lt;/a&gt;), Ernst Kuschke (&lt;a href="http://www.24.com/" target="_blank"&gt;24.com&lt;/a&gt;), Dave Morin (&lt;a href="http://www.facebook.com" target="_blank"&gt;Facebook&lt;/a&gt;), Christine da Silva (&lt;a href="http://www.altersage.com/" target="_blank"&gt;AlterSage&lt;/a&gt;), Riaan Nolan (&lt;a href="http://www.3am.co.za/" target="_blank"&gt;3am.co.za&lt;/a&gt;) and Mark Levitt (&lt;a href="http://www.chesscube.com/" target="_blank"&gt;Chesscube.com&lt;/a&gt;). Hope I didn't leave anyone out.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.google.com/christogreeff/RygorTwgZwI/AAAAAAAAAGs/or7K3i4IHQE/Panoramic_Speakers%5B3%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="110" alt="Panoramic_Speakers" src="http://lh6.google.com/christogreeff/RygosTwgZxI/AAAAAAAAAG0/LYFKBHQS-yA/Panoramic_Speakers_thumb%5B1%5D.jpg" width="244" align="left" border="0"&gt;&lt;/a&gt; Personally I thought the format of the event was excellent. Each presenter had about &lt;strong&gt;10 minutes&lt;/strong&gt; to talk about a specific topic related to Facebook software development. Some of the presenters used more time, but I didn't feel that any of them did not deserve the time they used.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Topics&lt;/strong&gt; presented ranged from Facebook usage statistics, Microsoft's involvement with Facebook, marketing, development tips, development obstacles and a live Q&amp;amp;A video conference with Dave Morin, Facebook Senior Platform Manager (left his post of Manager, Creation &amp;amp; Collaboration at Apple).&lt;/p&gt; &lt;p&gt;I have a &lt;strong&gt;Facebook application development&lt;/strong&gt; idea or two, that I've discussed with &lt;a href="http://hannesfoulds.blogspot.com" target="_blank"&gt;Hannes&lt;/a&gt;, so I'll post about those at a later stage. Something I found interesting is that &lt;strong&gt;South Africa&lt;/strong&gt; has the 6th largest user population of Facebook. Something to think about!&lt;/p&gt; &lt;p&gt;All in all, I really enjoyed the event and will definitely attend the next one - if organized as well as this one. And &lt;strong&gt;thanks&lt;/strong&gt; to the organizers for my (slightly too big) Facebook shirt. It looks cool. :)&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-6889856368595614643?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/6889856368595614643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=6889856368595614643' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/6889856368595614643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/6889856368595614643'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/10/my-facebook-shirt-looks-like-tent.html' title='My Facebook shirt looks like a tent :)'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-527020539648524278</id><published>2007-10-28T00:34:00.001+02:00</published><updated>2007-10-28T00:34:10.857+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cape Town'/><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><category scheme='http://www.blogger.com/atom/ns#' term='Blog'/><title type='text'>27 Dinner | CapeTown. Not for me.</title><content type='html'>&lt;p&gt;So I attended the &lt;a href="http://27dinner.pbwiki.com/CapeTown" target="_blank"&gt;27 Dinner&lt;/a&gt; event this evening. I think Dave Duarte (and the others I'm not aware of) did a good job of organizing the event, and it looked like most people were enjoying it.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.google.com/christogreeff/RyO82zwgZsI/AAAAAAAAAGM/NP1mUBARG6w/27dinnerctpano%5B5%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="114" alt="27dinnerctpano" src="http://lh3.google.com/christogreeff/RyO83zwgZtI/AAAAAAAAAGU/3tLUHjMTTUU/27dinnerctpano_thumb%5B3%5D.jpg" width="429" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;br&gt;&lt;font size="1"&gt;(mobile phone pic)&lt;/font&gt;&lt;/p&gt; &lt;p&gt;I &lt;strong&gt;enjoyed&lt;/strong&gt; the talk by Phil Barrett on user experience, although I did find it quite &lt;strong&gt;annoying&lt;/strong&gt; that some people kept on talking and laughing during his presentation.&amp;nbsp; The the rest of the evening I found a little boring. I expected more presentations, or maybe some group discussions. &lt;/p&gt; &lt;p&gt;But then I realised that it was a &lt;strong&gt;dinner&lt;/strong&gt; after all. People are supposed to talk to each other (read "network"), eat something, talk some more and then go home. Presentations and slideshows should not even be necessary. And that is what I expected - presentations about cool stuff.&lt;/p&gt; &lt;p&gt;So while I do think it's an interesting event , it's not an event that I would need to go to again. The food was good though. :)&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-527020539648524278?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/527020539648524278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=527020539648524278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/527020539648524278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/527020539648524278'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/10/27-dinner-capetown-not-for-me.html' title='27 Dinner | CapeTown. Not for me.'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-6011867690777549748</id><published>2007-10-17T13:33:00.001+02:00</published><updated>2007-10-17T13:38:38.166+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><title type='text'>10... Reasons... no! 1 Reason why you should use Agile Methods</title><content type='html'>&lt;p&gt;I just read &lt;a href="http://www.readwriteweb.com/archives/the_future_of_software_development.php" target="_blank"&gt;this&lt;/a&gt; article on The Future of Software Development. The one thing that &lt;strong&gt;struck&lt;/strong&gt; me from the article was the reference to "&lt;em&gt;...few good men (or women!)...&lt;/em&gt;" needed to create truly useful software. Most developers are people who enjoy software development for what it is: &lt;strong&gt;creating&lt;/strong&gt; something useful while learning something new and problems.&lt;/p&gt; &lt;p&gt;My (short) conclusion: Agile methods are for the aforementioned type of developers, whilst the Waterfall model is more suited to developers who create software as a job.&lt;/p&gt; &lt;p&gt;:)&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-6011867690777549748?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/6011867690777549748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=6011867690777549748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/6011867690777549748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/6011867690777549748'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/10/10-reasons-no-1-reason-why-you-should.html' title='10... Reasons... no! 1 Reason why you should use Agile Methods'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-3033269652710982267</id><published>2007-10-07T19:49:00.001+02:00</published><updated>2007-10-07T19:49:12.714+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pictures'/><title type='text'>Stanford Cove</title><content type='html'>&lt;p&gt;Some panoramic photographs from the weekend. The first one was taken from the balcony overlooking Stanford Cove (2km before Gansbaai, from Hermanus' direction).&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.google.com/christogreeff/Rwkb7tqZUdI/AAAAAAAAAFs/mB3VObIYynE/gb20071006%5B10%5D.jpg" target="_blank"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="77" alt="gb20071006" src="http://lh3.google.com/christogreeff/Rwkb9NqZUeI/AAAAAAAAAF0/xOJgXc1uhak/gb20071006_thumb%5B8%5D.jpg" width="436" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Second one was taken from the grass bank above Stanford Cove.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.google.com/christogreeff/RwkcDdqZUfI/AAAAAAAAAF8/ntrUuJ4B-vk/gb20071007%5B6%5D.jpg" target="_blank"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="83" alt="gb20071007" src="http://lh4.google.com/christogreeff/RwkcEdqZUgI/AAAAAAAAAGE/fppT2rPIvn8/gb20071007_thumb%5B4%5D.jpg" width="437" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Pity it was a little cold. :)&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-3033269652710982267?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/3033269652710982267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=3033269652710982267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3033269652710982267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3033269652710982267'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/10/stanford-cove.html' title='Stanford Cove'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-824870264398683752</id><published>2007-09-23T20:30:00.001+02:00</published><updated>2007-09-23T20:42:24.834+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cars'/><category scheme='http://www.blogger.com/atom/ns#' term='Pictures'/><category scheme='http://www.blogger.com/atom/ns#' term='Sport'/><title type='text'>Total Swartland Rally</title><content type='html'>&lt;p&gt;&lt;a href="http://lh4.google.com/christogreeff/RvawpTksx5I/AAAAAAAAAE0/xcSLtEcas4w/DSC01465%5B6%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="184" alt="DSC01465" src="http://lh4.google.com/christogreeff/RvawqTksx6I/AAAAAAAAAE8/_M-CVdnnK4U/DSC01465_thumb%5B4%5D.jpg" width="244" align="left" border="0"&gt;&lt;/a&gt;Went for a little outing this weekend. The event was round 7 of the Sasol South African National Rally Champoinships, which took place in the Western Cape.&lt;/p&gt; &lt;p&gt;We were &lt;strong&gt;marshalling&lt;/strong&gt; SS9 (Special Stage 9) on Saturday, 22 September 2007, which turned out to be quite interesting. We were posted about 19km outside of Malmesbury (GPS Coordinates: S 33°14.560', E018°34.290'), just off the R45. &lt;/p&gt; &lt;p&gt;It was interesting to see the &lt;strong&gt;cars and drivers&lt;/strong&gt; at the end of this stage, as it was the &lt;a href="http://lh5.google.com/christogreeff/Rvawsjksx7I/AAAAAAAAAFE/l3opcUek-jM/DSC01470%5B3%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="184" alt="DSC01470" src="http://lh5.google.com/christogreeff/Rvawtjksx8I/AAAAAAAAAFM/oMHPqwa-6qU/DSC01470_thumb%5B1%5D.jpg" width="244" align="right" border="0"&gt;&lt;/a&gt;longest stage of the day, taking about 24 minutes to complete... some cars showing signs of a tough stage!! &lt;/p&gt; &lt;p&gt;Didn't have too much time taking photographs of the action, but the GPS timing devices are quite interesting. These are activated when a &lt;strong&gt;marshal sitting 300m from us&lt;/strong&gt; pushes a button when a competitor car passes by.The only thing to do then, is to enter the car number on both the GPS units and press Yes. These times are later downloaded from the units. Not overly high-tech, but still very accurate.&lt;/p&gt; &lt;p&gt;Results of the rally can be found &lt;a href="http://www.totalmotorsport.co.za/results_2007_swartland_rally.xls" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-824870264398683752?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/824870264398683752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=824870264398683752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/824870264398683752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/824870264398683752'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/09/total-swartland-rally.html' title='Total Swartland Rally'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-5883171928669716842</id><published>2007-09-19T14:11:00.001+02:00</published><updated>2007-09-23T20:42:48.136+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Afrikaans GPS</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.google.com/christogreeff/RvER7x8FNqI/AAAAAAAAAEY/8lIf9KAv1HU/afrikaans%5B3%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="175" alt="afrikaans" src="http://lh5.google.com/christogreeff/RvER9h8FNrI/AAAAAAAAAEg/gR4veO94NMI/afrikaans_thumb%5B1%5D.png" width="244" align="left" border="0"&gt;&lt;/a&gt;I quite like my little Garmin nuvi GPS. Today I discovered that it's possible to update the software, and even the &lt;strong&gt;voice&lt;/strong&gt; files from the Internet. &lt;/p&gt; &lt;p&gt;I installed the WebUpdater software from the Garmin website, connected to the Internet and chose to update. It upgraded the latest software on the unit to v3.30. After a reset, it displayed that new software is installing. Running the WebUpdater software again, it displays that it can also install updated British English voice files (with &lt;strong&gt;improved voice quality&lt;/strong&gt;) and also Afrikaans voice files... which I did.&lt;/p&gt; &lt;p&gt;I think my next little project will be to see if I can write an application to edit the poi.gpi files on the unit. I know it's possible to edit the XML of the .gpx files, and then upload it to the unit. But I want to figure out the structure of the .gpi files, as it is not widely known what the format should look like.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-5883171928669716842?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/5883171928669716842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=5883171928669716842' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/5883171928669716842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/5883171928669716842'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/09/afrikaans-gps.html' title='Afrikaans GPS'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-7888956372320662681</id><published>2007-09-18T23:19:00.001+02:00</published><updated>2007-09-19T11:28:30.027+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Torrents'/><title type='text'>How torrents make them rich</title><content type='html'>&lt;p&gt;The whole &lt;a href="http://en.wikipedia.org/wiki/Mediadefender" target="_blank"&gt;MediaDefender&lt;/a&gt; saga interests me. For those of you who don't know: &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;"MediaDefender is a company which offers services designed to prevent and stop people who engage in alleged copyright infringement using peer-to-peer distribution, using &lt;strong&gt;unusual tactics&lt;/strong&gt; such as flooding peer-to-peer networks with decoy files that tie up a user's computer."&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I find the story interesting, because recently some internal MediaDefender emails and taped telephone conversations were &lt;a href="http://en.wikipedia.org/wiki/Mediadefender#Leaked_Information" target="_blank"&gt;leaked&lt;/a&gt; on the Internet.&lt;/p&gt; &lt;p&gt;In an interesting turn of events, &lt;a href="http://torrentfreak.com/" target="_blank"&gt;TorrentFreak&lt;/a&gt; &lt;a href="http://torrentfreak.com/record-labels-use-piracy-data-to-please-fans-070918/" target="_blank"&gt;reports&lt;/a&gt; that apparently some music labels use statistics on P2P data to decide on whether or not to release music singles or not. I find this &lt;strong&gt;fascinating&lt;/strong&gt; because the same music labels that use the P2P statistics to make decisions which affects their finances, is also opposed to P2P networks. &lt;/p&gt; &lt;p&gt;So how much is P2P actually hurting music sales? If they are comfortable enough to use P2P as a marketing research tool, are they really &lt;strong&gt;losing money&lt;/strong&gt; on P2P music downloads? Surely these marketing research tactics are almost free, and can be offset against the illegal downloads from P2P networks. Sure there is some possible income losses, but P2P music downloads also serve as another marketing tool - to get new tracks/singles out there.&lt;/p&gt; &lt;p&gt;I am really suspicious of these music labels and their fights against P2P and sometimes... just sometimes... I get the feeling that music labels are disguising their &lt;strong&gt;love&lt;/strong&gt; of P2P networks as hate. But that's probably just me. Any comments?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-7888956372320662681?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/7888956372320662681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=7888956372320662681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/7888956372320662681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/7888956372320662681'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/09/how-torrents-make-them-rich.html' title='How torrents make them rich'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-7430985060690529575</id><published>2007-09-15T08:18:00.001+02:00</published><updated>2007-09-23T20:43:03.400+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pictures'/><category scheme='http://www.blogger.com/atom/ns#' term='Sport'/><title type='text'>England</title><content type='html'>&lt;p&gt;I went to watch the cricket yesterday. It was better than being at work on a Friday afternoon. England played Australia, and lost. Unfortunately.&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://lh4.google.com/christogreeff/RvFEbR8FNsI/AAAAAAAAAEo/Jk2NWfTUxEc/cricket%5B1%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="60" alt="cricket" src="http://lh3.google.com/christogreeff/Rut5Qk6ZPeI/AAAAAAAAAEw/nIBNlBi2SwA/cricket_thumb%5B1%5D.png" width="244" align="left" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;England also played South Africa in the Rugby World Cup 2007 yesterday and lost by 36 points. England 0 - 36 South Africa.&lt;/p&gt; &lt;p&gt;Not exactly a good sporting day for England then.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Update (2007-09-17): "Sport doesn't make the geekiness go away..." - Christo Greeff&lt;/em&gt;&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-7430985060690529575?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/7430985060690529575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=7430985060690529575' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/7430985060690529575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/7430985060690529575'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/09/england.html' title='England'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-8017685577754362555</id><published>2007-09-09T14:38:00.000+02:00</published><updated>2007-09-09T14:55:08.527+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Video'/><category scheme='http://www.blogger.com/atom/ns#' term='Inspiring'/><title type='text'>Never Judge A Book By It's Cover</title><content type='html'>I there's something you really enjoy doing, and feel that it's a dream worth following, go for it.&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1k08yxu57NA"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/1k08yxu57NA" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-8017685577754362555?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/8017685577754362555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=8017685577754362555' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8017685577754362555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8017685577754362555'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/09/never-judge-book-by-its-cover.html' title='Never Judge A Book By It&apos;s Cover'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-7346231671949398024</id><published>2007-09-06T19:35:00.000+02:00</published><updated>2007-09-19T11:28:49.341+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><title type='text'>Warning: This will make you want to practise!</title><content type='html'>This 12 year old, Conrad Oberg, really knows how to play Jimi Hendrix. The 7+ minute clip made me search for the nearest guitar, and since I'll need a lot of practise, I will only be posting again in 2012...&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://youtube.com/watch?v=o1DMbWf0MrI"&gt;Watch clip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-7346231671949398024?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/7346231671949398024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=7346231671949398024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/7346231671949398024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/7346231671949398024'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/09/warning-this-will-make-you-want-to.html' title='Warning: This will make you want to practise!'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-8601502273526150851</id><published>2007-09-04T20:38:00.000+02:00</published><updated>2007-09-04T21:19:52.258+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Work'/><title type='text'>Smiley notes</title><content type='html'>I do not like writing anymore. I struggle to figure out what I wrote down during meetings. Usually I can figure out the date, some action items and some smiley faces, which also sometimes become sad faces, depending on the meeting. Drawings work much better, but they usually attract attention from the other attendees that think I’m either not listening or goofing off.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4OwtBc_eTGY/Rt2ve5aPrzI/AAAAAAAAADc/0qxKQPGTFoY/s1600-h/notes.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_4OwtBc_eTGY/Rt2ve5aPrzI/AAAAAAAAADc/0qxKQPGTFoY/s200/notes.png" alt="" id="BLOGGER_PHOTO_ID_5106430497849847602" border="0" /&gt;&lt;/a&gt;So I’ve started using another cunning but very effective workaround. Meetings I attend always tend to end up with someone drawing a lot of boxes, lines, arrows, circles and other nameless shapes on the whiteboard. So I’ll rather sit and watch, listen to what they’re saying (sometimes even participate with elegant whiteboard drawing manoeuvres), understand the problem and afterwards (take note of this), take a photograph of the whiteboard with my mobile phone. For me at least that really seems to work.&lt;br /&gt;&lt;br /&gt;After a meeting I “blueteeth” the image to my PC, adjust the contrast and print it out. And more often than not, I’ll remember exactly what was discussed during the meeting. I know there are some fancy drawing boards on the market that can print out what was drawn, but these devices are generally expensive and not used very often.&lt;br /&gt;&lt;br /&gt;What do you take from meetings (except for the cookies)?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-8601502273526150851?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/8601502273526150851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=8601502273526150851' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8601502273526150851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8601502273526150851'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/09/notes-what-notes.html' title='Smiley notes'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4OwtBc_eTGY/Rt2ve5aPrzI/AAAAAAAAADc/0qxKQPGTFoY/s72-c/notes.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-4151450433799904993</id><published>2007-09-04T07:22:00.000+02:00</published><updated>2007-09-04T13:33:57.781+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Funny'/><title type='text'>Wrist Control</title><content type='html'>&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2REG3-Wb5gM"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/2REG3-Wb5gM" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-4151450433799904993?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/4151450433799904993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=4151450433799904993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/4151450433799904993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/4151450433799904993'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/09/wrist-control.html' title='Wrist Control'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-3294922653926403228</id><published>2007-09-04T06:36:00.000+02:00</published><updated>2007-09-04T07:12:46.015+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nostalgic'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Internet, bicycles and rar.exe</title><content type='html'>This &lt;a target="_blank" href="http://ob81.com/2007/09/03/do-you-remember-your-first-experience-with-the-internet/"&gt;article&lt;/a&gt; by Ob81 made me try and remember what, where and when my first Internet experience was.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Katie would study all day. Drink and Party all night, and then hang out at a small computer room on campus and actually slept in there sometimes."&lt;/blockquote&gt;&lt;br /&gt;I never studied all day, but that is off topic. If I remember correctly, a friend's father worked at the district education department. We used to go there on a Saturday afternoon to download games from the Internet. And then the last 2km of the downloaded goods was transported home via bicycle on &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Floppy_disk"&gt;5.25 inch floppy disk&lt;/a&gt; and/or 3.5 inch floppy (for those with newer, more expensive PCs) disk.&lt;br /&gt;&lt;br /&gt;We used to RAR all the data to disk, because usually we downloaded more than we actually needed. This is still true today for most of us.&lt;br /&gt;&lt;br /&gt;Since those days, the Internet has changed dramatically. Somehow it seemed to be more fun to download, cycle and rar.exe X a:\download.rar c:\download&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-3294922653926403228?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/3294922653926403228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=3294922653926403228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3294922653926403228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3294922653926403228'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/09/internet-bicycles-and-rarexe.html' title='Internet, bicycles and rar.exe'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-8335750564361102941</id><published>2007-09-02T10:39:00.000+02:00</published><updated>2007-09-04T13:38:24.400+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blog'/><title type='text'>Fixed</title><content type='html'>I fixed my blog. Still don't like the differences (especially with regards to the preformatted code snippets) between Firefox and IE, but I'll live with it.&lt;br /&gt;&lt;br /&gt;Update: To fix, I turned off all Javascript in Firefox, resulting in the blogspot reverting back to normal HTTP POST buttons to update widgets.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-8335750564361102941?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/8335750564361102941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=8335750564361102941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8335750564361102941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/8335750564361102941'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/09/fixed.html' title='Fixed'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-4057561511776334023</id><published>2007-08-30T07:12:00.000+02:00</published><updated>2007-08-30T07:23:10.426+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Widgets'/><category scheme='http://www.blogger.com/atom/ns#' term='Blog'/><title type='text'>Blog problems</title><content type='html'>I had to delete my previous blog, because the page widgets broke and was scattered all over my page. Now I have the same problems. Look at my Firefox Error Console screen.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4OwtBc_eTGY/RtZSd5aPryI/AAAAAAAAADU/_zO8lcmiiYs/s1600-h/errors.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_4OwtBc_eTGY/RtZSd5aPryI/AAAAAAAAADU/_zO8lcmiiYs/s200/errors.png" alt="" id="BLOGGER_PHOTO_ID_5104357901251620642" border="0" /&gt;&lt;/a&gt;It seems there's something wrong with the widgets manager on blogger.com when you have some malformed HTML/Javascript in one of your widgets.&lt;br /&gt;&lt;br /&gt;That's a problem. How can I delete a widget, if the widget manager isn't loading, thus not allowing me to "widget manage" (delete) any widgets.&lt;br /&gt;&lt;br /&gt;I welcome any suggestions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;Update: I really used to word widgets alot in this post. :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-4057561511776334023?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/4057561511776334023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=4057561511776334023' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/4057561511776334023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/4057561511776334023'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/08/blog-problems.html' title='Blog problems'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4OwtBc_eTGY/RtZSd5aPryI/AAAAAAAAADU/_zO8lcmiiYs/s72-c/errors.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-433450502138880949</id><published>2007-08-29T16:59:00.000+02:00</published><updated>2007-09-02T10:38:23.390+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delegates'/><category scheme='http://www.blogger.com/atom/ns#' term='Forms'/><category scheme='http://www.blogger.com/atom/ns#' term='Threads'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Controls'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><title type='text'>Cross-thread Calls</title><content type='html'>I was busy writing a small application and wanted to update a control on my Windows form using the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx" target="_blank"&gt;BackgroundWorker&lt;/a&gt; class, that "executes an operation on a separate thread.", in .NET. But when I compiled and executed the following code&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro SyntaxEditor&lt;br /&gt;http://www.ActiproSoftware.com/Products/DotNet/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Create new Backgroundworker object, &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; and execute on button click&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; btnDoWork_Click(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;object&lt;/span&gt;&lt;span style="color: #000000; "&gt; sender, &lt;br /&gt;                             EventArgs e)&lt;br /&gt;{&lt;br /&gt;    BackgroundWorker myWorker &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; BackgroundWorker();&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;create the work event handler&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;    myWorker.DoWork &lt;/span&gt;&lt;span style="color: #000000; "&gt;+=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; DoWorkEventHandler(UpdateMyListBox);&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;run the asynchronous worker&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;    myWorker.RunWorkerAsync();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; worker implementation&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; UpdateMyListBox(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;object&lt;/span&gt;&lt;span style="color: #000000; "&gt; sender,&lt;br /&gt;                             DoWorkEventArgs e)&lt;br /&gt;{&lt;br /&gt;    Random r &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; Random();&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; add some random values to a listbox&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;for&lt;/span&gt;&lt;span style="color: #000000; "&gt; (&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; i &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #FF0000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;; i &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #FF0000; "&gt;100&lt;/span&gt;&lt;span style="color: #000000; "&gt;; i&lt;/span&gt;&lt;span style="color: #000000; "&gt;++&lt;/span&gt;&lt;span style="color: #000000; "&gt;) {&lt;br /&gt;        lstRandomValues.Items.Add(&lt;br /&gt;            r.Next().ToString());&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;I was greeted with the following exception at runtime.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4OwtBc_eTGY/RtWPvpaPrxI/AAAAAAAAADM/alwcsGYV2gQ/s1600-h/error.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_4OwtBc_eTGY/RtWPvpaPrxI/AAAAAAAAADM/alwcsGYV2gQ/s200/error.png" alt="" id="BLOGGER_PHOTO_ID_5104143801426882322" border="0" /&gt;&lt;/a&gt;"Cross-thread operation not valid: Control 'lstRandomValues' accessed from a thread other than the thread it was created on."&lt;br /&gt;&lt;br /&gt;Wonderful. I'm sure I've done this before, and it worked. After reading an MSDN &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=9756&amp;SiteID=1" target="_blank"&gt;forum&lt;/a&gt; I learned that this is new to .NET Framework 2.0. It was &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.checkforillegalcrossthreadcalls.aspx" target="_blank"&gt;implemented&lt;/a&gt; because "...when a thread other than the creating thread of a control tries to access one of that control's methods or properties, it often leads to unpredictable results." So it does actually make sense, but I only wanted to update the ListBox and I know there's nothing else that will try to update or read from that while myWorder thread is running. The simplest solution it seems is to add the&lt;pre&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Control.CheckForIllegalCrossThreadCalls &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;line, when your application starts. This will disable the catch of calls on the wrong thread that access a control's Handle property.&lt;br /&gt;&lt;br /&gt;But we don't like cheating, do we? So the correct way to do it is by changing the code to the following.&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro SyntaxEditor&lt;br /&gt;http://www.ActiproSoftware.com/Products/DotNet/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; create new delegate&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;delegate&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; UpdateMyListBoxHandler(String message);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Create new Backgroundworker object,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; and execute on button click&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; btnDoWork_Click(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;object&lt;/span&gt;&lt;span style="color: #000000; "&gt; sender, &lt;br /&gt;                             EventArgs e)&lt;br /&gt;{&lt;br /&gt;    BackgroundWorker myWorker &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; BackgroundWorker();&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;create the work event handler&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;    myWorker.DoWork &lt;/span&gt;&lt;span style="color: #000000; "&gt;+=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; DoWorkEventHandler(UpdateMyListBox);&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;run the asynchronous worker&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;    myWorker.RunWorkerAsync();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; worker implementation&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; UpdateMyListBox(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;object&lt;/span&gt;&lt;span style="color: #000000; "&gt; sender, &lt;br /&gt;                             DoWorkEventArgs e)&lt;br /&gt;{&lt;br /&gt;    Random r &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; Random();&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; add some random values to a listbox&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;for&lt;/span&gt;&lt;span style="color: #000000; "&gt; (&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; i &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #FF0000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;; i &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #FF0000; "&gt;100&lt;/span&gt;&lt;span style="color: #000000; "&gt;; i&lt;/span&gt;&lt;span style="color: #000000; "&gt;++&lt;/span&gt;&lt;span style="color: #000000; "&gt;) {&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000; "&gt;/*&lt;/span&gt;&lt;span style="color: #008000; "&gt;Gets a value indicating whether the &lt;br /&gt;          caller must call an invoke method &lt;br /&gt;          when making method calls to the control &lt;br /&gt;          because the caller is on a different &lt;br /&gt;          thread than the one the control was &lt;br /&gt;          created on. &lt;/span&gt;&lt;span style="color: #008000; "&gt;*/&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;        &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (lstRandomValues.InvokeRequired)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000; "&gt;/*&lt;/span&gt;&lt;span style="color: #008000; "&gt; Executes a delegate asynchronously &lt;br /&gt;               on the thread that the control's &lt;br /&gt;               underlying handle was created on. &lt;/span&gt;&lt;span style="color: #008000; "&gt;*/&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt;            lstRandomValues.BeginInvoke(&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; UpdateMyListBoxHandler(&lt;br /&gt;                    lstRandomValues.Items.Add), &lt;br /&gt;                    r.Next().ToString());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;1.) We created a delegate to execute on the same thread as the one the listbox handle was created on.&lt;br /&gt;2.) Then in our thread we check by InvokeRequired, if processing happens on the same thread as the thread the listbox handle was created on.&lt;br /&gt;3.) If invoke is required (which it will always in this example, I think) :) , we execute the delegate asynchronously with parameters, on the same thread the listbox handle was created on.&lt;br /&gt;&lt;br /&gt;So the solution is slightly more complex than the original, but it's the correct way to do it.&lt;br /&gt;&lt;br /&gt;Let me know if it needs a little more explaining.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-433450502138880949?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/433450502138880949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=433450502138880949' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/433450502138880949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/433450502138880949'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/08/cross-thread-calls.html' title='Cross-thread Calls'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4OwtBc_eTGY/RtWPvpaPrxI/AAAAAAAAADM/alwcsGYV2gQ/s72-c/error.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-6236541558781084424</id><published>2007-08-29T07:52:00.001+02:00</published><updated>2007-08-30T07:23:53.784+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rant'/><category scheme='http://www.blogger.com/atom/ns#' term='Funny'/><title type='text'>Office cleaning products</title><content type='html'>&lt;a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4OwtBc_eTGY/RtUJz5aPrwI/AAAAAAAAADE/hoouPtFHGPI/s1600-h/mrmin.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_4OwtBc_eTGY/RtUJz5aPrwI/AAAAAAAAADE/hoouPtFHGPI/s200/mrmin.png" alt="" id="BLOGGER_PHOTO_ID_5103996539883204354" border="0" /&gt;&lt;/a&gt;Check out that fake smile and perfect hair. It seems to be a common trend in companies to arm the cleaning staff with a never ending supply of Mr Min.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me:&lt;/span&gt; "Where's the coffee?"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Company:&lt;/span&gt; "We've run out for the month."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me:&lt;/span&gt; "What?!"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Company:&lt;/span&gt; "Employees drink too much coffee, and we're not buying more this month. Drink water."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me:&lt;/span&gt; "Hu?"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cleaning staff:&lt;/span&gt; "Sorry. Can I clean your desk?" &lt;span style="font-style: italic;"&gt;[Takes cap of Mr Min can]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me:&lt;/span&gt; "Hey. Wait! Don't spray my desk. Or my computer. Or anywhere near me."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cleaning staff:&lt;/span&gt; "Eh, no cleaning? It has nice smell, and makes shiny desk."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me:&lt;/span&gt; "Why? The desk isn't even real wood? And it does not smell good."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cleaning staff:&lt;/span&gt; "Eish" &lt;span style="font-style: italic;"&gt;[Looks bewildered]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me:&lt;/span&gt; "Don't you ever run out of Mr Min? You spray like a million desks per day."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cleaning staff:&lt;/span&gt; "No" &lt;span style="font-style: italic;"&gt;[Moving on the next desk]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me:&lt;/span&gt; *sigh* *sneeze*&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Post Disclaimer: The characters and events depicted in this blog is fictitious. Any resemblance to specific events or persons is entirely accidental.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-6236541558781084424?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/6236541558781084424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=6236541558781084424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/6236541558781084424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/6236541558781084424'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/08/office-cleaning-products.html' title='Office cleaning products'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4OwtBc_eTGY/RtUJz5aPrwI/AAAAAAAAADE/hoouPtFHGPI/s72-c/mrmin.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-3695244994378936647</id><published>2007-08-28T07:22:00.000+02:00</published><updated>2007-08-30T07:24:32.768+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Health'/><category scheme='http://www.blogger.com/atom/ns#' term='Rant'/><title type='text'>People are not well *cough*</title><content type='html'>&lt;a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4OwtBc_eTGY/RtO5vJaPrvI/AAAAAAAAAC8/FnulQBXkvOg/s1600-h/MetaPills.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_4OwtBc_eTGY/RtO5vJaPrvI/AAAAAAAAAC8/FnulQBXkvOg/s200/MetaPills.png" alt="" id="BLOGGER_PHOTO_ID_5103627022371892978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I hate salad. It's green and tastes like nothing, especially cucumber. Rabbits like it though. But (apparently) salad is good for you, so once in a while I'll sooth my conscience by eating some of the green stuff. I also try to visit the gym as much as possible, though probably not enough. And I avoid fast foods as much as possible. Especially that place with the clown guy… Ronald. &lt;span style="font-weight: bold;"&gt;So where am I going with this post?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sick people. Just to be safe, I’ll refer to them as unwell. I know some people who are unwell all the time. If it’s not flu, it’s a headache. They cough and sneeze. Complain all the time and drink pills. Especially the complaining! “Oh, I feel so sick.” “Oh, my whole body is in pain.” What’s going on?&lt;br /&gt;&lt;br /&gt;And then you start to notice small things. Normally (and I’m making a very big assumption here…  “assumption is the mother of all f***-ups”) these unwell people don’t live healthy lifestyles. Fatty food for breakfast. Too much coffee. Zero exercise. Smoking. Drinking in excess. And that’s just the things I know about.&lt;br /&gt;&lt;br /&gt;Come on people. If you want to feel a little healthier, get sick less often, have less headaches, start living healthier life. And stop complaining!! I can’t take the complaining anymore!!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;PS: I just noticed this post was about me, not being able to take the complaining anymore.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-3695244994378936647?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/3695244994378936647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=3695244994378936647' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3695244994378936647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/3695244994378936647'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/08/people-are-not-well-cough.html' title='People are not well *cough*'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4OwtBc_eTGY/RtO5vJaPrvI/AAAAAAAAAC8/FnulQBXkvOg/s72-c/MetaPills.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-4415903702724115547</id><published>2007-08-22T08:31:00.001+02:00</published><updated>2007-08-30T07:24:20.691+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pictures'/><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Cape Town'/><title type='text'>Panoramic pic</title><content type='html'>&lt;a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4OwtBc_eTGY/RsvY0paPruI/AAAAAAAAAC0/BCIvPh0q2aw/s1600-h/panoramic_from_it_offices.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: none; cursor: pointer;" src="http://3.bp.blogspot.com/_4OwtBc_eTGY/RsvY0paPruI/AAAAAAAAAC0/BCIvPh0q2aw/s320/panoramic_from_it_offices.jpg" alt="" id="BLOGGER_PHOTO_ID_5101409401907949282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Let me start with a panoramic shot from the office. Check &lt;a href="http://www.cs.ubc.ca/%7Embrown/autostitch/autostitch.html" target="_blank"&gt;Autostitch&lt;/a&gt; on how to create photographs like this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-4415903702724115547?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/4415903702724115547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=4415903702724115547' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/4415903702724115547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/4415903702724115547'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/08/panoramic-pic.html' title='Panoramic pic'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4OwtBc_eTGY/RsvY0paPruI/AAAAAAAAAC0/BCIvPh0q2aw/s72-c/panoramic_from_it_offices.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2352821992277058467.post-2998461101993491814</id><published>2007-08-22T08:27:00.000+02:00</published><updated>2007-08-22T08:29:13.862+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Version 2.0</title><content type='html'>Blogger.com ate my previous blog. Hence version 2.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2352821992277058467-2998461101993491814?l=christogreeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christogreeff.blogspot.com/feeds/2998461101993491814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2352821992277058467&amp;postID=2998461101993491814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/2998461101993491814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2352821992277058467/posts/default/2998461101993491814'/><link rel='alternate' type='text/html' href='http://christogreeff.blogspot.com/2007/08/version-20.html' title='Version 2.0'/><author><name>Christo</name><uri>http://www.blogger.com/profile/06387504011835217788</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
