<?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-6094800596146935474</id><updated>2012-02-16T09:48:32.107-08:00</updated><category term='video training'/><category term='C++ .NET'/><category term='Virtual PC'/><category term='Novell'/><category term='Webparts'/><category term='Windows Server 2008'/><category term='cross training'/><category term='Windows API'/><category term='contracting'/><category term='projects'/><category term='new hire orientation'/><category term='SOA'/><category term='Error Handling'/><category term='PeopleWare'/><category term='ASP.NET'/><category term='software development'/><category term='C++'/><category term='down time'/><category term='Emotional Intelligence'/><category term='Themes'/><category term='Access Basic'/><category term='MCSD'/><category term='performance goals'/><category term='personal evaluation'/><category term='consulting'/><category term='Software Design'/><category term='Negotiation'/><category term='MS Access 2.0'/><category term='Certifications'/><category term='MCPD'/><category term='NTier'/><category term='IT Management'/><category term='UpdatePanel'/><category term='Classic ASP'/><category term='Design Patterns'/><category term='training'/><category term='Resonant Leadership'/><category term='ADO'/><category term='Secure Coding'/><category term='SQL Server 2008'/><category term='Blast from the Past'/><category term='Javascript'/><category term='Troubleshooting'/><category term='performance evaluation'/><category term='.NET Refactoring'/><category term='Gifted and Talented'/><category term='Software Architecture'/><category term='Exception Handling'/><category term='Custom Controls'/><category term='Dissonant Leadership'/><category term='new hires'/><category term='team development'/><category term='NLIST'/><category term='WCF'/><category term='ScriptManager'/><category term='Coding Standards'/><category term='MCITP'/><category term='Enterprise Library'/><category term='Sharepoint'/><category term='SQL Server Stored Procedures'/><category term='Skins'/><category term='Ajax.NET'/><category term='Web Page Design'/><category term='Agile Development'/><category term='Exceptions'/><category term='Silverlight'/><title type='text'>The Hawthorne Effect</title><subtitle type='html'>I'm a software development consultant in northeastern Ohio. I've worked on projects in a number of different companies, and I've earned several Microsoft certifications on the way: MCSD in .NET, MCPD/Enterprise Developer, MCITP in MS SQL Server 2005 Database Development. I'm here to share my viewpoints and experience for the software development community at large, so that we can make our projects effective, efficient, profitable and fun!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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>50</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6094800596146935474.post-4643602192392942798</id><published>2010-09-13T08:04:00.001-07:00</published><updated>2010-09-13T08:04:49.083-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance evaluation'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><title type='text'>Dealing with Envy In the Workplace</title><content type='html'>&lt;p&gt;I came across this article when thinking about the role of envy and competition in the workplace: &lt;a href="http://www.guardian.co.uk/money/2010/jun/19/envy-workplace-recession"&gt;Envy in the workplace: Jealous guise&lt;/a&gt;. The &lt;em&gt;Harvard Business Review&lt;/em&gt; article that it is cited in this article is also worth finding and reading. It’s noteworthy that IT firms were some of the companies cited in the articles. One of the problems that managers do need to watch out for is the situation when one worker tries to sabotage and hold back another person because of the green eyed monster. This can have tremendous negative impact on an organization and sink or delay critical projects if one person tries to keep another from receiving due credit. &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:0767317B-992E-4b12-91E0-4F059A8CECA8:8dd70b1b-c80c-4903-b095-2a0f2d92f765" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Workplace+bullying" rel="tag"&gt;Workplace bullying&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Envy+in+the+workplace" rel="tag"&gt;Envy in the workplace&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-4643602192392942798?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/4643602192392942798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/09/dealing-with-envy-in-workplace.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/4643602192392942798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/4643602192392942798'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/09/dealing-with-envy-in-workplace.html' title='Dealing with Envy In the Workplace'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-606936817080980229</id><published>2010-08-18T11:23:00.001-07:00</published><updated>2010-08-18T12:12:59.195-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='Blast from the Past'/><category scheme='http://www.blogger.com/atom/ns#' term='Troubleshooting'/><title type='text'>Troubleshooting the Generic Error Message</title><content type='html'>&lt;p&gt;A few years ago some Visual Basic 6 code that I had written returned the following error code: Microsoft Oracle Driver: ODBC/OLE DB error –2147217900. I was adding an update to some legacy code at the time; prior to that time and since then I’ve written code primarily in C# and VB.NET. Yet sometimes the errors that can come up in .NET can easily be as difficult to troubleshoot as this one. The result when the solution is found can be not only that the application is made properly functional and robust, but that as a professional developer one can learn more about the code, the application as a whole and the application’s underlying environment and architecture than otherwise, So, taking the troubleshooting to its conclusion can actually be a valuable learning experience and step forward in one’s own professional development. &lt;/p&gt;  &lt;p&gt;The first step that I took was to find out as much as I could about what the error message means. Researching the meaning of the error&amp;#160; is the step that many inexperienced programmers do not take or do not pursue as thoroughly as they could. It’s sometimes been painfully difficult for me to get them to look up the error code and message in the MSDN documentation, Google or Bing. Yet that’s often the quickest way to understand what the error is and why it occurred. A developer who does this will often find a quick and immediate solution as well, such as a missing configuration file entry. But in my case, all I could come up with was this meaning for the message: “Syntax error or access violation.”&lt;/p&gt;  &lt;p&gt;The code compiled and ran correctly until it tried to execute a SQL statement to access the database. The SQL statement was actually calling a stored procedure with parameters. It ran correctly on the development machine when it accessed the development database. So, my troubleshooting steps went along the lines of investigating whether there were problems with the syntax of the SQL statement when it was being executed or the access rights of the identities which the application used to access the database. &lt;/p&gt;  &lt;p&gt;My steps included: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Checking the access level on database tables and the Oracle stored procedure. &lt;/li&gt;    &lt;li&gt;Double-checking the execution of the stored procedure under the actual client ID that the application was using to access the database. &lt;/li&gt;    &lt;li&gt;Upgrading MDAC when MSDN documentation suggested that a later version would be beneficial. &lt;/li&gt;    &lt;li&gt;Adding debugging code to print out to a local file the values assigned to the parameters of the stored procedure before the procedure was executed to make sure that they were being assigned correctly. &lt;/li&gt;    &lt;li&gt;Double-checked the call to the stored procedure that was in the ODBC syntax: “{ call &amp;lt;procedure&amp;gt; ( {?, ?, ?} ) }”. &lt;/li&gt;    &lt;li&gt;Double-checked the parameter names even though it was clear that ODBC was using the ordinals for database table column access. &lt;/li&gt;    &lt;li&gt;Used the debugger and immediate window inside Visual Studio to research the successfully executing syntax as much as possible. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As it turned out, there was an obscure permissions problem with the generic user id that the application normally ran under on the application server. When this was corrected, the error message disappeared.&lt;/p&gt;  &lt;p&gt;The reason that I’m able to reproduce the steps that I took to troubleshoot and resolve this error is because I started a troubleshooting log when it became clear to me that this error had no immediate and obvious solution. This is also a troubleshooting method which many inexperienced programmers do not take. This involves writing down each possible cause and solution that is researched, attempted and the result. This includes such things as code modifications, environmental modifications and configuration modifications. This helps not only to find the cause of the problem, but also to be able to roll back attempted solutions which do not resolve the problem – something which is as important as solving the problem itself. &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:0767317B-992E-4b12-91E0-4F059A8CECA8:c589c259-493c-4064-9f22-afe5078ae015" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Error+Handling" rel="tag"&gt;Error Handling&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Troubleshooting" rel="tag"&gt;Troubleshooting&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Troubleshooting+log" rel="tag"&gt;Troubleshooting log&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Generic+Error+Messages" rel="tag"&gt;Generic Error Messages&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Troubleshooting+procedures" rel="tag"&gt;Troubleshooting procedures&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-606936817080980229?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/606936817080980229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/08/tales-from-mini-lab-troubleshooting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/606936817080980229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/606936817080980229'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/08/tales-from-mini-lab-troubleshooting.html' title='Troubleshooting the Generic Error Message'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-1088500522984546298</id><published>2010-08-18T08:13:00.001-07:00</published><updated>2010-08-18T08:26:33.657-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding Standards'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Refactoring'/><title type='text'>.NET Refactoring Opportunities: Synchronization Locks</title><content type='html'>&lt;p&gt;This post will begin a series of posts on common coding problems that I’ve seen in .NET applications over the years. Most of these are documented problems or best practices, yet many times these can be found in source code. Understanding and correcting these can often provide dramatic differences in existing applications in performance, maintenance and robustness.The first one deals with a problem that I’ve seen even in sample code included in corporate standards documents. &lt;/p&gt;  &lt;p&gt;What’s wrong with this C# code?&lt;/p&gt;  &lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; DaleWare.BlogDemo.CSharpDemoLibrary&lt;br /&gt;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;BadLock1&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; DoSomethingMethod()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;lock&lt;/span&gt; (&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;BadLock1&lt;/span&gt;))&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// something I want to synchronize goes here&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Or the equivalent Visual Basic code?&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;Public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;BadLock1&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;Public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Shared&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Sub&lt;/span&gt; DoSomething()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;SyncLock&lt;/span&gt; (&lt;span style="color: blue"&gt;GetType&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;BadLock1&lt;/span&gt;))&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;' Something that I want to synchronize goes here&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;End&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;SyncLock&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;End&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;End&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Class&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Or this C# code? &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: blue"&gt;usin&lt;font color="#000000"&gt;g&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; System.Text;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; DaleWare.BlogDemo.CSharpDemoLibrary&lt;br /&gt;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;BadLock2&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; DoSomethingMethod()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;lock&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// something I want to synchronize goes here&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;}&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Or this equivalent Visual Basic code?&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas"&gt;&lt;font color="#000000"&gt;&lt;span style="color: blue"&gt;Public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;BadLock2&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;Public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Sub&lt;/span&gt; DoSomething()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;SyncLock&lt;/span&gt; (&lt;span style="color: blue"&gt;Me&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;' Something that I want to synchronize goes here&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;End&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;SyncLock&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;End&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;End&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Class&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;All of these examples do something that appears in Microsoft documentation as a worst practice: locking on a type (C# &lt;em&gt;typeof(class)&lt;/em&gt; or Visual Basic &lt;em&gt;GetType(class)&lt;/em&gt;) or on an object (Visual Basic &lt;em&gt;Me&lt;/em&gt; or C# &lt;em&gt;this&lt;/em&gt;) itself. This is a known problem that can cause deadlocks or unnecessary delays in execution. Searching on Google or Bing can produce a number of developers who’ve run into these problems and Microsoft documentation warning not to lock on the type or the object instance.The recommendation is now, and has been for some time, to lock rather on a private object variable on each class.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Here is an example in C#:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; DaleWare.BlogDemo.CSharpDemoLibrary&lt;br /&gt;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;CorrectLock&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;object&lt;/span&gt; _syncObject = &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;object&lt;/span&gt;();&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; DoSomethingMethod()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;lock&lt;/span&gt; (_syncObject)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// something I want to synchronize goes here&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;And here is an example in Visual Basic:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;Public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;CorrectLock&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;Private&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Shared&lt;/span&gt; _syncObject &lt;span style="color: blue"&gt;As&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;New&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Object&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;Public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Shared&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Sub&lt;/span&gt; DoSomething()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;SyncLock&lt;/span&gt; (_syncObject)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;' Something that I want to synchronize goes here&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;End&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;SyncLock&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;End&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;End&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Class&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This is a simple change that can be made during refactoring source code, code inspections and standards documentation and revision. And it is worth it to avoid possible deadlocks and other synchronization problems in a corporate .NET application.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f84b912c-9716-40be-a8ed-1b2ee3ed2705" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Refactoring" rel="tag"&gt;Refactoring&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.NET+synchronization" rel="tag"&gt;.NET synchronization&lt;/a&gt;,&lt;a href="http://technorati.com/tags/lock(this)" rel="tag"&gt;lock(this)&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SyncLock(Me)" rel="tag"&gt;SyncLock(Me)&lt;/a&gt;,&lt;a href="http://technorati.com/tags/lock(typeof(" rel="tag"&gt;lock(typeof(&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SyncLock(GetType(Me))" rel="tag"&gt;SyncLock(GetType(Me))&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-1088500522984546298?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/1088500522984546298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/08/net-refactoring-opportunities.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/1088500522984546298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/1088500522984546298'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/08/net-refactoring-opportunities.html' title='.NET Refactoring Opportunities: Synchronization Locks'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-2740730475968127454</id><published>2010-08-17T09:30:00.001-07:00</published><updated>2010-08-17T09:30:53.737-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='contracting'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>PeopleWare Issues: Professional Culture and Party Culture</title><content type='html'>&lt;p&gt;In a &lt;a href="http://thedalehawthorneeffect.blogspot.com/2010/08/what-my-nontraditional-it-background.html"&gt;previous post&lt;/a&gt;, I mentioned departmental ‘happy hour’ get togethers in IT organizations. I’m not out to eliminate them totally, but I think that managers and team leaders do need to be more aware of the issues that can happen. &lt;/p&gt;  &lt;p&gt;The first issue is that some IT organizations may have some ‘party animals’ who may pressure others to drink, to drink heavily and to get drunk. I’m not sure that managers and HR people are cognizant of the issues that this could cause with the lives of coworkers and the possible issues of harassment, litigation and liability that might happen. I myself simply refuse to go along and don’t want even to be seen as implying or threatening any kind of lawsuits on my own behalf, but I’m simply sharing information that may be overlooked and seeking to make some constructive suggestions.&lt;/p&gt;  &lt;p&gt;There are a number of people in IT who do not drink because of moral and religious convictions, and I’m not unique in that regard. For instance, many Christians, and Muslims and Mormons in general, do not drink because of religious convictions. Moreover, a person going through an addiction recovery program such as Alcoholics Anonymous will not drink because that person has the conviction that, for that person, “One drink is too many.” Those of us who do not drink because of our convictions simply should not come under undue pressure to do so at a get together under the auspices of our place of employment. To allow this to happen could cause issues of corporate liability and litigation for anti-religious harassment and failure to accommodate an employee’s strongly held religious beliefs.&lt;/p&gt;  &lt;p&gt;There is a possible issue of corporate litigation and liability as well if there is pressure to drink heavily and to get drunk at a corporate social gathering if someone ends up driving home under the influence of alcohol. This could result in that person being charged with a civil crime, and if there is an accident or death involved, the corporation has been named in civil lawsuits in these cases in the past. I’ve worked with corporations who did provide taxi rides home for anyone who felt the need of one, and that is a policy which I also support. &lt;/p&gt;  &lt;p&gt;Here are several suggestions that I would make:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Seek to provide other social activities besides ‘happy hour’ get togethers. Lunch get togethers usually work well, and these often provide the opportunity for coworkers to attend who could not attend an after hours ‘happy hour’ get together because of family priorities. Single parents who need to pick up their children from day care and parents who need to be home when their children come home from school are also often left out for after hours ‘happy hour’ activities.&lt;/li&gt;    &lt;li&gt;Managers and supervisors need to be aware of and correct anyone that is trying to put undue pressure on someone else to drink and get drunk. A simple, “Knock it off” or “Drop it” would usually be sufficient.&lt;/li&gt;    &lt;li&gt;Managers and supervisors should consider whether someone who is getting consistently drunk and pressuring others to drink at these gatherings is in fact an alcoholic. Many corporations offer employee assistance programs to deal with this issue, and this may be something that a manager needs to speak to an employee about with the assistance of HR.&lt;/li&gt;    &lt;li&gt;Managers and supervisors need to understand how embarrassing and difficult it could be for someone to bring up the issue of being pressured to drink against one’s convictions can be. It’s something that a person may simply want to go away and not make an issue about, and not appear to be trying to play a victim. If someone does approach with this concern, be prepared to deal with the issue sensitively with all concerned parties and to prevent any kind of retaliation.&lt;/li&gt; &lt;/ul&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:0767317B-992E-4b12-91E0-4F059A8CECA8:0e8e2361-320d-46d3-93c8-aa46fdd96cc9" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/IT+Management" rel="tag"&gt;IT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Professional+Culture" rel="tag"&gt;Professional Culture&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Party+Culture" rel="tag"&gt;Party Culture&lt;/a&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/6094800596146935474-2740730475968127454?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/2740730475968127454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/08/peopleware-issues-professional-culture.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/2740730475968127454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/2740730475968127454'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/08/peopleware-issues-professional-culture.html' title='PeopleWare Issues: Professional Culture and Party Culture'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-38762057705018863</id><published>2010-08-16T14:07:00.001-07:00</published><updated>2010-08-16T14:07:06.578-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new hire orientation'/><category scheme='http://www.blogger.com/atom/ns#' term='cross training'/><category scheme='http://www.blogger.com/atom/ns#' term='contracting'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='training'/><category scheme='http://www.blogger.com/atom/ns#' term='new hires'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>PeopleWare Issues: New Employee Orientation and Cross Training in IT</title><content type='html'>&lt;p&gt;Over the years I’ve done a great deal of bringing new employees up to speed and cross training others as a part of my responsibilities; I’ve also served as a team lead on jobs and trained others even before I entered IT. I’ve been seeing some common tendencies that happen when others in IT try to train new hires and colleagues. I think that understanding and dealing with these tendencies will help our IT organizations to bring new hires to consistency and productivity much more quickly and help to make sure that orientation and cross training really does deliver IT employees the information that that they need to perform their responsibilities. &lt;/p&gt;  &lt;p&gt;Here are the tendencies I’ve seen, with their IT-appropriate acronyms:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;TMITQ&lt;/strong&gt;: &lt;u&gt;T&lt;/u&gt;oo &lt;u&gt;M&lt;/u&gt;uch &lt;u&gt;I&lt;/u&gt;nformation &lt;u&gt;T&lt;/u&gt;oo &lt;u&gt;Q&lt;/u&gt;uickly: The person doing the training has a motor-mouth delivery that throws out a lot of technical information all at once. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;TMT&lt;/strong&gt;: &lt;u&gt;T&lt;/u&gt;oo &lt;u&gt;M&lt;/u&gt;uch &lt;u&gt;T&lt;/u&gt;alking: The person doing the training indulges in a one sided lecture to the other employee as a captive audience. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;TMA:&lt;/strong&gt; &lt;u&gt;T&lt;/u&gt;oo &lt;u&gt;M&lt;/u&gt;any &lt;u&gt;A&lt;/u&gt;ssumptions: The person doing the training makes too many assumptions about what the other person already knows or doesn’t know or comes to know as a result of the training. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;NGP:&lt;/strong&gt; &lt;u&gt;N&lt;/u&gt;ew &lt;u&gt;G&lt;/u&gt;uy (or &lt;u&gt;G&lt;/u&gt;al) &lt;u&gt;P&lt;/u&gt;aranoia: The person doing the training has some kind of misgivings about the other person’s qualification or something else about the new person. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here are my suggestions for anyone helping to bring a new person up to speed or doing any kind of cross training: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Understand the purpose of orientation and training.&lt;/strong&gt; &lt;strong&gt;&lt;u&gt;It is to give the other person the information that he or she needs to do his or her job and the tasks that are a part of the job. It is not to try to impress a captive audience with a display of your knowledge.&lt;/u&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Get to know enough about the other person’s educational and work experience at the start of training so that you can tailor the training to the person’s level of understanding. Remember that it’s a great waste of time to belabor the basics with senior people who come in with a great deal of experience.&lt;/li&gt;    &lt;li&gt;Don’t make the training just technical, but include positive things about company culture, goals and objectives. Avoid any complaining about anything or anyone. &lt;/li&gt;    &lt;li&gt;Do not rush through the training, but pace the training to what is comfortable for the other person. Speak slowly and clearly enough so that you see the ‘wheels turning’ as the other person digests what is being communicated, and be ready to stop and clarify if you sense that the other person is getting confused.&lt;/li&gt;    &lt;li&gt;Give the other person a chance to take notes and ask questions. In fact, regularly stop, ask if there are any questions and provide the best answers that you can. It should be a regular understanding that there are no stupid questions in IT, but rather conscientious people trying to get the information they need to do their jobs.&lt;/li&gt;    &lt;li&gt;If possible, do the training on the other person’s computer, and allow the other person to use the mouse and keyboard as much as possible. If the training involves using a browser, give the other person a chance to bookmark sites.&lt;/li&gt;    &lt;li&gt;Provide the other person with as much application and infrastructure information, diagrams and documentation as necessary to do the job. It’s reasonable to give the other person the names of any relevant servers, websites or applications, and to write these down if they do not appear on any documentation.&lt;/li&gt;    &lt;li&gt;Repeat things if necessary, since repetition is often necessary to retain information. If someone asks a question that requires repetition of something that was previously discussed, don’t assume that the other person wasn’t paying attention. Rather, the other person may simply need to make connections with the different kinds of information that were provided earlier. Simply backtrack to what had been previously discussed, and take it forward to where the current focus of the training is. &lt;/li&gt;    &lt;li&gt;If the training includes modifying and checking in code or fixing bugs – and it should in a software development job – go through fairly simple examples at first, and allow the other person to see the source code and development environment.&lt;/li&gt;    &lt;li&gt;If there are internally developed utilities or libraries, or utilities and libraries which with the other is unfamiliar used in the software development process in your organization, provide any documentation, cheatsheets, support websites and anything else helpful to be able to use these utilities and libraries. Inexperience or unfamiliarity here does not mean that the other person does not have the qualifications, experience or capabilities to do the job; it usually means that the other person has worked in another environment or hasn’t had to use them.&lt;/li&gt;    &lt;li&gt;If the other person makes mistakes, provide correction and help to resolve any problems without humiliating the other person. Treat each one as a learning experience.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;One of the biggest financial investments that IT organizations make is in hiring new employees and in bringing in contractors and consultants to provide additional skills and help shoulder the workload. Simply making sure that new employee orientation and cross training is effective is a great part of making sure that that investment pays off quickly and completely.&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:0767317B-992E-4b12-91E0-4F059A8CECA8:b9fbe2a3-8008-4cdc-ae99-a186a93edf6e" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Training" rel="tag"&gt;Training&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Cross+Training" rel="tag"&gt;Cross Training&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IT+Management" rel="tag"&gt;IT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Lateral+Leadership" rel="tag"&gt;Lateral Leadership&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Team+Leadership" rel="tag"&gt;Team Leadership&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Team+Development" rel="tag"&gt;Team Development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/New+Hire" rel="tag"&gt;New Hire&lt;/a&gt;,&lt;a href="http://technorati.com/tags/New+Employee+Orientation" rel="tag"&gt;New Employee Orientation&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-38762057705018863?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/38762057705018863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/08/peopleware-issues-new-employee.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/38762057705018863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/38762057705018863'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/08/peopleware-issues-new-employee.html' title='PeopleWare Issues: New Employee Orientation and Cross Training in IT'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-3534142595279778057</id><published>2010-08-16T12:24:00.001-07:00</published><updated>2010-08-17T05:02:12.028-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='contracting'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>What My ‘NonTraditional’ IT Background Really Means</title><content type='html'>&lt;p&gt;Over a decade ago, during an interview, a hiring manager whom I greatly respect remarked about my resume, that it was one of the most unique ones in IT. I found that to be an entertaining and tactful way to put it. &lt;/p&gt;  &lt;p&gt;Here’s what’s different about it. I have a Master of Divinity degree, and served as a pastor in &lt;a href="http://www.cmalliance.org/"&gt;the Christian and Missionary Alliance&lt;/a&gt; from 1985-1993. That’s not where most people in IT come from. What’s more, my undergraduate degree is in Classics -– Greek and Roman language, literature and culture. That’s not the Computer Science or Engineering degree that many of my colleagues have earned.&lt;/p&gt;  &lt;p&gt;So, what does this mean as far as my qualifications for IT, and specifically, for software development? Well, on the one hand, that’s not all that there is about my background, skills and qualifications, and on the other hand, there are some things from that part of my background that have some relevancy.&lt;/p&gt;  &lt;p&gt;First, there are some false preconceptions that others have about what it has meant for me to be a pastor and what it means for me now. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;As a pastor, I wasn’t some kind of political operative. Political indoctrination wasn’t and isn’t part of the mission of a church nor the responsibilities of a pastor. In fact, the IRS will easily revoke the tax exempt status of a church, and in the process, probably get the pastor fired and blacklisted from his denomination if the pastor undertakes these kinds of activities as a church activity and the church facilities are used for political activities. &lt;/li&gt;    &lt;li&gt;My background as pastor does not mean that I will come in and try to be the ‘moral policeman’ of a department or an organization. There will be activities that I may decide not to participate in, such as departmental ‘happy hour’ get-togethers, depending on how much pressure there is before and during the activity to drink and to get drunk. (I would add that managers need to be aware of the issues with liability and litigation that can result from these situations.) Nor am I a prohibitionist who goes around trying to reform the ‘party animals’ in an organization. In other words, I will seek to live in accordance with my own convictions, and that can be an asset to an organization, because those convictions include working with foresight, skill and integrity. &lt;/li&gt;    &lt;li&gt;My background as pastor does not mean that I will try to do ‘churchy’ things during the course of a work day. As far as me doing things like stopping my work, standing up and delivering impromptu sermons during the middle of the work day, or trying to perform weddings for others in the organization, or badgering people about attending my church – those things simply aren’t going to happen. &lt;/li&gt;    &lt;li&gt;I’m not a part of some paramilitary militia or anything like that. I’ve served in a respected denomination that’s been around for over a century with a publicly available website and statement of faith on that website. &lt;/li&gt;    &lt;li&gt;I’m not a Catholic priest, nor have I ever been a part of the Roman Catholic Church; I’m a Protestant minister, and no one ever has to call me, ‘Father’, ‘Pastor’ or ‘Reverend.’ I’ve actually always preferred simply to be called ‘Dale.’ &lt;/li&gt;    &lt;li&gt;I didn’t leave the pastorate because of being connected with any kind of scandal. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Second, the course of my education and background has provided considerable skills and capabilities that proved to be transferable to IT:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;As a pastor, I was responsible for public speaking two to three times per week. This transfers into being comfortable in front of audiences and being able to deliver presentations. &lt;/li&gt;    &lt;li&gt;As a pastor, sermon preparation called for a great deal of self study and self initiative to get things done each week. So I’ve been proactive outside the pastorate in finding and getting the training that I’ve needed, reading the manuals and documentation, and getting things accomplished without a great deal of supervision and micromanagement. &lt;/li&gt;    &lt;li&gt;During my high school, college and seminary education, I gained fluency in Latin, ancient Greek and Biblical Hebrew – three languages which no one speaks. This gave me experience in working with human languages no one speaks, which transfers to working with programming languages no one speaks, and a prior understanding of different fonts and alphabets. Unicode, anyone? &lt;/li&gt;    &lt;li&gt;My math and philosophy education included symbolic logic, pre-calculus and calculus, and I understood and was easily able to work with things like Boolean logic, sets, functions and coordinate systems. &lt;/li&gt;    &lt;li&gt;During my education, writing played a major part in achieving my degrees, and my ability to write clearly has helped me with preparing technical documentation and with other areas of my work that called for expressing my thoughts and communicating to others clearly through the written word. &lt;/li&gt;    &lt;li&gt;My business experience outside IT and the pastorate included call center, business process documentation, financial accounting and operations research experience, and helped me to understand business beyond IT. Moreover, it gave me some ideas and convictions about what efficiency, profitability and customer service mean to a business as a whole. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Third, since I left the pastorate in 1993, I’ve definitely sought to gain whatever training and education that I’ve needed. Here are some things that I’ve done:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;I’ve had a personal Microsoft Developer Network (MSDN) license pretty much since 1998, and I first learned classic ASP and MS SQL Server primarily through going through the MSDN documentation. &lt;/li&gt;    &lt;li&gt;I’ve taken internal employer provided training wherever possible, and this has included classroom training on Visual C++, DB2, Mercury WinRunner, LoadRunner and TestDirector, quality assurance for IT, and project management, among others, computer based training on C, C++, Visual Basic, HTML, and COBOL, among others. &lt;/li&gt;    &lt;li&gt;I’ve taken classes in the Master of Business Administration program at the Weatherhead School of Management at Case Western Reserve University, which included a class on object oriented development and the Unified Modeling Language. &lt;/li&gt;    &lt;li&gt;I’ve attended outside special interest groups and seminars where available, and count myself quite fortunate to have heard such technical lights as Juval Lowy, Kathleen Dollard, Julie Lerman and Steve Smith in person. &lt;/li&gt;    &lt;li&gt;I’ve acquired a number of manuals over the years, and read as much as possible from classic literature. Recommended reading lists such as that in Steve McConnell’s &lt;em&gt;Code Complete&lt;/em&gt; had a considerable influence on the personal IT library that I’ve collected over the years. &lt;/li&gt;    &lt;li&gt;I’ve subscribed to a number of magazines over the years, such as &lt;em&gt;Software Development&lt;/em&gt; (now a part of &lt;em&gt;Dr. Dobb’s Journal&lt;/em&gt;), &lt;em&gt;C/C++ User’s Journal, Visual Studio Magazine&lt;/em&gt; and &lt;em&gt;MSDN Journal&lt;/em&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Moreover, to corroborate what I’ve learned, I’ve also put in the time, expense and effort to earn these IT certifications:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Microsoft Certified Developer (MCSD) in C# .NET. &lt;/li&gt;    &lt;li&gt;Microsoft Certified Professional Developer (MCPD) Enterprise Developer in C# .NET. &lt;/li&gt;    &lt;li&gt;Microsoft Certified IT Professional (MCITP) in MS SQL Server Database Development. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;What I’ve learned and put into practice without having a Computer Science or Engineering degree has been more than sufficient for me to fulfill of my work responsibilities, to make significant contributions over the years to many projects completed on time and within budget, and to provide creative and innovative solutions to specifications, requirements and wicked and difficult problems. So, my ‘non-traditional’ background did mean some difficulties in getting established in IT, but it’s made me work harder to keep my capabilities current and to provide solid contributions where I’ve worked. &lt;/p&gt;  &lt;p&gt;Over the years, I’ve come into contact with others who have had ‘non-traditional’ backgrounds and who have been working in IT and quite productive and valuable employees, contractors and consultants. When it comes down to it, no one has to understand or approve everything in the background, work experience or off-hours activities of a colleague to work effectively with that person on a team or in a project. Rather, IT provides many opportunities to work with and understand others who are different than we are, and to learn how to work effectively with them.&lt;/p&gt;  &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:0767317B-992E-4b12-91E0-4F059A8CECA8:cd8cf792-ecbe-497b-b52b-8ba33af8eefb" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/IT+NonTraditional+Background" rel="tag"&gt;IT NonTraditional Background&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-3534142595279778057?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/3534142595279778057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/08/what-my-nontraditional-it-background.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/3534142595279778057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/3534142595279778057'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/08/what-my-nontraditional-it-background.html' title='What My ‘NonTraditional’ IT Background Really Means'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-3838126423140659260</id><published>2010-08-16T10:07:00.001-07:00</published><updated>2010-08-16T14:08:47.267-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='personal evaluation'/><category scheme='http://www.blogger.com/atom/ns#' term='contracting'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='PeopleWare'/><category scheme='http://www.blogger.com/atom/ns#' term='down time'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='performance goals'/><category scheme='http://www.blogger.com/atom/ns#' term='performance evaluation'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>PeopleWare Issues: The Impending Personal Evaluation</title><content type='html'>&lt;p&gt;As a contractor/consultant, I’ve learned that when the developers who are permanent employees suddenly start doing irrational things on a project, it’s often because personal evaluations are due within a week or two. What happens are things like these: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Developers suddenly start pushing possibly unproven, retrograde and even bug ridden code that they wrote into a project, so they can beef up the accomplishments section of their personal evaluation. &lt;/li&gt;    &lt;li&gt;Developers start adding unproven, retrograde and even bug ridden external libraries into a project, so they can beef up the accomplishments section of their personal evaluation. &lt;/li&gt;    &lt;li&gt;Developers suddenly start finding long unacknowledged problems for which they can claim implementing fixes on their evaluations. &lt;/li&gt;    &lt;li&gt;People who were difficult to work with suddenly start acting nice, so that they can claim that personal conflicts which may have been mentioned on previous evaluations have been resolved. &lt;/li&gt;    &lt;li&gt;Coworkers suddenly start sending each other complimentary emails which can be copied and pasted into evaluations. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;And so on. There are a lot of things that happen when the personal evaluation is due which can cause problems in IT projects and infrastructure down the line. In addition, the material in the personal evaluation is used extensively to determine promotions, salary increases, bonuses and retention, so skewed data can result in people going into responsibilities for which they are less than qualified in terms of their skills, capabilities, work ethic and teamwork, and perhaps even holding back more qualified people. So, there’s a need to make sure that tasks which seem to being undertaken to beef up the evaluation are evaluated on their own merits and done within established procedures and within quality guidelines. There’s also a need to make sure that the evaluation represents a genuine, solid contribution to the department that has occurred over the evaluation period, and not a flurry of last minute activity nor a parasitical hijacking of credit for the contributions of others.&lt;/p&gt;  &lt;p&gt;Here are some suggestions for working through and improving the process:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;For managers: Make as clear as possible the goals of the personal evaluation process both when personal evaluations are done and personal performance goals are approved for the time to come. &lt;/li&gt;    &lt;li&gt;For managers: Ask for and suggest revisions to provide clarification in standard forms if you find a lack of clarity and that your people are consistently being confused by what standard forms mean. If you cannot do that, go over the forms and develop a list of clarifications as to what the requirements stated on the forms mean in your department&amp;#160; -- without contradicting anything set forth by upper management, HR or the legal department, of course. &lt;/li&gt;    &lt;li&gt;For managers: Be aware that some people will try to ‘game’ the process and ‘play the system’ to gain undeserved credit for themselves and sometimes at the expense of others in the department and the organization. Get ideas on how to handle these situations from HR, upper level managers and more experienced managers. It is a knock against your own reputation and other’s perception of your competence, integrity and ability if you allow people in your organization to get away with this consistently. Revisions and deletions are appropriate where the depiction of the performance on the evaluation greatly exceeds the actual performance. &lt;/li&gt;    &lt;li&gt;For upper managers and HR: Understand that some managers will likewise exaggerate the performance of their direct reports as their way of ‘gaming the system’ to gain undeserved credit for themselves and their department. While some departments really do have a high number of high performers, others may not, though they may try to give the impression that they do. It’s really not fair to downgrade the rewards available to a manager who really manages and develops a high performing team and the members of his or her team, especially if that results from undeserved credit to a manager and team which has actually performed less. &lt;/li&gt;    &lt;li&gt;For managers: Make it clear that you’re willing to clarify personal performance goals during the evaluation period. Renegotiation may be necessary in some cases. &lt;/li&gt;    &lt;li&gt;For managers: If you are adding project leadership or supervisory responsibilities to someone’s developmental goals, communicate your expectations clearly for how you expect team members to be treated and add on some kind of goals for supervisory and leadership training and enrichment. &lt;/li&gt;    &lt;li&gt;For IT personnel: Read the directions carefully for the setting of personal performance goals and the personal evaluation process beforehand. &lt;/li&gt;    &lt;li&gt;For IT personnel: Take enough time to put in your part of the personal performance goals for the coming evaluation period and the evaluation itself. Do what you need to do to guard your privacy and avoid interruptions during this time. When I did mine, I usually worked after regular working hours, especially when my cubicle was adjacent to an aisle where my computer screen could be easily seen by everyone who passed by. &lt;/li&gt;    &lt;li&gt;For newly hired and entry level IT personnel: Go over the process with an experienced, trustworthy person, and be ready to ask your manager and HR representative any questions. Make sure that this is done as requesting clarification and not criticism of the process – the first will mark you as a conscientious employee and the latter as a potential problem person. &lt;/li&gt;    &lt;li&gt;For IT personnel: Take some time – maybe a half hour to an hour every month or every two weeks – to re-read your goals for the evaluation time period, and evaluate your current activities in light of that. &lt;/li&gt;    &lt;li&gt;For IT personnel: Keep a running list of how you’ve accomplished the established performance goals throughout the year, rather than trying to think back at the last minute at what you did since the performance goals were handed out. &lt;/li&gt;    &lt;li&gt;For IT personnel: Address areas with the manager where things didn’t work out on projects and tasks well before the evaluation deadline. Find also some genuine lessons that you can sincerely say that you’ve learned from the experience, and which you can say that you will do better in the future. &lt;/li&gt;    &lt;li&gt;For IT personnel: Step back, consider the whole experience in light of your career and long term goals, and take in the whole experience as relating to building your professional experience and long term qualifications for the future. Take the initiative to deepen and broaden your own professional skills, capabilities, teamwork and integrity, not just accomplish tasks on the list. This process can aid your own development and corroboration of your professional skills, capabilities, teamwork and integrity when the time comes for you to move on to greater professional responsibilities and the concomitant professional rewards. &lt;/li&gt; &lt;/ul&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e04f9ad2-e46d-4612-9b9d-47b27db34efd" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/personal+evaluation" rel="tag"&gt;personal evaluation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/performance+evaluation" rel="tag"&gt;performance evaluation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/performance+goals" rel="tag"&gt;performance goals&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IT+management" rel="tag"&gt;IT management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PeopleWare" rel="tag"&gt;PeopleWare&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-3838126423140659260?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/3838126423140659260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/08/peopleware-issues-i-impending-personal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/3838126423140659260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/3838126423140659260'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/08/peopleware-issues-i-impending-personal.html' title='PeopleWare Issues: The Impending Personal Evaluation'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-9011446801626945073</id><published>2010-01-20T13:00:00.001-08:00</published><updated>2010-08-16T10:18:46.903-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><category scheme='http://www.blogger.com/atom/ns#' term='Themes'/><title type='text'>ASP.NET Refactoring for Performance and Maintainability</title><content type='html'>&lt;p&gt;Here are some points which I wrote down which are ways in which many legacy ASP.NET applications can be refactored for greater maintainability and performance. Usually these are the kinds of things that I see in ASP.NET applications which are developed by junior programmers or developers coming to .NET from other platforms. These kinds of changes usually deliver substantial improvements in exchange for little investment of time.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Reduce string concatenation.&lt;/strong&gt; This can often result in greater performance due to less memory being consumed in creating and disposing of string objects and less processor use. The use of StringBuilder objects, string constants with String.Format or StringBuilder.AppendFormat can often reduce the overhead with unnecessary string concatenation. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Replace inline string constants with string resource files or a constants file per namespace or assembly&lt;/strong&gt;. Many developers have string constants sprinkled throughout their .NET classes, but consolidating them either in resources files or assemblies or a constants file aids reuse of the constants and internationalization of the application. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Change DataSets to lightweight Data Transfer Objects (DTOs) and collections of DTOs.&lt;/strong&gt; I’m often surprised by how many ASP.NET applications use DataSets. Sometimes programmers prefer to filter DataSets rather than construct SQL WHERE clauses. One of the largest performance penalties that I’ve seen in an ASP.NET application came when a SQL query retrieved an entire table into a DataSet and then the DataSet was filtered on the application server. That method worked fine when the database table had only a few hundred rows, but destroyed performance when it grew to over a million rows in production. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Change .NET remoting and ASMX web services to Windows Communication Foundation (WCF).&lt;/strong&gt; .NET remoting and ASMX web services are now, since the introduction of WCF, legacy functionality. WCF delivers superior performance, flexibility and maintainability. Invest the time and effort in the change. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Replace inline styles and Web control ‘look and feel’ property settings in ASPX pages with stylesheets, skins and themes.&lt;/strong&gt; This helps to standardize the look and feel settings for an application. Usually developers unfamiliar with CSS prefer to set the properties in the Visual Studio designer. Yet the rendering is faster with standard style sheets. And skins and themes are one of the most underused features in standard ASP.NET applications. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;These simple changes can often deliver a lot to extend the life, maintainability and usability of ASP.NET applications which have been around for a while. It’s well worth it to undertake them during normal maintenance and enhancement releases.&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:0767317B-992E-4b12-91E0-4F059A8CECA8:2f7a9659-6a06-4ae3-8917-4a7783048f06" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Refactoring" rel="tag"&gt;Refactoring&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ASP.NET+Performance+Improvement" rel="tag"&gt;ASP.NET Performance Improvement&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ASP.NET+Maintainability" rel="tag"&gt;ASP.NET Maintainability&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-9011446801626945073?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/9011446801626945073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/01/aspnet-refactoring-for-performance-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/9011446801626945073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/9011446801626945073'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/01/aspnet-refactoring-for-performance-and.html' title='ASP.NET Refactoring for Performance and Maintainability'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-3892654624178864534</id><published>2010-01-14T06:35:00.001-08:00</published><updated>2010-08-16T10:14:44.068-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><title type='text'>The ‘Lack of Experience’ Obstacle in Software Development Organizations</title><content type='html'>&lt;p&gt;Kathleen Dollard, one of my favorite authors on software development, once made the remark that a lack of experience is holding our profession back. Over the years I’ve spent in software development, I’ve found substantial reason to agree. Here’s what I see as some of the obstacles to gaining a sound reservoir of experience in a software development organization.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;The loss of experienced developers and architects from software development:&lt;/strong&gt; Experienced developers and architects may go out the back door and take their experience with them. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Micromanagement by technically atrophied management:&lt;/strong&gt; A number of times experienced developers go into management in software development organizations. Usually, their technical skills quickly atrophy, and they do not keep up with current software development processes. They may continue to give directions, but their directions make less and less sense because of the growing divergence between their own base of experience and current and appropriate software development processes. That’s often the reason why many projects have a strange resemblance to the way COBOL projects were done in the 1980’s. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;‘Everyone starts at the bottom’ here ethic:&lt;/strong&gt; This is an obstacle to bringing experienced new hires up to speed quickly. The assumption is that anyone new to the organization is entry level in his or her skill set. This means underemployment of experienced developers in tasks and responsibilities for which they may be highly overqualified. It costs the organization because they are overpaying for the results that they are achieving through these developers, and they are not developing less experienced developers for the tasks and responsibilities for which they are better suited. What this means is that skills and competence that someone has acquired elsewhere are dismissed once a new person comes into the organization. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;‘We only recognize experience here’ ethic:&lt;/strong&gt; This seems to be from a self-overestimation of the uniqueness of a software development organization. It fails to recognize that there are a large number of transferable skills among developers, such as the languages, environments and work styles. In fact, if any organization is that unique, it is probably highly inefficient and dysfunctional in its development processes and the results that it achieves. Its uniqueness probably comes not from the uniqueness of the business itself but from the quirkiness and inexperience of some of those who put together the current processes, infrastructure, architecture and code base of the current organization. Genuine quality and best practices are usually not unique to a single organization, but quirkiness and the dysfunctions of unconscious incompetence usually are. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Over-idealization of recent college grads:&lt;/strong&gt; I’ve noticed that some managers far over-idealize the skills and experience of recent college grads who come into the organization. The entry level hires may have great &lt;em&gt;potential&lt;/em&gt;, but I’ve found that often they need a long period of personal growth and development in a professional environment to realize that potential. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;The pretence of perfection:&lt;/strong&gt; An IT department or software development organization falls for its own hype and self promotion. Unfortunately, people who do not learn from their mistakes are going to keep on making the same mistakes. Rather, from CIOs on down, IT departments and software development organizations need to be&lt;em&gt; learning organizations&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Business people are the source of all requirements and sponsor all projects&lt;/strong&gt;:&amp;#160; Often this means an unfair burden upon the business analysts and line business managers to understand and apply technology to the needs of business. Usually they do not have the base and breadth of experience to understand what current technology can do to generate cost savings, reduce errors, and gain competitive advantage. Rather, the burden remains on IT and software development managers, architects and developers themselves to get to know the business well enough to see the competitive advantages and cost savings that technology can provide. Creative and innovative applications will come where there is enough awareness of the business needs and capabilities of technology in enough people to see, explore and implement the possibilities.&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &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:0767317B-992E-4b12-91E0-4F059A8CECA8:0f320c63-4c1b-4774-9acb-dc651b27acf3" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/IT+Management" rel="tag"&gt;IT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Kathleen+Dollard" rel="tag"&gt;Kathleen Dollard&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Software+Development" rel="tag"&gt;Software Development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Inexperience+in+IT+Organizations" rel="tag"&gt;Inexperience in IT Organizations&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-3892654624178864534?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/3892654624178864534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/01/lack-of-experience-obstacle-in-software.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/3892654624178864534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/3892654624178864534'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/01/lack-of-experience-obstacle-in-software.html' title='The ‘Lack of Experience’ Obstacle in Software Development Organizations'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-4096740043442689825</id><published>2010-01-08T11:51:00.001-08:00</published><updated>2010-01-08T11:51:42.115-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='MS Access 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Page Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Design'/><title type='text'>Focus on Appearance: Part IV of What’s Software Development All About?</title><content type='html'>&lt;p&gt;In my previous post on &lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/08/focus-on-usability-part-iii-of-whats.html"&gt;Usability&lt;/a&gt; I dealt with some basic web usability. Usability is also related to appearance; a usable site is often a site with a pleasing appearance.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://1.bp.blogspot.com/_uDhjHk-G--Y/So2aLjzvLUI/AAAAAAAAAB0/xBeO3u1ZnLY/s1600-h/LanDB.png"&gt;&lt;img style="margin: 0px 10px 10px 0px; width: 320px; float: left; height: 222px; cursor: hand" id="BLOGGER_PHOTO_ID_5372119453904350530" border="0" alt="" src="http://1.bp.blogspot.com/_uDhjHk-G--Y/So2aLjzvLUI/AAAAAAAAAB0/xBeO3u1ZnLY/s320/LanDB.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Let’s start with another bad example from my own past. This screenshot is part of an old code sample document which I put together some years ago in the 1990s. It represents the state of the art for Microsoft Access 2.0 UI Forms in 1994. For the time, it represented a dramatic change in usability and appearance over character based mainframe application entry screens. Usually, in those screens, the user had to look over the screen for the action that he or she wanted to initiate, and press a function key or another key combination. Sometimes this involved placing the cursor on an input line and entering a command. A user was fortunate if the correct key combinations were displayed on the screen. Otherwise, this involved going to the training manual or having to memorize the correct key combinations. This kind of Windows based form in Access 2.0 was typically considered far easier to view and use than the green on black character based mainframe screens which they usually replaced. &lt;/p&gt;  &lt;p&gt;It’s unfortunately true that many web page forms on a number of corporate websites, especially intranet sites, look too much like this page. Here are the problems in the above screen which find themselves into web pages.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The use of buttons. Links are not only more functional and usable, but look and communicate better than buttons like the screen above. They also simply look worse than links.&amp;#160; &lt;/li&gt;    &lt;li&gt;The use of primary colors to communicate information. This does not work well for color blind individuals. More subtle colors are also available within the safe web palette, such as pastels, and they are better used for backgrounds and contrasts.&lt;/li&gt;    &lt;li&gt;The use of a default background color. A correct website should specify a background color which is complementary to the other colors chosen for the site or UI. At least battleship gray should normally be avoided. &lt;/li&gt;    &lt;li&gt;The use of non-complementary colors. Many corporate web pages are designed with no awareness of how complementary colors can provide color variety and contrast without being loud and straining the eyes. The unintended, almost subliminal effect is like seeing someone dressed in clothes which clash wildly. &lt;/li&gt;    &lt;li&gt;The use of asymmetrical elements. This can be because of differing text label sizes. Rather, the human eye prefers left to right symmetry, and finds something pleasing in it. &lt;/li&gt;    &lt;li&gt;The use of serif fonts. A number of corporate web pages do not specify a web-safe font. I’ve been surprised myself to find Internet Explorer users having to use Intranet sites with a lot of Times New Roman. (I’m not fond of Times New Roman even when I’m using Microsoft Word.) Most users find sans-serif fonts more pleasing to the eye. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I’ve found these kinds of problems in Intranet sites which are assigned to developers who are transitioning from some other kind of development, most commonly Visual Basic 6 or mainframe development, to web development. Or, as I stated in my previous post on usability, this may appear in sites where the pages (the ‘screens’) are being designed by business analysts who have no training or experience in contemporary web design.&lt;/p&gt;  &lt;p&gt;To avoid this, I would suggest that someone with an awareness of current web design review these kinds of sites as early as possible in the design phase. A definite set of web design standards and guidelines for intranet sites would be well worth the time to give each Intranet site a professional appearance. In addition, business analysts and beginning web developers would do well to go through a book like &lt;a href="http://www.sitepoint.com/books/design1/"&gt;The Principles of Beautiful Web Design&lt;/a&gt; if they are responsible for designing web pages. Or at least go over some of the articles on web design on a site like &lt;a href="http://www.sitepoint.com/"&gt;Sitepoint&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Software+Design"&gt;Software Design&lt;/a&gt;,&lt;a href="http://technorati.com/tags/sofware+development"&gt;sofware development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Web+Page+Design"&gt;Web Page Design&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MS+Access+2.0"&gt;MS Access 2.0&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/6094800596146935474-4096740043442689825?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/4096740043442689825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/01/focus-on-appearance-part-iv-of-whats.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/4096740043442689825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/4096740043442689825'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2010/01/focus-on-appearance-part-iv-of-whats.html' title='Focus on Appearance: Part IV of What’s Software Development All About?'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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/_uDhjHk-G--Y/So2aLjzvLUI/AAAAAAAAAB0/xBeO3u1ZnLY/s72-c/LanDB.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6094800596146935474.post-9199185789630064544</id><published>2009-08-20T12:57:00.001-07:00</published><updated>2010-01-08T11:58:28.192-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='MS Access 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Page Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Design'/><title type='text'>Focus on Usability: Part III of What’s Software Development All About?</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_uDhjHk-G--Y/So2Yk17X6CI/AAAAAAAAABk/PtpFZfFm0yw/s1600-h/LanAdmin.png"&gt;&lt;img style="text-align: center; margin: 10px; width: 320px; display: block; float: left; height: 222px; cursor: hand" id="BLOGGER_PHOTO_ID_5372117689241692194" border="0" alt="" src="http://2.bp.blogspot.com/_uDhjHk-G--Y/So2Yk17X6CI/AAAAAAAAABk/PtpFZfFm0yw/s320/LanAdmin.png" /&gt;&lt;/a&gt;   &lt;p&gt;This is the data entry form for an Access 2.0 database containing the Novell 3.x and 4.0 servers for Key Services Corporation and their corresponding parent organizations and administrators which I created in 1994 and maintained until 1997. In the time this was considered a great improvement over the character based green on black mainframe data entry screens. The user could tab from field to field, use the mouse or key combinations to press the buttons, and proceed fairly rapidly from entering new data to updating or deleting existing data. This was also the way many Visual Basic 3.0 to 6.0 application forms looked in the mid to late 90s.&lt;/p&gt;  &lt;p&gt;Then the Internet came on full steam, and web usability became more of an issue. Many sites continued, and some still do, to use web input pages that look like these old Windows 3.x forms. They demonstrated these problems:    &lt;br /&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Users were forced to scroll right many times to view and fill in any input fields to the right. If these fields off to the right were required fields, it was usually harder to find them if the page failed to submit. &lt;/li&gt;    &lt;li&gt;Many times buttons were used instead of links to open up new browser windows (which is an outmoded practice in itself) or to navigate to a new page. &lt;/li&gt;    &lt;li&gt;Unrelated data fields were often on the same page, and sometimes not even grouped separately. &lt;/li&gt;    &lt;li&gt;Pages which had a lot of data entry fields would take longer to post the data to the server. &lt;/li&gt;    &lt;li&gt;The pages often did not have an apparent logical grouping or flow to the input fields and labels. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I believe that one of the reasons why pages designed according to this outmoded idiom persist and continue on some sites is that business analysts or developers from a mainframe or Visual Basic 6 who are not familiar with contemporary web design are designing these pages. I’ve seen this enough to believe that it’s not a problem restricted to one corporation. &lt;/p&gt;  &lt;p&gt;Here is a more common way in which data entry forms are done on contemporary web pages. It’s so common that users practically do not have to think when they see a form like this. I’ve worked with web pages that follow this general pattern since 2000, in classic ASP, and it’s a more common and usable idiom on the web. &lt;/p&gt;  &lt;table border="0" cellspacing="3" cellpadding="3" width="800"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="text-align: right" valign="top" width="400"&gt;First Name &lt;/td&gt;        &lt;td valign="top" width="400"&gt;&lt;span style="border-bottom: 1px solid; border-left: 1px solid; background-color: white; border-top: 1px solid; border-right: 1px solid"&gt;First Name Text Box &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="text-align: right" valign="top" width="400"&gt;Middle Initial &lt;/td&gt;        &lt;td valign="top" width="400"&gt;&lt;span style="border-bottom: 1px solid; border-left: 1px solid; background-color: white; border-top: 1px solid; border-right: 1px solid"&gt;Middle Initial Text Box&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="text-align: right" valign="top" width="400"&gt;Last Name &lt;/td&gt;        &lt;td valign="top" width="400"&gt;&lt;span style="border-bottom: 1px solid; border-left: 1px solid; background-color: white; border-top: 1px solid; border-right: 1px solid"&gt;Last Name Text Box&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="text-align: right" valign="top" width="400"&gt;Address 1 &lt;/td&gt;        &lt;td valign="top" width="400"&gt;&lt;span style="border-bottom: 1px solid; border-left: 1px solid; background-color: white; border-top: 1px solid; border-right: 1px solid"&gt;Address 1 Text Box &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="text-align: right" valign="top" width="400"&gt;Address 2 &lt;/td&gt;        &lt;td valign="top" width="400"&gt;&lt;span style="border-bottom: 1px solid; border-left: 1px solid; background-color: white; border-top: 1px solid; border-right: 1px solid"&gt;Address 2 Text Box &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="text-align: right" valign="top" width="400"&gt;City &lt;/td&gt;        &lt;td valign="top" width="400"&gt;&lt;span style="border-bottom: 1px solid; border-left: 1px solid; background-color: white; border-top: 1px solid; border-right: 1px solid"&gt;City Text Box &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="text-align: right" valign="top" width="400"&gt;State&lt;/td&gt;        &lt;td valign="top" width="400"&gt;&lt;span style="border-bottom: 1px solid; border-left: 1px solid; background-color: white; border-top: 1px solid; border-right: 1px solid"&gt;State Dropdown List Box &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="text-align: right" valign="top" width="400"&gt;Zip&lt;/td&gt;        &lt;td valign="top" width="400"&gt;&lt;span style="border-bottom: 1px solid; border-left: 1px solid; background-color: white; border-top: 1px solid; border-right: 1px solid"&gt;Zip Text Box &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="text-align: center" valign="top" colspan="2"&gt;&lt;span style="border-bottom: 1px solid; border-left: 1px solid; border-top: 1px solid; border-right: 1px solid"&gt;Submit &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Here are some general guidelines for business analysts prototyping data entry forms/pages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Understand whether the data entry forms/pages are to be done in Windows or Web. &lt;/li&gt;    &lt;li&gt;Windows data entry pages should be prototyped with the print orientation set to landscape if the prototypes are done in Word or Powerpoint. &lt;/li&gt;    &lt;li&gt;Web input forms need to be prototyped with the print orientation set to portrait if the prototypes are done in Word or Powerpoint. &lt;/li&gt;    &lt;li&gt;Learn which input controls are appropriate to the type of input (checkboxes, radio buttons, list boxes, and dropdown list boxes). &lt;/li&gt;    &lt;li&gt;Document the correct text tooltips as well as field labels. Both web pages and Windows forms can implement tooltips, and they form a very handy way to provide immediate help to the user. &lt;/li&gt;    &lt;li&gt;Go over the prototypes with an architect or senior developer. &lt;/li&gt;    &lt;li&gt;Avoid complexity in one form or page; seek to have one form or page handle input and updating of one set of data and have it do that well. &lt;/li&gt;    &lt;li&gt;Be flexible and cooperative with developers if they suggest changes to the prototypes when they are actually implemented. The developers are the first users of the prototypes, and they can often make very constructive suggestions. &lt;/li&gt;    &lt;li&gt;Consider getting and reading the book &lt;u&gt;Paper Prototyping&lt;/u&gt; by Carolyn Snyder, and going through a paper prototyping process to investigate usability before any kind of implementation is started. &lt;/li&gt; &lt;/ul&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:89a63543-b4ca-42a6-9488-8fba245f819f" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Software+Design" rel="tag"&gt;Software Design&lt;/a&gt;,&lt;a href="http://technorati.com/tags/sofware+development" rel="tag"&gt;sofware development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Web+Page+Design" rel="tag"&gt;Web Page Design&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MS+Access+2.0" rel="tag"&gt;MS Access 2.0&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-9199185789630064544?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/9199185789630064544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/08/focus-on-usability-part-iii-of-whats.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/9199185789630064544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/9199185789630064544'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/08/focus-on-usability-part-iii-of-whats.html' title='Focus on Usability: Part III of What’s Software Development All About?'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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/_uDhjHk-G--Y/So2Yk17X6CI/AAAAAAAAABk/PtpFZfFm0yw/s72-c/LanAdmin.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6094800596146935474.post-2447350990481668628</id><published>2009-08-08T10:00:00.001-07:00</published><updated>2009-08-08T10:00:20.092-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='contracting'/><category scheme='http://www.blogger.com/atom/ns#' term='down time'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>Downtime Pursuits</title><content type='html'>&lt;p&gt;In IT there can be some times when a developer doesn’t have much to do. For a consultant, this is often during the ramp-up time for a project, when the project is first starting, or during the cool down phase, when the project has been elevated to production, and it’s mostly production bug fixes for a while. When I’ve been an in-house developer, this has usually been times between projects.&lt;/p&gt;  &lt;p&gt;I’m persuaded that the wise use of this time can make a huge difference for one’s own career progress and the good of the department and corporation as a whole. Unfortunately, there’s often a dearth of good ideas on what to do during this time, and seemingly irrational pushback if someone tries to do something which does not originate in the mind of a business sponsor who is an upper level manager. I think that the pushback comes at least partially from an unarticulated question, “Where we will charge the hours for this idea?” And I think that otherwise pushback comes from the unarticulated question, “Who will get credit for this?” And finally, I think that pushback comes from managers and supervisors who seem to think, “I don’t have time to supervise this or the political capital to get this done.”&lt;/p&gt;  &lt;p&gt;Here are the five basic uses to which this time can be put:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Process improvements &lt;/li&gt;    &lt;li&gt;Project or departmental infrastructure projects &lt;/li&gt;    &lt;li&gt;Documentation &lt;/li&gt;    &lt;li&gt;Personal R &amp;amp; D time &lt;/li&gt;    &lt;li&gt;Peer training and assistance. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In short, these are the five things for which there are common complaints that there is no time for these things to be done when a project is actually underway, and managers, project managers and team leads are worried about making a due date and adhering to a project timeline. The truth is that these kinds of activities can actually reduce project timelines if they are chosen wisely. They come under ‘working ahead’ and ‘working smart' activities, rather than frenetic ‘I’m working as hard as I can’ activities. And if anyone is worried about charging time for these activities, someone needs to make sure that there is simply a bucket to charge these activities. &lt;/p&gt;  &lt;p&gt;The key is that unlike a project for a high level business sponsor, these activities can be: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Low priority: Production issues or business projects take priority over completion of these projects.&lt;/li&gt;    &lt;li&gt;IT centered: Directed to the greater efficiency of IT (developers, testers, business analysts, system administrators).&lt;/li&gt;    &lt;li&gt;Automate minor manual business processes (1-2 users) such as repetitive data entry, credit inquiries or faxes of incoming information. &lt;/li&gt;    &lt;li&gt;Left temporarily incomplete to be taken up by others to complete when time and availability changes.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here are some ideas that I have for these kinds of activities.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Developing Visual Studio template projects for the kinds of projects which are anticipated in the near future. &lt;/li&gt;    &lt;li&gt;Implementing Sharepoint sites with MOSS 2007 or WSS 3.0 for development teams or projects.&lt;/li&gt;    &lt;li&gt;Developing code generation utilities for future projects. &lt;/li&gt;    &lt;li&gt;Developing an automated build system with CruiseControl.NET.&lt;/li&gt;    &lt;li&gt;Developing other departmental or IT utilities.&lt;/li&gt;    &lt;li&gt;Developing Visual Studio add-ins or Guidance Automation recipes for future projects. &lt;/li&gt;    &lt;li&gt;Documenting existing systems.&lt;/li&gt;    &lt;li&gt;Updating existing documentation for existing systems (lots of existing documentation contains omissions and errors, and degrades over time).&lt;/li&gt;    &lt;li&gt;Serving as a scribe to take meeting minutes to make sure that decisions and action items are clearly documented (lots of meetings end with no one agreeing on what was actually decided and who would implement the decisions).&lt;/li&gt;    &lt;li&gt;Internal cross training.&lt;/li&gt;    &lt;li&gt;Performance monitoring existing systems (lots of existing production systems, particularly those with a&amp;#160; mid to small number of users, never receive any monitoring once in production).&lt;/li&gt;    &lt;li&gt;Looking through event logs for avoidable and fixable errors (lots of fixable problems never are found and fixed even if sufficient information is logged).&lt;/li&gt;    &lt;li&gt;Cleaning up bloated error logs and event logs.&lt;/li&gt;    &lt;li&gt;Evaluating and upgrading existing error logging functionality. &lt;/li&gt;    &lt;li&gt;Reviewing existing code for possible improvements.&lt;/li&gt;    &lt;li&gt;Reviewing existing databases for possible improvements (lots of existing databases are never evaluated after being put into production).&lt;/li&gt;    &lt;li&gt;Review of existing systems and databases for security bugs and user access (lots of existing systems and databases retain access rights for transferred or terminated employees or too high access levels for non-administrators). &lt;/li&gt;    &lt;li&gt;Developing archiving solutions for existing databases (lots of existing databases never archive outmoded or obsolete information).&lt;/li&gt;    &lt;li&gt;Developing ETL solutions for existing databases.&lt;/li&gt;    &lt;li&gt;Developing automated unit tests for existing code modules (lots of existing code modules never get regression unit tests developed for them, and may break when enhancements are added).&lt;/li&gt;    &lt;li&gt;Cleaning up source control projects and archiving outmoded code and projects.&lt;/li&gt;    &lt;li&gt;Preparing and delivering peer training presentations, such as for a Lunch ‘n Learn or departmental meetings.&lt;/li&gt;    &lt;li&gt;Conducting research on new technologies which could prove useful.&lt;/li&gt;    &lt;li&gt;Developing prototypes for new technologies which could prove useful.&lt;/li&gt;    &lt;li&gt;Automation of minor business processes with VSTO, VSTA and Microsoft Office.&lt;/li&gt;    &lt;li&gt;Development of a process improvement suggestion site.&lt;/li&gt;    &lt;li&gt;Development of a departmental wiki.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In short, the tunnel vision that sees any useful activity as having to be initiated by a person who is an IT or business unit manager can miss out on many possible improvements which can be pursued in the time when developers are not dedicated either to production support fixes or major projects. And yet these minor improvements add up over time and add to the bottom line value and efficiency of an IT organization and the corporation as a whole.&lt;/p&gt;  &lt;p&gt;Here are some ideas to help this take place in a department or IT organization.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Encourage and reward the initiative and courage it takes to envision and suggest process improvements and to make wise use of down time.&lt;/li&gt;    &lt;li&gt;Serve as an ‘angel’s advocate’ for new ideas and process improvements rather than as a cynical devil’s advocate who commits infanticide on the ideas of others. &lt;/li&gt;    &lt;li&gt;Allow developers to get close enough to end users to develop the kind of trust to where end users can share their process improvement ideas.&lt;/li&gt;    &lt;li&gt;Allow developers to see end users at work enough to where they can spot opportunities for process improvements.&lt;/li&gt;    &lt;li&gt;Allow developers to explore new technologies early enough to find possible implementations.&lt;/li&gt;    &lt;li&gt;Make sure that ‘idea theft’ is not rewarded either in the short term or long term.&lt;/li&gt; &lt;/ul&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:09e9e5a7-7c08-49a0-ae81-443c80a37a66" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/IT+Management" rel="tag"&gt;IT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/team+development" rel="tag"&gt;team development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/consulting" rel="tag"&gt;consulting&lt;/a&gt;,&lt;a href="http://technorati.com/tags/contracting" rel="tag"&gt;contracting&lt;/a&gt;,&lt;a href="http://technorati.com/tags/projects" rel="tag"&gt;projects&lt;/a&gt;,&lt;a href="http://technorati.com/tags/down+time" rel="tag"&gt;down time&lt;/a&gt;,&lt;a href="http://technorati.com/tags/process+improvement" rel="tag"&gt;process improvement&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IT+infrastructure+projects" rel="tag"&gt;IT infrastructure projects&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-2447350990481668628?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/2447350990481668628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/08/downtime-pursuits.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/2447350990481668628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/2447350990481668628'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/08/downtime-pursuits.html' title='Downtime Pursuits'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-3081190349780430951</id><published>2009-08-06T14:41:00.001-07:00</published><updated>2009-08-20T13:08:57.814-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Novell'/><category scheme='http://www.blogger.com/atom/ns#' term='Blast from the Past'/><category scheme='http://www.blogger.com/atom/ns#' term='MS Access 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='NLIST'/><category scheme='http://www.blogger.com/atom/ns#' term='Access Basic'/><title type='text'>Blast from the Past: Automating Processes with Access Basic Code</title><content type='html'>&lt;p&gt;A long time, in a galaxy far, far away, I developed and maintained an Access database of Novell servers for the KeyCorp Help Desk. I developed the following code Microsoft Access Basic to take care of the chore of updating the LAN database when a new Novell server came onto the corporate Wide Area Network (WAN). Another example of the way we used to do things! Note the date in the header!&lt;/p&gt; &lt;code&gt;   &lt;p&gt;Sub Updatewanservers ()&lt;/p&gt;    &lt;p&gt;'***********************************************************************&lt;/p&gt;    &lt;p&gt;' Author: Dale Hawthorne&lt;/p&gt;    &lt;p&gt;' Date: September 3, 1996&lt;/p&gt;    &lt;p&gt;'***********************************************************************&lt;/p&gt;    &lt;p&gt;' Purpose: to run the batch file for the NLIST command, read the resulting&lt;/p&gt;    &lt;p&gt;' text file into a temporary table, and then perform a comparison query&lt;/p&gt;    &lt;p&gt;' with the LAN table that will identify the new servers for research and&lt;/p&gt;    &lt;p&gt;' additional input&lt;/p&gt;    &lt;p&gt;'************************************************************************&lt;/p&gt;    &lt;p&gt;Dim strShellCommand As String&lt;/p&gt;    &lt;p&gt;Dim varVerification As Variant&lt;/p&gt;    &lt;p&gt;Dim intFileNum As Integer&lt;/p&gt;    &lt;p&gt;Dim strInputChar As String&lt;/p&gt;    &lt;p&gt;Dim i As Integer&lt;/p&gt;    &lt;p&gt;Dim strNLine As String&lt;/p&gt;    &lt;p&gt;Dim strServer As String * 25&lt;/p&gt;    &lt;p&gt;Dim strOutputChar As String&lt;/p&gt;    &lt;p&gt;Dim strStatusBar As String&lt;/p&gt;    &lt;p&gt;Dim strSQLStatement As String&lt;/p&gt;    &lt;p&gt;Dim strTitleText As String&lt;/p&gt;    &lt;p&gt;Dim strMessageText As String&lt;/p&gt;    &lt;p&gt;Dim dbCurrent As Database&lt;/p&gt;    &lt;p&gt;Dim qryUpdateLANTable As QueryDef&lt;/p&gt;    &lt;p&gt;Dim rstUpdateSet As Recordset&lt;/p&gt;    &lt;p&gt;'Opening initialization of variables&lt;/p&gt;    &lt;p&gt;On Error GoTo UpdateError&lt;/p&gt;    &lt;p&gt;strNLine = Chr$(13) &amp;amp; Chr$(10)&lt;/p&gt;    &lt;p&gt;Set dbCurrent = DBEngine.Workspaces(0).Databases(0)&lt;/p&gt;    &lt;p&gt;'This section checks for the existence of previous files prior to running&lt;/p&gt;    &lt;p&gt;'this routine&lt;/p&gt;    &lt;p&gt;Application.Echo False&lt;/p&gt;    &lt;p&gt;DoCmd Hourglass True&lt;/p&gt;    &lt;p&gt;DoCmd SetWarnings False&lt;/p&gt;    &lt;p&gt;varVerification = Dir$(&amp;quot;C:\SERVER.BAT&amp;quot;)&lt;/p&gt;    &lt;p&gt;If varVerification &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then&lt;/p&gt;    &lt;p&gt;Kill &amp;quot;C:\SERVER.BAT&amp;quot;&lt;/p&gt;    &lt;p&gt;End If&lt;/p&gt;    &lt;p&gt;varVerification = Dir$(&amp;quot;C:\SERVERS.TXT&amp;quot;)&lt;/p&gt;    &lt;p&gt;If varVerification &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then&lt;/p&gt;    &lt;p&gt;Kill &amp;quot;C:\SERVERS.TXT&amp;quot;&lt;/p&gt;    &lt;p&gt;End If&lt;/p&gt;    &lt;p&gt;If IsTableQuery(&amp;quot;&amp;quot;, &amp;quot;tblTempServers&amp;quot;) Then&lt;/p&gt;    &lt;p&gt;strSQLStatement = &amp;quot;DROP TABLE [tblTempServers];&amp;quot;&lt;/p&gt;    &lt;p&gt;dbCurrent.Execute (strSQLStatement)&lt;/p&gt;    &lt;p&gt;End If&lt;/p&gt;    &lt;p&gt;'This command toggles the flags on the New field&lt;/p&gt;    &lt;p&gt;strStatusBar = &amp;quot;Now preparing LAN Table for input . . .&amp;quot;&lt;/p&gt;    &lt;p&gt;varVerification = SysCmd(SYSCMD_SETSTATUS, strStatusBar)&lt;/p&gt;    &lt;p&gt;strSQLStatement = &amp;quot;UPDATE DISTINCTROW LAN SET LAN.New = &amp;quot;&amp;quot;No&amp;quot;&amp;quot;;&amp;quot;&lt;/p&gt;    &lt;p&gt;dbCurrent.Execute (strSQLStatement)&lt;/p&gt;    &lt;p&gt;'This section creates a text file from the NLIST command&lt;/p&gt;    &lt;p&gt;strShellCommand = &amp;quot;@ECHO OFF&amp;quot; &amp;amp; strNLine &amp;amp; &amp;quot;NLIST server /a/b &amp;gt; c:\servers.txt&amp;quot;&lt;/p&gt;    &lt;p&gt;intFileNum = FreeFile&lt;/p&gt;    &lt;p&gt;Open &amp;quot;C:\SERVER.BAT&amp;quot; For Binary As intFileNum&lt;/p&gt;    &lt;p&gt;For i = 1 To Len(strShellCommand)&lt;/p&gt;    &lt;p&gt;strInputChar = Mid(strShellCommand, i, 1)&lt;/p&gt;    &lt;p&gt;Put intFileNum, , strInputChar&lt;/p&gt;    &lt;p&gt;Next&lt;/p&gt;    &lt;p&gt;Close intFileNum&lt;/p&gt;    &lt;p&gt;varVerification = SysCmd(SYSCMD_CLEARSTATUS, &amp;quot; &amp;quot;)&lt;/p&gt;    &lt;p&gt;'This warns the user of the batch file about to run&lt;/p&gt;    &lt;p&gt;strMessageText = &amp;quot;A batch file will now run to list all active servers.&amp;quot;&lt;/p&gt;    &lt;p&gt;strMessageText = strMessageText &amp;amp; strNLine &amp;amp; &amp;quot;The screen will be black &amp;quot;&lt;/p&gt;    &lt;p&gt;strMessageText = strMessageText &amp;amp; &amp;quot;for several minutes while this happens.&amp;quot;&lt;/p&gt;    &lt;p&gt;strTitleText = &amp;quot;Warning!&amp;quot;&lt;/p&gt;    &lt;p&gt;MsgBox strMessageText, , strTitleText&lt;/p&gt;    &lt;p&gt;'This runs the batch file&lt;/p&gt;    &lt;p&gt;varVerification = Shell(&amp;quot;C:\SERVER.BAT&amp;quot;)&lt;/p&gt;    &lt;p&gt;'now this waits until the batch file has ceased execution&lt;/p&gt;    &lt;p&gt;If varVerification &amp;gt;= 32 Then&lt;/p&gt;    &lt;p&gt;Do While GetModuleUsage(varVerification)&lt;/p&gt;    &lt;p&gt;DoEvents&lt;/p&gt;    &lt;p&gt;Loop&lt;/p&gt;    &lt;p&gt;End If&lt;/p&gt;    &lt;p&gt;' This section opens the text file for input into an Access Table&lt;/p&gt;    &lt;p&gt;varVerification = SysCmd(SYSCMD_CLEARSTATUS, &amp;quot;Now retrieving values into Access .. &amp;quot;)&lt;/p&gt;    &lt;p&gt;varVerification = SysCmd(SYSCMD_REMOVEMETER)&lt;/p&gt;    &lt;p&gt;strSQLStatement = &amp;quot;CREATE TABLE [tblTempServers] ([Server] TEXT);&amp;quot;&lt;/p&gt;    &lt;p&gt;dbCurrent.Execute (strSQLStatement)&lt;/p&gt;    &lt;p&gt;intFileNum = FreeFile&lt;/p&gt;    &lt;p&gt;Open &amp;quot;C:\SERVERS.TXT&amp;quot; For Binary As intFileNum&lt;/p&gt;    &lt;p&gt;Seek intFileNum, 425&lt;/p&gt;    &lt;p&gt;Do Until EOF(intFileNum)&lt;/p&gt;    &lt;p&gt;strInputChar = &amp;quot; &amp;quot;&lt;/p&gt;    &lt;p&gt;Do Until strInputChar = Chr(10)&lt;/p&gt;    &lt;p&gt;Get intFileNum, , strInputChar&lt;/p&gt;    &lt;p&gt;Loop&lt;/p&gt;    &lt;p&gt;Get intFileNum, Seek(intFileNum) + 1, strServer&lt;/p&gt;    &lt;p&gt;strServer = Trim(strServer)&lt;/p&gt;    &lt;p&gt;If InStr(1, strServer, &amp;quot;A total&amp;quot;) = 0 Then&lt;/p&gt;    &lt;p&gt;strSQLStatement = &amp;quot;INSERT INTO tblTempServers ([Server])&amp;quot; &amp;amp; strNLine&lt;/p&gt;    &lt;p&gt;strSQLStatement = strSQLStatement &amp;amp; &amp;quot;VALUES (&amp;quot;&amp;quot;&amp;quot; &amp;amp; strServer &amp;amp; &amp;quot;&amp;quot;&amp;quot;);&amp;quot;&lt;/p&gt;    &lt;p&gt;dbCurrent.Execute (strSQLStatement)&lt;/p&gt;    &lt;p&gt;End If&lt;/p&gt;    &lt;p&gt;Loop&lt;/p&gt;    &lt;p&gt;Close intFileNum&lt;/p&gt;    &lt;p&gt;dbCurrent.Execute (&amp;quot;qryUpdateFromWan&amp;quot;)&lt;/p&gt;    &lt;p&gt;Kill &amp;quot;C:\SERVER.BAT,C:\SERVERS.TXT&amp;quot;&lt;/p&gt;    &lt;p&gt;strSQLStatement = &amp;quot;DROP TABLE [tblTempServers];&amp;quot;&lt;/p&gt;    &lt;p&gt;dbCurrent.Execute (strSQLStatement)&lt;/p&gt;    &lt;p&gt;Application.Echo True&lt;/p&gt;    &lt;p&gt;DoCmd Hourglass False&lt;/p&gt;    &lt;p&gt;DoCmd SetWarnings True&lt;/p&gt;    &lt;p&gt;Exit Sub&lt;/p&gt;    &lt;p&gt;UpdateError:&lt;/p&gt;    &lt;p&gt;If Err = 3075 Or 375 Then&lt;/p&gt;    &lt;p&gt;Resume Next&lt;/p&gt;    &lt;p&gt;Else&lt;/p&gt;    &lt;p&gt;MsgBox &amp;quot;Error&amp;quot; &amp;amp; Err &amp;amp; &amp;quot;: &amp;quot; &amp;amp; Error$&lt;/p&gt;    &lt;p&gt;Close intFileNum&lt;/p&gt;    &lt;p&gt;Application.Echo True&lt;/p&gt;    &lt;p&gt;DoCmd Hourglass False&lt;/p&gt;    &lt;p&gt;DoCmd SetWarnings True&lt;/p&gt;    &lt;p&gt;End If&lt;/p&gt;    &lt;p&gt;End Sub&lt;/p&gt; &lt;/code&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b6001321-94c2-4fd2-ba74-1d13e0de626e" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/MS+Access+2.0" rel="tag"&gt;MS Access 2.0&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Novell" rel="tag"&gt;Novell&lt;/a&gt;,&lt;a href="http://technorati.com/tags/NLIST" rel="tag"&gt;NLIST&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Access+Basic" rel="tag"&gt;Access Basic&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-3081190349780430951?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/3081190349780430951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/08/blast-from-past-automating-processes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/3081190349780430951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/3081190349780430951'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/08/blast-from-past-automating-processes.html' title='Blast from the Past: Automating Processes with Access Basic Code'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-4954065138819175870</id><published>2009-08-06T14:30:00.001-07:00</published><updated>2009-08-06T14:47:11.925-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Classic ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='Blast from the Past'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server Stored Procedures'/><category scheme='http://www.blogger.com/atom/ns#' term='ADO'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Blast from the Past: Disconnected ADO Recordset in C++</title><content type='html'>&lt;p&gt;I found this code today also. It’s done in Visual C++ 6.0, Active Template Library/COM, and it returns a disconnected ADO recordset for use in an ASP page. It shows the way things used to be done for developers that worked with web pages but didn’t like Visual Basic 6.0.&lt;/p&gt; &lt;code&gt;   &lt;p&gt;STDMETHODIMP CRequestSecurity::GetRequestSecurity(long ReqID, IDispatch ** rsetptr)&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;HRESULT hr = S_OK;&lt;/p&gt;    &lt;p&gt;VARIANT var;&lt;/p&gt;    &lt;p&gt;try{&lt;/p&gt;    &lt;p&gt;_CommandPtr spCmd(__uuidof(Command));&lt;/p&gt;    &lt;p&gt;_RecordsetPtr rs(__uuidof(Recordset));&lt;/p&gt;    &lt;p&gt;spConn.CreateInstance(__uuidof(Connection));&lt;/p&gt;    &lt;p&gt;hr = spConn-&amp;gt;Open(connstr, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, adConnectUnspecified);&lt;/p&gt;    &lt;p&gt;if(FAILED(hr))&lt;/p&gt;    &lt;p&gt;_com_issue_error(hr);&lt;/p&gt;    &lt;p&gt;spCmd-&amp;gt;ActiveConnection = spConn;&lt;/p&gt;    &lt;p&gt;spCmd-&amp;gt;CommandText = &amp;quot;get_req_security&amp;quot;;&lt;/p&gt;    &lt;p&gt;spCmd-&amp;gt;CommandType = adCmdStoredProc;&lt;/p&gt;    &lt;p&gt;_ParameterPtr reqidprm = spCmd-&amp;gt;CreateParameter(_bstr_t(&amp;quot;req_id&amp;quot;), adInteger, adParamInput, vtMissing, _variant_t(ReqID));&lt;/p&gt;    &lt;p&gt;spCmd-&amp;gt;Parameters-&amp;gt;Append(reqidprm);&lt;/p&gt;    &lt;p&gt;rs-&amp;gt;CursorLocation = adUseClient;&lt;/p&gt;    &lt;p&gt;rs-&amp;gt;Open(spCmd.GetInterfacePtr(), vtMissing, adOpenForwardOnly, adLockBatchOptimistic, -1);&lt;/p&gt;    &lt;p&gt;if(rs-&amp;gt;State == adStateOpen &amp;amp;&amp;amp; rs-&amp;gt;adoEOF == VARIANT_FALSE)&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;VariantInit(&amp;amp;var);&lt;/p&gt;    &lt;p&gt;var.vt = VT_DISPATCH;&lt;/p&gt;    &lt;p&gt;var.pdispVal = NULL;&lt;/p&gt;    &lt;p&gt;rs-&amp;gt;PutActiveConnection(var);&lt;/p&gt;    &lt;p&gt;spConn-&amp;gt;Close();&lt;/p&gt;    &lt;p&gt;VariantClear(&amp;amp;var);&lt;/p&gt;    &lt;p&gt;hr = rs-&amp;gt;QueryInterface(IID_IDispatch, reinterpret_cast&amp;lt;void**&amp;gt;(rsetptr));&lt;/p&gt;    &lt;p&gt;if(FAILED(hr))&lt;/p&gt;    &lt;p&gt;_com_issue_error(hr);&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;else&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;hr = rs-&amp;gt;Close();&lt;/p&gt;    &lt;p&gt;if(FAILED(hr))&lt;/p&gt;    &lt;p&gt;_com_issue_error(hr);&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;catch(_com_error &amp;amp;e)&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;hr = e.Error();&lt;/p&gt;    &lt;p&gt;Error(e.ErrorMessage(), GUID_NULL, hr);&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;catch(...)&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;hr = E_FAIL;&lt;/p&gt;    &lt;p&gt;Error(L&amp;quot;An unspecified error occured.&amp;quot;, GUID_NULL, hr);&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;return hr;&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt; &lt;/code&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9fb2cf4c-0f84-45ab-8614-e9af6cd7b684" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/C%2b%2b" rel="tag"&gt;C++&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ADO" rel="tag"&gt;ADO&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Classic+ASP" rel="tag"&gt;Classic ASP&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MS+SQL+Server+Stored+Procedures" rel="tag"&gt;MS SQL Server Stored Procedures&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-4954065138819175870?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/4954065138819175870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/08/blast-from-past-disconnected-ado.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/4954065138819175870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/4954065138819175870'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/08/blast-from-past-disconnected-ado.html' title='Blast from the Past: Disconnected ADO Recordset in C++'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-8322379636907896547</id><published>2009-08-06T14:22:00.001-07:00</published><updated>2009-08-06T14:46:13.147-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blast from the Past'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows API'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='C++ .NET'/><title type='text'>Blast from the Past: Shutdown Utility</title><content type='html'>&lt;p&gt;Today I came across some code which I had done a few years ago in Visual C++ .NET 2002 (pre-CLI). It calls the Windows API to shut down the current workstation, and it can also be used to shut down a remote workstation where the access rights exist. The .NET API does not have this capability right now. This code was part of an automated test system which needed to be able to shut down the remote workstation if there were problems with the automated test proceeding. The remote workstations were Windows 95 PCs on which .NET 1.0 ran fairly easily. If anyone needed this functionality today, this code could probably be updated to C++ CLI standards fairly easily. But, young Jedi, be sure that this power is used for good and not for evil!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Header file – the contents of SystemUtil.h:&lt;/strong&gt;&lt;/p&gt; &lt;code&gt;   &lt;p&gt;#using &amp;lt;mscorlib.dll&amp;gt;&lt;/p&gt;    &lt;p&gt;#define _WIN32_WINNT 0x0500&lt;/p&gt;    &lt;p&gt;#include &amp;lt;windows.h&amp;gt;&lt;/p&gt;    &lt;p&gt;#include &amp;lt;winuser.h&amp;gt;&lt;/p&gt;    &lt;p&gt;#pragma once&lt;/p&gt;    &lt;p&gt;using namespace System;&lt;/p&gt;    &lt;p&gt;using namespace System::Runtime::InteropServices;&lt;/p&gt;    &lt;p&gt;#pragma warning(disable : 4101)&lt;/p&gt;    &lt;p&gt;namespace SystemUtil&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;public __gc class CSystemShutdown&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;public:&lt;/p&gt;    &lt;p&gt;bool RemoteShutdown(String * WorkstationName, String * EventLogMessage);&lt;/p&gt;    &lt;p&gt;bool LocalShutdown(void);&lt;/p&gt;    &lt;p&gt;};&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt; &lt;/code&gt;  &lt;p&gt;&lt;strong&gt;SystemUtil.cpp:&lt;/strong&gt;&lt;/p&gt; &lt;code&gt;   &lt;p&gt;bool SystemUtil::CSystemShutdown::RemoteShutdown(String * WorkstationName, String * EventLogMessage)&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;bool rv = false;&lt;/p&gt;    &lt;p&gt;DWORD error_code = ERROR_SUCCESS;&lt;/p&gt;    &lt;p&gt;HANDLE hToken;&lt;/p&gt;    &lt;p&gt;TOKEN_PRIVILEGES tkp;&lt;/p&gt;    &lt;p&gt;String * error_string = S&amp;quot;Windows Error #&amp;quot;;&lt;/p&gt;    &lt;p&gt;if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &amp;amp;hToken))&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;error_code = GetLastError();&lt;/p&gt;    &lt;p&gt;throw new Exception(error_string-&amp;gt;Concat(error_code.ToString()));&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;else&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;::LookupPrivilegeValue((LPCTSTR)Marshal::StringToCoTaskMemAnsi(WorkstationName).ToPointer(), SE_REMOTE_SHUTDOWN_NAME, &amp;amp;tkp.Privileges[0].Luid);&lt;/p&gt;    &lt;p&gt;tkp.PrivilegeCount = 1 ;&lt;/p&gt;    &lt;p&gt;tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;&lt;/p&gt;    &lt;p&gt;if((::AdjustTokenPrivileges(hToken, FALSE, &amp;amp;tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0) &amp;amp;&amp;amp; (error_code = ::GetLastError()) == ERROR_SUCCESS))&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;if(!InitiateSystemShutdownEx((LPTSTR)Marshal::StringToCoTaskMemAnsi(WorkstationName).ToPointer(),&lt;/p&gt;    &lt;p&gt;(LPTSTR)Marshal::StringToCoTaskMemAnsi(EventLogMessage).ToPointer(),&lt;/p&gt;    &lt;p&gt;0,&lt;/p&gt;    &lt;p&gt;TRUE, &lt;/p&gt;    &lt;p&gt;TRUE, &lt;/p&gt;    &lt;p&gt;SHTDN_REASON_MAJOR_SOFTWARE)) &lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;error_string-&amp;gt;Concat(error_code.ToString());&lt;/p&gt;    &lt;p&gt;if(error_code == ERROR_ACCESS_DENIED)&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;error_string-&amp;gt;Concat(S&amp;quot; Administrative rights are not in effect for remote rebooting of this workstation.&amp;quot;);&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;throw new Exception(error_string);&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;else&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;throw new Exception(error_string-&amp;gt;Concat(error_code.ToString()));&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;return rv;&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;bool SystemUtil::CSystemShutdown::LocalShutdown(void)&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;bool rv = false;&lt;/p&gt;    &lt;p&gt;HANDLE hToken;&lt;/p&gt;    &lt;p&gt;TOKEN_PRIVILEGES tkp;&lt;/p&gt;    &lt;p&gt;DWORD error_code = ERROR_SUCCESS;&lt;/p&gt;    &lt;p&gt;String * error_string = S&amp;quot;Windows Error #&amp;quot;;&lt;/p&gt;    &lt;p&gt;if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &amp;amp;hToken))&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;error_code = GetLastError();&lt;/p&gt;    &lt;p&gt;throw new Exception(error_string-&amp;gt;Concat(error_code.ToString()));&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;else&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &amp;amp;tkp.Privileges[0].Luid);&lt;/p&gt;    &lt;p&gt;tkp.PrivilegeCount = 1 ;&lt;/p&gt;    &lt;p&gt;tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;&lt;/p&gt;    &lt;p&gt;::AdjustTokenPrivileges(hToken, FALSE, &amp;amp;tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);&lt;/p&gt;    &lt;p&gt;if((error_code = ::GetLastError()) == ERROR_SUCCESS) &lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;if(!ExitWindowsEx(EWX_REBOOT | EWX_FORCEIFHUNG, 0)) &lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;error_code = GetLastError();&lt;/p&gt;    &lt;p&gt;error_string-&amp;gt;Concat(error_code.ToString());&lt;/p&gt;    &lt;p&gt;if(error_code == ERROR_ACCESS_DENIED)&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;error_string-&amp;gt;Concat(S&amp;quot; Administrative rights are not in effect for rebooting of this workstation.&amp;quot;);&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;throw new Exception(error_string);&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;else&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;throw new Exception(error_string-&amp;gt;Concat(error_code.ToString()));&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt;    &lt;p&gt;return rv;&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt; &lt;/code&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ccf225d1-8810-465c-847a-e95ef43d21f9" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/C%2b%2b" rel="tag"&gt;C++&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%2b%2b+.NET" rel="tag"&gt;C++ .NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%2b%2b+CLI" rel="tag"&gt;C++ CLI&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+API" rel="tag"&gt;Windows API&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-8322379636907896547?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/8322379636907896547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/08/blast-from-past-shutdown-utility.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/8322379636907896547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/8322379636907896547'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/08/blast-from-past-shutdown-utility.html' title='Blast from the Past: Shutdown Utility'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-8266907840095894335</id><published>2009-07-21T10:38:00.001-07:00</published><updated>2009-07-21T10:38:11.662-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile Development'/><title type='text'>Death Marches and Lost Patrols</title><content type='html'>&lt;p&gt;Recently, while moving around some boxes of books, I came across my copy of Ed Yourdon’s &lt;u&gt;Death March&lt;/u&gt;. This morning I read it through again, to see if there were any lessons and comparisons I could make with it since the last time that I read it four years ago.&lt;/p&gt;  &lt;p&gt;I’ve been on three projects over the years that could have been legitimately called, ‘Death Marches.’ My supervisor called one as such, another turned into one because of false expectations and schedule pressure, and the last one had Death March features although I asked for and received assurances that it was not going to be a Death March. The human cost and constant failure of these projects forever soured me on these kinds of projects.&lt;/p&gt;  &lt;p&gt;With the recent adoption of Agile methodologies and even more use of the Agile buzzword for a spiral project lifecycle, more projects seem to be turning into ‘Lost Patrols’ rather than Death Marches. The metaphor of the ‘Lost Patrol’ comes from the &lt;u&gt;Death March&lt;/u&gt; book as well. Death Marches usually have a goal and and a defined endpoint, in the delivery of a definite set of required functionality and features. Lost Patrols start out with a definite goal but end up getting lost in the forest.&lt;/p&gt;  &lt;p&gt;This loss of the definite endpoint is a known problem with the spiral project lifecycle methodology. It can hit Agile when the project requirements and endpoints are left so undefined that the project team becomes lost. Activity may continue, but productivity does not. One of the perverse things that can happen with an Agile project is that the business owners and stakeholders get addicted to generating requirements. It becomes more interesting to them to keep on putting together list of requirements than to see a finished product.&lt;/p&gt;  &lt;p&gt;As usual, the solution probably is to stop the project, get some bearings, and restart when project requirements and endpoints are more stable. This may require getting the business stakeholders to agree on what should be delivered when and when the product will go out of new development into maintenance and enhancement mode.&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:0767317B-992E-4b12-91E0-4F059A8CECA8:79f23215-f194-4cc0-a33d-25357b7d8427" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Death+March" rel="tag"&gt;Death March&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Projects" rel="tag"&gt;Projects&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Project+Management" rel="tag"&gt;Project Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Agile+Development" rel="tag"&gt;Agile Development&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-8266907840095894335?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/8266907840095894335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/07/death-marches-and-lost-patrols.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/8266907840095894335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/8266907840095894335'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/07/death-marches-and-lost-patrols.html' title='Death Marches and Lost Patrols'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-1809873801932959257</id><published>2009-06-25T14:57:00.001-07:00</published><updated>2009-06-27T05:30:12.428-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='contracting'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>Part II: How to Make a Consulting Gig Mutually Effective and Rewarding</title><content type='html'>&lt;p&gt;Most of what I put down in my previous post, &lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/05/how-to-make-consulting-gig-mutually.html"&gt;Part I: How to Make a Consulting Gig Mutually Effective and Rewarding&lt;/a&gt;, had to do with defining the assignment and preparing for the new consultant. Here are some more suggestions that I have to make.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Make Sure That All Prospective Interviewers Are Prepared.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Interviewers need to have a current copy of the consultant’s resume. When I’m interviewed about a prospective assignment, I usually have additional copies with my business card and contact information. It’s best to give any prospective interviewers a copy of the resume far enough in advance to go over and assess the fit of the consultant to the assignment. &lt;/li&gt;    &lt;li&gt;Interviewers need to have a current job description for the assignment. The assignment is usually important enough and costly enough to write down a list of what is relevant to the assignment. &lt;/li&gt;    &lt;li&gt;Interviewers need to know what skills and experience are relevant to the assignment. This simply comes down to what parts of the job description are the most important. Sometimes job descriptions contain ‘nice to have’ skills and experience as requirements, and requirements as ‘nice to have’. &lt;/li&gt;    &lt;li&gt;Interviewers need to pursue the technical screening as determining whether the consultant has the required skills and experience but also the capabilities to do the job. This technical screening is not technical oneupmanship, or looking for a weak area on the resume, but assessing the fit to the assignment. They need to look at the intangibles as well, especially where the team will be working with new technology. They need to assess whether the consultant will work to find answers, solve problems and do what it takes to make the project succeed.&lt;/li&gt;    &lt;li&gt;Interviewers need to allow for time for the consultant to ask questions and find out about the job to see whether it’s a fit from his or her perspective.&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Make Sure That the Team Is Prepared to Integrate with the New Consultant.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Clearly communicate that you, as a manager, expect that they will give the new consultant or contractor full professional cooperation. Sometimes experienced and highly qualified consultants may be threatening to less experienced members of the department or organization. Be on the lookout for &lt;em&gt;defensive denigration&lt;/em&gt; (disparagement of the consultant’s credentials, capabilities and experience – which may count in some cases as slander or libel according to the legal definitions), &lt;em&gt;misdirection&lt;/em&gt; (deliberately providing false or misleading information and direction), and &lt;em&gt;stonewalling&lt;/em&gt; (refusal to provide necessary information and assistance to get the job done) in these cases. Understand that this kind of behavior can sink a project and undermines your ability as a manager to bring in the people that you need to get the job done. &lt;/li&gt;    &lt;li&gt;Make sure that you and others understand that ‘new’ in the case of a consultant does not mean entry level. Experienced consultants often need little more than current standards and guidelines, project requirements and other project documents, a development PC, and access to workstations, servers, etc. They do not need to have team members try to guide them through the basics of how to code, etc. For myself, I try to make sure that beyond the particulars of the corporate environment and project specifications, that I know all that’s needed to fulfill my responsibilities and more. &lt;/li&gt;    &lt;li&gt;Make time for communication with the consultant. As a consultant, I aim to be as ‘low maintenance’ as possible – but that does not mean ‘no maintenance’! Rather, I still need to touch base, and communicate progress, ask questions, make sure that I’m on the right track, etc. My aim in this is simply to make sure that I’m doing the right things and providing what is expected, and, preferably, more than is expected. It’s usually a good idea to have a weekly or biweekly one on one meeting with a consultant. Management by walking around and asking how things are going works well also. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Make Sure That the New Consultant Receives Realistic and Workable Expectations and Assessment.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Realistic and workable expectations and assessment means sufficient time to complete the assigned task. Experienced consultants can often do much in a short time, but each one of us does require time to produce whatever is being specified. For example, no matter how many years a person codes, no one writes perfect code the first time. What is checked into a source code repository first may not be the final submission but rather simply be to preserve initial attempts against possible loss. Moreover, the code that is produced still needs to be evaluated, unit tested and possibly refactored. The end result is what counts the most. For myself, I aim to produce well designed, documented, understandable and production ready code. I can usually produce this faster than less experienced programmers. But what comes out of the end of my fingers the first time won’t be perfect, although I aim for the end result to fulfill the requirements and functional as possible. &lt;/li&gt;    &lt;li&gt;Realistic and workable expectations means receiving tasks in accord with the skills and experience of the consultant. For instance, I can do a number of support tasks such as installations and defining security roles and users, but I’ve never worked as a network administrator. On the other hand, I’ve worked with some very good manual and functional testers, but I do not consider myself competent to do manual system and functional testing. In fact, my total time for manual system testing over 15+ years of IT experience comes down to maybe 8 hours total. (For more on this, see &lt;a href="http://www.joelonsoftware.com/articles/fog0000000067.html"&gt;Joel on Software: Top Five (Wrong) Reasons You Don't Have Testers&lt;/a&gt;.) It’s usually better to try to find someone who is experienced and trained in these tasks rather than try to throw a consultant experienced in other areas at these tasks. &lt;/li&gt;    &lt;li&gt;Realistic and workable expectations and assessment means a method for the consultant to report on his own work. Work out some kind of regular reporting mechanism. In previous assignments I put out a weekly report of my activities where the manager expected one. I’m thinking now that this is advisable in every case, to make sure that the manager gets an accurate understanding of the productivity of the consultant. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4bdc15e1-9a86-42e9-84ee-349e4dd0e12d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Consulting" rel="tag"&gt;Consulting&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Contracting" rel="tag"&gt;Contracting&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IT+Management" rel="tag"&gt;IT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/team+development" rel="tag"&gt;team development&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-1809873801932959257?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/1809873801932959257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/part-ii-how-to-make-consulting-gig.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/1809873801932959257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/1809873801932959257'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/part-ii-how-to-make-consulting-gig.html' title='Part II: How to Make a Consulting Gig Mutually Effective and Rewarding'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-395733231801445782</id><published>2009-06-25T13:46:00.001-07:00</published><updated>2009-06-25T13:46:54.943-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Webparts'/><category scheme='http://www.blogger.com/atom/ns#' term='Virtual PC'/><title type='text'>Building the Sharepoint Development Virtual PC</title><content type='html'>&lt;p&gt;Over the past several days I’ve been building a virtual PC on my personal laptop for Sharepoint development. I had to do this because I forgot the passwords to the virtual PC which I used last summer to work through a BizTalk evaluation and some SQL Server Reporting Services exercises. I didn’t have the foresight to put together a virtual password reset disk. But the time in installation and configuration is well worth it. It brings a developer out of the code and back into working with the kinds of personal support tasks that makes one low maintenance.&lt;/p&gt;  &lt;p&gt;Here are the steps I took. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Started up Virtual PC 2007 and defined a new virtual PC with the settings for virtual RAM and virtual hard disk size. I wish now that I had increased the size of the original virtual hard disk, but I was able later to add on another virtual hard disk to the PC. I also made sure that I defined a virtual floppy disk for a password reset disk. &lt;/li&gt;    &lt;li&gt;Started up the virtual PC which I had just defined. I had the DVD for Windows Server 2008 in the DVD drive while I did this.&lt;/li&gt;    &lt;li&gt;Went through the installation of Windows Server 2008 standard edition.&lt;/li&gt;    &lt;li&gt;Defined the role as a Web server to install IIS (Internet Information Server). &lt;/li&gt;    &lt;li&gt;Installed an antivirus client. I’m also working through the evaluation of the Norton product for Windows Server 2008, and I found it pretty easy to install.&lt;/li&gt;    &lt;li&gt;Connected the Windows Server 2008 virtual PC to the internet, and turned on Windows update to pick up the latest updates.&lt;/li&gt;    &lt;li&gt;While the Internet connection was active, turned on Norton LiveUpdate to update the virus and spyware definitions.&lt;/li&gt;    &lt;li&gt;After the updates to the operating system and antivirus were complete, installed SQL Server 2008 standard edition. I also work with Integration Services (SSIS), Analysis Services (SSAS), and Reporting Services (SSRS), so I added those to the installation also. I checked BIDS but probably did not have to.&lt;/li&gt;    &lt;li&gt;Installed Sharepoint Services 3.0 with SP1.&lt;/li&gt;    &lt;li&gt;Installed the Sharepoint Services SDK. I don’t know if I needed to do this, but I did it anyway.&lt;/li&gt;    &lt;li&gt;Installed Visual Studio 2008. For an installation aimed at primarily Sharepoint development, I tried to leave out as much as possible, such as anything for mobile devices.&lt;/li&gt;    &lt;li&gt;Installed the MSDN documentation. I’ve already got the documentation on the laptop itself, but it can be a pain to switch away from the virtual PC to look up something on MSDN.&lt;/li&gt;    &lt;li&gt;Installed the Visual Studio extensions for Sharepoint.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are still four additional things that I want to do. There’s separate documentation for the Visual Studio extensions for Sharepoint, and I want to have that on the virtual PC, so there will still be another installation for that. I want to see how Norton’s product for Sharepoint security installs, so there’s still another installation to go through. And I want to explore using Silverlight with Sharepoint, so there’s still another installation of Silverlight and the Silverlight SDK. And finally, I plan to back all this up, so I don’t have to go through all this installation again if the virtual PC is corrupted.&lt;/p&gt;  &lt;p&gt;So, unless there’s someone in your organization who can make and maintain a master virtual PC image for Sharepoint development, plan to do a lot of installation if you want to do Sharepoint development. It takes a long time for these installations to complete, so find something to do with your time while you watch over the installations.&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3bd68133-499d-4afe-897b-83bf925bb4a5" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Sharepoint" rel="tag"&gt;Sharepoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Virtual+PC" rel="tag"&gt;Virtual PC&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+Server+2008" rel="tag"&gt;Windows Server 2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SQL+Server+2008" rel="tag"&gt;SQL Server 2008&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-395733231801445782?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/395733231801445782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/building-sharepoint-development-virtual.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/395733231801445782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/395733231801445782'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/building-sharepoint-development-virtual.html' title='Building the Sharepoint Development Virtual PC'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-6334386251793144154</id><published>2009-06-18T14:00:00.001-07:00</published><updated>2009-06-18T14:00:00.428-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='Dissonant Leadership'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='Emotional Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Resonant Leadership'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><title type='text'>Emotional Intelligence and Resonant Leadership in IT</title><content type='html'>&lt;p&gt;Recently I went through &lt;a href="http://www.amazon.com/Primal-Leadership-Learning-Emotional-Intelligence/dp/1591391849/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1245354838&amp;amp;sr=8-1"&gt;Primal Leadership: Learning to Lead with Emotional Intelligence&lt;/a&gt; by Daniel Goleman, Richard Boyatzis and Annie McKee, and right now I’m working through &lt;a href="http://www.amazon.com/Resonant-Leadership-Connecting-Mindfulness-Compassion/dp/1591395631/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1245354902&amp;amp;sr=1-1"&gt;Resonant Leadership&lt;/a&gt; by Richard Boyatzis and Annie McKee. In the fall of 1995 I went through the Managerial Assessment and Development course at the Weatherhead School of Management at Case Western Reserve University, and there is some material from that course mirrored in &lt;u&gt;Primal Leadership&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;In Primal Leadership, the authors distinguish between resonant leadership and dissonant leadership, and explain the following leadership styles:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Visionary (Resonant): Guiding people by and toward shared dreams. &lt;/li&gt;    &lt;li&gt;Coaching (Resonant): Connects a person to the organization by linking their strengths, weaknesses and personal goals to the long term goals of the organization. &lt;/li&gt;    &lt;li&gt;Affiliative (Resonant): Connects people through emotional ties and shared concern for each other. &lt;/li&gt;    &lt;li&gt;Democratic (Resonant): Connecting people to the organization by listening to them and involving them in the process of getting ideas, making decisions and setting direction. &lt;/li&gt;    &lt;li&gt;Pacesetting (Dissonant): The leader holds and exemplifies high performance standards, and demands the same from others. &lt;/li&gt;    &lt;li&gt;Commanding (Dissonant): The leader commands, often demanding immediate compliance without any explanations. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As I went through this book, my sense was that within IT, the last, the commanding style, was by far the most prevalent, although it’s marked as the least effective. In fact, the commanding style tends to management by threat and intimidation. This whole style tends to be extremely stressful and counterproductive in the long run. The other dissonant style, pacesetting, tends to micromanagement, and seems to be characteristic of managers and leaders who are technically adept, or imagine themselves to be technically adept. This style also tends to be stressful, and puts people into survival mode. Dissonant leadership tends to discourage, burn out, and drive away people and send them home with chronic stress. I believe that much turnover in IT comes down to dissonant leadership, and the overuse of the commanding style.&lt;/p&gt;  &lt;p&gt;Where do people learn the dissonant style? There’s a reason on page 155: “&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;&amp;#160; . . . people pick up their leadership habits rather haphazardly over the course of life through repeating what they see their models do, or through repeating their own attempts at leading.&amp;quot; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is probably why poor leaders often look like a common definition of insanity (&amp;quot;keep on doing the same thing while expecting different results&amp;quot;). People come to IT management and leadership often without any effective personal coaching in leadership and management – so they act out what they have experienced, seen or imagined to be effective leadership –and they fall into dissonant leadership. The dissonant styles also look a lot like the classic military model of leadership, although recently the U.S. military has been working toward incorporating much more of the resonant styles into their leadership model.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Here are some ideas for incorporating the more resonant styles in IT:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Visionary (Resonant): Guiding people by and toward shared dreams.&lt;/strong&gt;       &lt;p&gt;Relate whatever projects and tasks in the organization are being done to the overall purpose of the organization. Let those in the organization know that they are contributing to a positive vision. Don’t make this something done once in a long while, but fairly often. Do this without cliches or platitudes, but exemplify that you believe in the vision also.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Coaching (Resonant): Connects a person to the organization by linking their strengths, weaknesses and personal goals to the long term goals of the organization.&lt;/strong&gt;       &lt;p&gt;Get to know the people in the group as individuals in an in depth manner. Work with them to make best use of their strengths and to minimize their working in areas of their weaknesses. Learn where they want to go in their career and life, and provide as much support as you can.&lt;/p&gt;      &lt;p&gt;Do more management by walking around. Find out what people are doing, what is energizing them and what they see is causing them headaches and what their obstacles are. Help them to find and work out solutions. Help them to get training when it is possible; seek to make this a part of the budget.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Affiliative (Resonant): Connects people through emotional ties and shared concern for each other.&lt;/strong&gt;       &lt;p&gt;Give people occasions to connect with each other. Show concern when people are going through difficult personal times.&lt;/p&gt;      &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Democratic (Resonant): Connecting people to the organization by listening to them and involving them in the process of getting ideas, making decisions and setting direction.&lt;/strong&gt;       &lt;p&gt;Allow people to become part of the decision making process as much as possible. Discussing a decision with them, the pros and cons, as if it were their decision to make, may bring buy-in and commitment, even when they don't have the final say.&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Here are some ideas on when to use the dissonant styles:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Pacesetting (Dissonant): The leader holds and exemplifies high performance standards, and demands the same from others.&lt;/strong&gt;       &lt;p&gt;Use this style when the leader does have technical expertise and when working with an inexperienced team. Otherwise, let the experienced and knowledgeable work without micromanagement.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Commanding (Dissonant): The leader commands, often demanding immediate compliance without any explanations.&lt;/strong&gt;       &lt;p&gt;Use this style sparingly. Give clear directions, but most authoritatively during a crisis and an emergency. Do not make ‘fake’ emergencies to make people jump to get something done.&lt;/p&gt;      &lt;p&gt;In regard to any use of the commanding style, leaders would do well to remember the observation of Baron von Steuben when he was drilling American soldiers during the American Revolution. He said, “With European soldiers, I tell them what to do, and they do it. With American soldiers, I tell them what to do, and then I have to tell them why.”&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;ul&gt;&lt;/ul&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8f54679d-d1ab-4f98-899b-a2566a1631a1" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Emotional+Intelligence" rel="tag"&gt;Emotional Intelligence&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IT+management" rel="tag"&gt;IT management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/team+development" rel="tag"&gt;team development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/team+leadership" rel="tag"&gt;team leadership&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-6334386251793144154?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/6334386251793144154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/emotional-intelligence-and-resonant.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/6334386251793144154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/6334386251793144154'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/emotional-intelligence-and-resonant.html' title='Emotional Intelligence and Resonant Leadership in IT'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-258251858676637501</id><published>2009-06-18T12:45:00.001-07:00</published><updated>2009-06-18T12:45:20.621-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><title type='text'>Architectural Transitions, Transferences and Learning Curves</title><content type='html'>&lt;p&gt;Over the years I worked on a number of projects for a number of organizations where the Microsoft .NET framework was the chosen architectural platform, and the planned application would be primarily ASP.NET. In some of these the organizations, and the managers, developers, analysts and testers within them, were making a transition from a previous architectural platform to ASP.NET. There was a steep learning curve involved, and some individuals within those organizations acknowledged this. Others, however, were unaware of the steepness of this curve, and what elements of their previous experience did and what elements of their previous experience did not transfer to the new architecture. &lt;/p&gt;  &lt;p&gt;Here is the list of the transitions which I’ve seen and with which I’ve worked in the organizations.&lt;/p&gt;  &lt;h3&gt;Transition 1: Mainframe to ASP.NET&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;em&gt;Transition from a static character based user interface to a much more fluid user interface based in HTML, CSS and Javascript.&lt;/em&gt;&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;em&gt;&lt;strong&gt;Transition from single tier and single locus of execution, processing and data persistence to multiple tiers and multiple loci of execution, processing and data persistence.&lt;/strong&gt;&lt;/em&gt;&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;em&gt;Transition from single development language to multiple development languages. &lt;/em&gt;&lt;/strong&gt;&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;em&gt;Transition from procedural methods of development to object oriented development.&lt;/em&gt;&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;em&gt;Transition from little emphasis on usability and accessibility to a much greater emphasis on usability and accessibility.&lt;/em&gt;&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;em&gt;Transition from ID based security to security based in IDs, roles, secure coding practices and secure deployment architecture and configuration practices.&lt;/em&gt;&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;em&gt;Transition from waterfall project management methodology to more iterative project management methodology.&lt;/em&gt;&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Transition 2: Visual Basic 6 Client Server to ASP.NET &lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;&lt;strong&gt;Transition from a pixel based Windows user interface drawn in an IDE to a user interface rendered in HTML, CSS and Javascript that may need to display in multiple browsers in multiple operating systems.&lt;/strong&gt;&lt;/em&gt;&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;em&gt;Transition from two tiers and a single locus of execution and processing and two loci of data persistence to multiple tiers and multiple loci of execution, processing and data persistence.&lt;/em&gt;&lt;/strong&gt;&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;em&gt;Transition from access to local file system to almost exclusive use of back end databases for data persistence.&lt;/em&gt;&lt;/strong&gt;&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;em&gt;Transition from less object oriented development practices permitted by the language and environment to exclusively object oriented development practices enforced by the language and environment.&lt;/em&gt;&lt;/strong&gt;&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Transition 3: Java to ASP.NET&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;em&gt;Transition from open source utilities and development tools more to Microsoft developed utilities and development tools.&lt;/em&gt;&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;em&gt;Transition from a platform that they may have been taught to love to one from a company that they have been taught to despise (this is more of a cultural transition)&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;These transitions show why the adoption of new technology and transition in the development environment often leaves developers gasping and grasping. It involves more than learning a new language or a new tool. For many, it’s a need to learn an a whole new platform, architecture, and complexity. It’s no wonder that some find themselves overwhelmed when the decision is made for them that they will now be ASP.NET developers.&lt;/p&gt;  &lt;p&gt;   &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e15ef8a6-89ff-4175-9e0c-1f8d58b95669" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/team+development" rel="tag"&gt;team development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/architectural+transition" rel="tag"&gt;architectural transition&lt;/a&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/6094800596146935474-258251858676637501?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/258251858676637501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/architectural-transitions-transferences.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/258251858676637501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/258251858676637501'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/architectural-transitions-transferences.html' title='Architectural Transitions, Transferences and Learning Curves'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-2981873317475752383</id><published>2009-06-12T13:00:00.001-07:00</published><updated>2009-06-12T13:00:37.164-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Design'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><title type='text'>AntiPattern: Hackagile Development</title><content type='html'>&lt;p&gt;‘Speaking truth to power’ is a cliche that always seemed to me to smack of someone holding a conversation with a telephone pole. The comic strip Dilbert often does this in a very effective way:&lt;/p&gt; &lt;a title="Dilbert.com" href="http://dilbert.com/strips/comic/2007-11-26/"&gt;&lt;img alt="Dilbert.com" src="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/00000/1000/700/1791/1791.strip.gif" border="0" /&gt;&lt;/a&gt;   &lt;p&gt;I would suggest that this kind of coding should be termed ‘Hackagile,’ and that it be classified as a &lt;a href="http://en.wikipedia.org/wiki/Anti-pattern"&gt;development antipattern&lt;/a&gt;. What happens after the requirements are delivered in whatever form they take – CRC cards, user stories, page mockups, etc. – is that the development practice then becomes the antipattern that I call the ‘Path to Disaster.’ This antipattern is, as mentioned by Steve McConnell in &lt;a href="Manifesto for Agile Software Developmenthttp://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1244836224&amp;amp;sr=8-1"&gt;Code Complete&lt;/a&gt;, ‘Rush to Code; Code Like Hell; Code and Fix.’ Design, documentation, and often unit testing are thrown out so that more and more code can be churned out. The management team and lead developers may in fact call this kind of development process ‘Agile.’ But as far as the coding process itself, it’s more like what we used to call, ‘hacking’ – as in throwing together an application without any kind of design or development specifications. Most of the organizations that I know that do this don’t foster a development culture anything like the &lt;a href="http://agilemanifesto.org/principles.html"&gt;Agile Manifesto&lt;/a&gt; specifies. &lt;/p&gt;  &lt;p&gt;‘Hackagile’ can happen when an organization which has done primarily maintenance and enhancement programming goes into new application development. It seems attractive, since most maintenance and enhancement changes are very short range in scope and the changes to actual are very small in comparison to developing a new application from scratch. In addition, most maintenance and enhancement programmers are not used to any kind of software design but may be much more used to jumping into code and rewriting, fixing and enhancing. &lt;/p&gt;  &lt;p&gt;Here is a link to a site which gives guidance for Agile with design: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.agilemanifesto.org/"&gt;&lt;/a&gt;&lt;a href="http://www.agilemodeling.com/"&gt;Agile Modeling (AM) Home Page: Effective Practices for Modeling and Documentation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The Agile Alliance also has many articles that deal with Agile Development. They provide a starting point for ‘truth in packaging’ with software development methodologies, so that an obsolete dysfunctional or retrograde process is not called ‘Agile’ because ‘Agile’ is new, hip, and trendy and not well defined to some. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.agilealliance.org/home"&gt;Agile Alliance Home&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The Agile Manifesto also has a number of values concerning people and the process which are regularly violated in a ‘Hackagile’ environment. It seems to me that these kinds of development organizations would display much, much more &lt;a href="http://en.wikipedia.org/wiki/Emotional_intelligence"&gt;'Emotional Intelligence’&lt;/a&gt; than almost any development organization I’ve ever worked with ever showed. And I’ll have more to say on that in posts yet to come.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.agilemanifesto.org/"&gt;Manifesto for Agile Software Development&lt;/a&gt;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4de1b171-a901-44d4-9cc1-275941b64d39" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Emotional+Intelligence" rel="tag"&gt;Emotional Intelligence&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IT+Management" rel="tag"&gt;IT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Agile+Development" rel="tag"&gt;Agile Development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Software+development" rel="tag"&gt;Software development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Software+Design" rel="tag"&gt;Software Design&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-2981873317475752383?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/2981873317475752383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/antipattern-hackagile-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/2981873317475752383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/2981873317475752383'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/antipattern-hackagile-development.html' title='AntiPattern: Hackagile Development'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-6238863858338665435</id><published>2009-06-12T08:59:00.001-07:00</published><updated>2009-06-12T08:59:39.563-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><title type='text'>Why Omicompetent Developer Heroes Are Like Unicorns, Dodo Birds,Passenger Pigeons And Saber Toothed Tigers</title><content type='html'>&lt;p&gt;Omnicompetent developer heroes are like unicorns because they don’t exist. They are both mythical animals. Or maybe they’re more like dodo birds or passenger pigeons: they existed once, but overwhelming predation slaughtered them and made them extinct. Or, in my opinion, they are more like saber toothed tigers. They existed once, but the specific environment that nourished them disappeared, and they became extinct. &lt;/p&gt;  &lt;p&gt;Omnicompetent developer heroes disappeared because the environment that nourished them – one platform (the IBM mainframe), one or two languages (COBOL, Fortran) and one operating system (MVS) – is no longer the sole environment. The networked Wintel environment has in itself gone far beyond what could have nourished them if they adapted in complexity. &lt;/p&gt;  &lt;p&gt;Kathleen Dollard, one of my favorite speakers and writers on all things .NET, compiled a list of what’s changed since development methodologies seemed to have become pretty stable. Here is her list and the associated posts:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msmvps.com/blogs/kathleen/archive/2007/11/13/why-your-development-is-crazy.aspx"&gt;Why Your Development is Crazy&lt;/a&gt; (the list) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msmvps.com/blogs/kathleen/archive/2007/11/13/new-items-for-the-list.aspx"&gt;New Items for the List&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msmvps.com/blogs/kathleen/archive/2007/11/14/looking-at-the-list-1-of-6-or-7.aspx"&gt;Looking at the List (1 of 6 or 7)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msmvps.com/blogs/kathleen/archive/2007/11/15/looking-at-the-list-2-of-6-or-7.aspx"&gt;Looking at the List (2 of 6 or 7)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The complexity of the environment points to several things.&lt;/p&gt;  &lt;p&gt;First, upper level executives and managers who sponsor development projects and attempt to guide them from outside based upon their own experience with development projects prior to the development of multitier applications, Internet and Intranet applications, and interconnected SOA infrastructure will not understand the complexity of the current development environment. They may look for heroes like they remember, but they will not find them.&lt;/p&gt;  &lt;p&gt;Moreover, putting more time and effort into a project may not be enough to fill the knowledge gaps. The list goes on and on, and there are not enough hours in the day or training dollars for any organization to produce omincompetent developers in everything. Project teams must therefore be composed of a mix of skillsets for any enterprise level application. This means that the person that is needed for the project may not be the best available coder in the development language for the project. The project may need one or two of these best available coders, but it may need others with strengths in other areas – such as someone who has a knowledge of Visual Basic or C#, but is much stronger in CSS and web design.&lt;/p&gt;  &lt;p&gt;Also, no one person can know all that is necessary, and this requires development teams to be truly teams. No one brings all the technical competence to any significant project necessary to the completion of that project. This means that developers, though they have been historically an individualistic lot,&amp;#160; must learn to be team players to be effective in the future.&lt;/p&gt;  &lt;p&gt;Next, there’s a lot of items on the list which are not related to development languages. It’s now more necessary to learn &lt;strong&gt;languages &lt;/strong&gt;(C#, Visual Basic, Java, COBOL) + &lt;strong&gt;operating environments&lt;/strong&gt;(Windows, Linux, Unix, MVS) + &lt;strong&gt;relational database systems&lt;/strong&gt; (SQL Server, DB2, Oracle) + &lt;strong&gt;user presentation&lt;/strong&gt; (web client, smart client, character based) + &lt;strong&gt;project methodologies&lt;/strong&gt;(agile) + &lt;strong&gt;design methodologies&lt;/strong&gt; (Object Oriented, Structured, AOP, design patterns). &lt;/p&gt;  &lt;p&gt;In addition, a development organization which seeks to remain competent must be a learning organization. There must be a continued striving to learn new things and develop new competencies. Instructor led training is expensive and time consuming, and developers that have depended on it must learn to become much more self directed in their learning. Developers that seek to learn and master new things are the backbone of a learning organization, and managers must seek to hire them, retain them, and keep them motivated and productive. &lt;/p&gt;  &lt;p&gt;Finally, this means that the developer who takes the initiative to keep on learning is the one who will survive and thrive in the new environment. It means that those who rest on classes taken long ago or degrees earned several years ago may in fact be behind the curve in what is needed to remain competent. It means that being able to search and find information crucial to performing a development task, and being able to learn something quickly is now as important as having done a task; capability and learning speed is now as important as experience and current knowledge.&lt;/p&gt;  &lt;p&gt;The hero culture is dead. The environment which nourished it died and killed it. &lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:fabf584d-f981-481b-85d6-535daa20e972" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/team+development" rel="tag"&gt;team development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/hero+culture" rel="tag"&gt;hero culture&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IT+Management" rel="tag"&gt;IT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/software+development" rel="tag"&gt;software development&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-6238863858338665435?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/6238863858338665435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/why-omicompetent-developer-heroes-are.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/6238863858338665435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/6238863858338665435'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/why-omicompetent-developer-heroes-are.html' title='Why Omicompetent Developer Heroes Are Like Unicorns, Dodo Birds,Passenger Pigeons And Saber Toothed Tigers'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-3423340876034034176</id><published>2009-06-12T07:35:00.001-07:00</published><updated>2009-06-12T07:35:41.055-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Skins'/><category scheme='http://www.blogger.com/atom/ns#' term='Webparts'/><category scheme='http://www.blogger.com/atom/ns#' term='Themes'/><title type='text'>Add Some Personalization, Please</title><content type='html'>&lt;p&gt;As I’ve been thinking over some of the custom controls and some projects that I’ve worked with over the past few years, I’m amazed to realize that there is a significant feature that could have been implemented several times, for little additional cost, that would have greatly improved usability of the sites. That feature is personalization. &lt;/p&gt;  &lt;p&gt;In ASP.NET 2.0, the personalization and membership features are out of the box. There have been some role and membership provider implementations for security, but most of the applications were not designed with personalization in mind. I think that there were four basic reasons.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Business analysts were designing the web pages. They did not know about what personalization features were available for the ASP.NET 2.0 web application platform.&lt;/li&gt;    &lt;li&gt;Developers were unaware of the personalization features, or were tied into a rigid web page design of their own making that did not allow personalization.&lt;/li&gt;    &lt;li&gt;The corporation had its own standard web appearance, and did not consider or want to permit users to change it at any point during their usage of the application.&lt;/li&gt;    &lt;li&gt;The project implementation timeline was so aggressive that implementing the basic functionality could only be done, and these possibilities for greater usability would have been only a disdained ‘nice to have’.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I would suggest that the way to incorporate personalization features such as themes, skins and webparts would be to develop two user personas in the design phase. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The naive or first time user of the application. This persona would need the definite instructions on how to get things done in the application and definite paths to follow. &lt;/li&gt;    &lt;li&gt;The frequent or power user of the application. This persona might want to be able to customize the appearance at some points or to be able to put together a page of his or her most frequent starting points to other areas of the application.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Throughout the application lifecycle, the design team should consider personalization features at the initial rollout and subsequent enhancements of the application. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;During the initial rollout, such features as searching for a certain business entity could be implemented as custom controls and ASP.NET Webparts. A frequent or power user would use search features fairly frequently, and the frequent user would probably find the application much more usable than having to proceed through several other points to get to the search page that he or she wanted in the first place.&lt;/li&gt;    &lt;li&gt; During subsequent enhancements of the application, both application developers and testers become power users and frequent users of the application. Their suggestions, as well as those of the actual frequent and power users of the application, need to be sought for places where they could make the application customized to their needs.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Admittedly, adding personalization might be a hard sell in some situations. If there is a corporate Sharepoint implementation, though, there might be enough corporate awareness to see the possibilities. Someone on the project team who ‘sees the light’ on personalization could point out the relevant features on MSN as well. The goal of serving the needs of the users with personalization, and building upon functionality already available in the ASP.NET 2.0 platform should help to make this more of a part of future ASP.NET development projects than previously.&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8dc54d36-b483-47da-9f34-1643781d2f00" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Webparts" rel="tag"&gt;Webparts&lt;/a&gt;,&lt;a href="http://technorati.com/tags/personalization" rel="tag"&gt;personalization&lt;/a&gt;,&lt;a href="http://technorati.com/tags/themes" rel="tag"&gt;themes&lt;/a&gt;,&lt;a href="http://technorati.com/tags/skins" rel="tag"&gt;skins&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-3423340876034034176?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/3423340876034034176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/add-some-personalization-please.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/3423340876034034176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/3423340876034034176'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/add-some-personalization-please.html' title='Add Some Personalization, Please'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-8016400378659668341</id><published>2009-06-08T06:49:00.001-07:00</published><updated>2010-08-19T08:15:24.256-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='UpdatePanel'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom Controls'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax.NET'/><title type='text'>An ASP.NET Double ListBox Control: Implementation</title><content type='html'>&lt;p&gt;In previous posts, I demonstrated how to create a double listbox control in ASP.NET. Here are the subjects that were covered:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control.html"&gt;Creating a custom control class in a Visual Studio project&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control_08.html"&gt;Adding extension methods for the list box controls&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control_6302.html"&gt;Adding a Visual Studio designer class&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control_5287.html"&gt;A clientside Javascript function was added so that the control can function without postbacks to the server.&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here's how the implementation looks inside an ASPX page: &lt;/p&gt; &lt;code&gt;   &lt;pre style="font-family: consolas"&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@&lt;/span&gt;&amp;#160;&lt;span style="color: maroon"&gt;Page&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;C#&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;#160; &lt;span style="color: red"&gt;CodeFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;Default.aspx.cs&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;_Default&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="background: yellow"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@&lt;/span&gt;&amp;#160;&lt;span style="color: maroon"&gt;Register&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;Assembly&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;DaleWare.Web.UI.Controls&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;Namespace&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;DaleWare.Web.UI.Controls.Validators&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;TagPrefix&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;DaleWare&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="background: yellow"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@&lt;/span&gt;&amp;#160;&lt;span style="color: maroon"&gt;Register&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;Assembly&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;DaleWare.Web.UI.Controls&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;Namespace&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;DaleWare.Web.UI.Controls&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;TagPrefix&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;DaleWare&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="background: yellow"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: maroon"&gt;DOCTYPE&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;html&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;PUBLIC&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;html&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;head&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;style&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;body&lt;/span&gt; {&lt;span style="color: red"&gt;font-family&lt;/span&gt;:&lt;span style="color: blue"&gt;Verdana,&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;Arial&lt;/span&gt;; &lt;span style="color: red"&gt;font-size&lt;/span&gt;: &lt;span style="color: blue"&gt;small&lt;/span&gt;;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;style&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;head&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;form&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;form1&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ScriptManager&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;ScriptManager1&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ScriptManager&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;UpdatePanel&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;up1&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;lblTitle&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;List Picker Control Demo: Greatest TV Shows of All Time: Choose Your Favorites&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;DaleWare&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListPickerControl&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;LP1&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;ListBoxStyle-Width&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;NumberOfListBoxRows&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;15&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;AvailableChoicesLabelText&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;Available Choices&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;SelectedChoicesLabelText&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;Selected Choices&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;LabelStyle-Font-Bold&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;LabelStyle-ForeColor&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;Blue&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Sort&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;AvailableChoices&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;I Love Lucy&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;The Dick Van Dyke Show&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;M*A*S*H&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;All in the Family&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Star Trek&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Gunsmoke&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Land of the Lost&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Make Room for Daddy&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;The People's Choice&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Space Angel&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Time Traxx&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Stargate SG1&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Rowan and Martin's Laughin&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Law and Order&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Perry Mason&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;The Tonight Show&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;AvailableChoices&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;DaleWare&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ListPickerControl&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;UpdatePanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Button&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;Button1&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;Submit&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;form&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;html&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:965eda31-3aaf-4287-8eeb-c192a863cce8" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Ajax.NET" rel="tag"&gt;Ajax.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Custom+Controls" rel="tag"&gt;Custom Controls&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Javascript" rel="tag"&gt;Javascript&lt;/a&gt;,&lt;a href="http://technorati.com/tags/UpdatePanel" rel="tag"&gt;UpdatePanel&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-8016400378659668341?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/8016400378659668341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-control.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/8016400378659668341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/8016400378659668341'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-control.html' title='An ASP.NET Double ListBox Control: Implementation'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-5745984943192496651</id><published>2009-06-08T06:36:00.001-07:00</published><updated>2010-08-19T08:10:20.157-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='UpdatePanel'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom Controls'/><title type='text'>An ASP.NET Double ListBox Custom Control: Step 4</title><content type='html'>&lt;p&gt;In my previous posts on the subject of creating a double listbox custom control, I demonstrated:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control.html"&gt;Creating a custom control class in a Visual Studio project&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control_08.html"&gt;Adding extension methods for the list box controls&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control_6302.html"&gt;Adding a Visual Studio designer class&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In this post, a clientside Javascript function is added so that the control can function without postbacks to the server. The user of the control has a property already in the control file which gives the choice as to whether to use the client side Javascript or not.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt; &lt;code&gt;   &lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;function&lt;/span&gt; moveListBoxItems(firstListBoxId, secondListBoxId, selectedOnly) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; firstListBox = document.getElementById(firstListBoxId);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; secondListBox = document.getElementById(secondListBoxId);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; ((firstListBox != &lt;span style="color: blue"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp; (secondListBox != &lt;span style="color: blue"&gt;null&lt;/span&gt;)) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; i = firstListBox.options.length -1; i &amp;gt;= 0; i--) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (selectedOnly) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (firstListBox.options[i].selected) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; secondListBox.appendChild(firstListBox.options[i]);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; secondListBox.appendChild(firstListBox.options[i]);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Copy and paste the following code into the AssemblyInfo.cs file. This code includes the above file as a web resource inside the custom control assembly.&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  &lt;pre style="font-family: consolas"&gt;[&lt;span style="color: blue"&gt;assembly&lt;/span&gt;: System.Web.UI.TagPrefix(&lt;span style="color: #a31515"&gt;&amp;quot;DaleWare.Web.UI.Controls&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;DaleWare&amp;quot;&lt;/span&gt;)]&lt;br /&gt;[&lt;span style="color: blue"&gt;assembly&lt;/span&gt;: System.Web.UI.TagPrefix(&lt;span style="color: #a31515"&gt;&amp;quot;DaleWare.Web.UI.Controls.Validators&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;DaleWare&amp;quot;&lt;/span&gt;)]&lt;br /&gt;[&lt;span style="color: blue"&gt;assembly&lt;/span&gt;: System.Web.UI.WebResource(&lt;span style="color: #a31515"&gt;&amp;quot;DaleWare.Web.UI.Controls.Validators.WebUIValidationExtended.js&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;application/x-javascript&amp;quot;&lt;/span&gt;)]&lt;br /&gt;[&lt;span style="color: blue"&gt;assembly&lt;/span&gt;: System.Web.UI.WebResource(&lt;span style="color: #a31515"&gt;&amp;quot;DaleWare.Web.UI.Controls.ListPickerClientSide.js&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;application/x-javascript&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5b3b9256-2b76-45cc-be33-8534f6f2ee87" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Custom+Controls" rel="tag"&gt;Custom Controls&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Javascript" rel="tag"&gt;Javascript&lt;/a&gt;,&lt;a href="http://technorati.com/tags/UpdatePanel" rel="tag"&gt;UpdatePanel&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-5745984943192496651?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/5745984943192496651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control_5287.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/5745984943192496651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/5745984943192496651'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control_5287.html' title='An ASP.NET Double ListBox Custom Control: Step 4'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-2321681665354583620</id><published>2009-06-08T06:13:00.001-07:00</published><updated>2010-08-19T08:06:41.476-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom Controls'/><title type='text'>An ASP.NET Double ListBox Custom Control: Step 3</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_uDhjHk-G--Y/Si0PEpgC90I/AAAAAAAAABc/DQkLT71f0yM/s1600-h/DoubleListBoxDesigner.png"&gt;&lt;img style="text-align: center; margin: 0px auto 10px; width: 467px; display: block; height: 282px; cursor: hand" id="BLOGGER_PHOTO_ID_5344944905292805954" border="0" alt="" src="http://4.bp.blogspot.com/_uDhjHk-G--Y/Si0PEpgC90I/AAAAAAAAABc/DQkLT71f0yM/s320/DoubleListBoxDesigner.png" width="477" height="288" /&gt;&lt;/a&gt;  &lt;br /&gt;  &lt;p&gt;In my previous two posts, I showed &lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control.html"&gt;how to create a basic double listbox control&lt;/a&gt; and &lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control_08.html"&gt;provide additional extension methods for the listbox controls.&lt;/a&gt; In the next step, the project gets a designer to provide more visual feedback to incorporating the control into an ASPX page inside Visual Studio. Here is the code for a designer that provides the visual appearance in Visual Studio. &lt;/p&gt; &lt;code&gt;   &lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web.UI.Design;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web.UI.WebControls;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; DaleWare.Web.UI.Controls&lt;br /&gt;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Summary description for ListPickerControlDesigner&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;ListPickerControlDesigner&lt;/span&gt; : ControlDesigner&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;override&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;string&lt;/span&gt; GetDesignTimeHtml()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;StringBuilder&lt;/span&gt; sb = &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;StringBuilder&lt;/span&gt;();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListPickerControl lpc = Component &lt;span style="color: blue"&gt;as&lt;/span&gt; ListPickerControl;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;table&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(lpc.Width !=&lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot; width=\&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(ControlDesignerUtility.UnitString(lpc.Width));&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=\&amp;quot;width:40%;text-align:left\&amp;quot;&amp;gt;\r\n&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(lpc.AvailableChoicesLabelText) == &lt;span style="color: blue"&gt;false&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(lpc.AvailableChoicesLabelText);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;select style=\&amp;quot;width:&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(lpc.ListBoxStyle.Width.ToString());&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (lpc.NumberOfListBoxRows &amp;gt; 0)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.AppendFormat(&lt;span style="color: #a31515"&gt;&amp;quot;\&amp;quot; size=\&amp;quot;{0}&amp;quot;&lt;/span&gt;, lpc.NumberOfListBoxRows);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;\&amp;quot;&amp;gt;\r\n&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (lpc.AvailableChoices == &lt;span style="color: blue"&gt;null&lt;/span&gt; || lpc.AvailableChoices.Count == 0)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;lt;/li&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (ListItem item &lt;span style="color: blue"&gt;in&lt;/span&gt; lpc.AvailableChoices)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;li&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (item.Value != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot; value=\&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(item.Value);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(item.Text);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;/li&amp;gt;\r\n&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;/select&amp;gt;\r\n&amp;lt;/td&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;td style=\&amp;quot;width:20%;text-align:center\&amp;quot;&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;input type=\&amp;quot;button\&amp;quot; value=\&amp;quot;&amp;gt;&amp;gt;\&amp;quot; style=\&amp;quot;width:3em\&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;input type=\&amp;quot;button\&amp;quot; value=\&amp;quot;&amp;gt;&amp;amp;nbsp;\&amp;quot; style=\&amp;quot;width:3em\&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;input type=\&amp;quot;button\&amp;quot; value=\&amp;quot;&amp;lt;&amp;amp;nbsp;\&amp;quot; style=\&amp;quot;width:3em\&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;input type=\&amp;quot;button\&amp;quot; value=\&amp;quot;&amp;lt;&amp;lt;\&amp;quot; style=\&amp;quot;width:3em\&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;/td&amp;gt;\r\n&amp;lt;td style=\&amp;quot;width:40%;text-align:left\&amp;quot;&amp;gt;\r\n&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(lpc.SelectedChoicesLabelText) == &lt;span style="color: blue"&gt;false&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(lpc.SelectedChoicesLabelText);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;select style=\&amp;quot;width:&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(lpc.ListBoxStyle.Width.ToString().Trim());&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (lpc.NumberOfListBoxRows &amp;gt; 0)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.AppendFormat(&lt;span style="color: #a31515"&gt;&amp;quot;\&amp;quot; size=\&amp;quot;{0}&amp;quot;&lt;/span&gt;, lpc.NumberOfListBoxRows);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;\&amp;quot;&amp;gt;\r\n&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (lpc.SelectedItems == &lt;span style="color: blue"&gt;null&lt;/span&gt; || lpc.SelectedItems.Count == 0)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;li&amp;gt;&amp;amp;nbsp;&amp;lt;/li&amp;gt;\r\n&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (ListItem item &lt;span style="color: blue"&gt;in&lt;/span&gt; lpc.SelectedItems)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;li&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (item.Value != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot; value=\&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(item.Value);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(item.Text);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;/li&amp;gt;\r\n&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;/select&amp;gt;\r\n&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.IO.&lt;span style="color: #2b91af"&gt;File&lt;/span&gt;.WriteAllText(&lt;span style="color: #a31515"&gt;&amp;quot;C:\\Users\\Dale\\Documents\\Output.txt&amp;quot;&lt;/span&gt;,sb.ToString());&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; sb.ToString();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a6f89232-3e72-480b-9af4-c1bf71f1de0f" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Custom+Controls" rel="tag"&gt;Custom Controls&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-2321681665354583620?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/2321681665354583620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control_6302.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/2321681665354583620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/2321681665354583620'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control_6302.html' title='An ASP.NET Double ListBox Custom Control: Step 3'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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://4.bp.blogspot.com/_uDhjHk-G--Y/Si0PEpgC90I/AAAAAAAAABc/DQkLT71f0yM/s72-c/DoubleListBoxDesigner.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6094800596146935474.post-431920100688183023</id><published>2009-06-08T06:03:00.001-07:00</published><updated>2010-08-19T08:03:28.824-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom Controls'/><title type='text'>An ASP.NET Double ListBox Custom Control: Step 2</title><content type='html'>&lt;p&gt;In &lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control.html"&gt;my previous post&lt;/a&gt;, I gave the basic code for a double list box control class. It’s dependent, however, on these extension methods. Simply add a new C# class to the project, name it ListControlUtility.cs, and copy and paste the following code into it. But beware: there are two more steps to this process of producing a working control!&lt;/p&gt; &lt;code&gt;   &lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web.UI.WebControls;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; DaleWare.Web.UI.Controls&lt;br /&gt;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; This is a utility class of extension methods which can be applied to &lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; a list box. It can be used outside the controls assembly for convenience&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; simply by including the namespace.&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;ListControlUtility&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; This method returns a list of selected listitems from the listbox.&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name=&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;quot;lc&amp;quot;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;The list control.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;ListItem&amp;gt; SelectedItems(&lt;span style="color: blue"&gt;this&lt;/span&gt; ListControl lc)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;ListItem&amp;gt; selectedItems =&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lc.Items.Cast&amp;lt;ListItem&amp;gt;().Where(item =&amp;gt; item.Selected == &lt;span style="color: blue"&gt;true&lt;/span&gt;).ToList();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; selectedItems;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; Sort Implementation&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; This method sorts the items in a listbox.&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name=&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;quot;items&amp;quot;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;The list control.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name=&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;quot;Descending&amp;quot;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;Whether to sort the list box descending. &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; SortListItems(&lt;span style="color: blue"&gt;this&lt;/span&gt; ListItemCollection items, &lt;span style="color: blue"&gt;bool&lt;/span&gt; Descending)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.Collections.Generic.&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;ListItem&amp;gt; list = &lt;span style="color: blue"&gt;new&lt;/span&gt; System.Collections.Generic.&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;ListItem&amp;gt;();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (ListItem i &lt;span style="color: blue"&gt;in&lt;/span&gt; items)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list.Add(i);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (Descending)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;ListItem&amp;gt; itemEnum =&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;from&lt;/span&gt; item &lt;span style="color: blue"&gt;in&lt;/span&gt; list&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;orderby&lt;/span&gt; item.Text &lt;span style="color: blue"&gt;descending&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;select&lt;/span&gt; item;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; items.Clear();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; items.AddRange(itemEnum.ToArray());&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// anonymous delegate list.Sort(delegate(ListItem x, ListItem y) { return y.Text.CompareTo(x.Text); });&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;ListItem&amp;gt; itemEnum =&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;from&lt;/span&gt; item &lt;span style="color: blue"&gt;in&lt;/span&gt; list&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;orderby&lt;/span&gt; item.Text &lt;span style="color: blue"&gt;ascending&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;select&lt;/span&gt; item;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; items.Clear();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; items.AddRange(itemEnum.ToArray());&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;//list.Sort(delegate(ListItem x, ListItem y) { return x.Text.CompareTo(y.Text); });&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:710742ea-477f-4468-9c04-b19e71018e3d" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Custom+Controls" rel="tag"&gt;Custom Controls&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-431920100688183023?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/431920100688183023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control_08.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/431920100688183023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/431920100688183023'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control_08.html' title='An ASP.NET Double ListBox Custom Control: Step 2'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6094800596146935474.post-9217498475011046147</id><published>2009-06-05T14:18:00.001-07:00</published><updated>2010-08-19T07:58:29.067-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom Controls'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax.NET'/><title type='text'>An ASP.NET Double ListBox Custom Control: Step 1</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_uDhjHk-G--Y/Si0JsYgGylI/AAAAAAAAABU/PdIk9tCtl5w/s1600-h/DoubleListBoxSample.png"&gt;&lt;img style="text-align: center; margin: 0px auto; width: 476px; display: block; height: 178px; cursor: hand" id="BLOGGER_PHOTO_ID_5344938990854654546" border="0" alt="" src="http://3.bp.blogspot.com/_uDhjHk-G--Y/Si0JsYgGylI/AAAAAAAAABU/PdIk9tCtl5w/s320/DoubleListBoxSample.png" width="486" height="182" /&gt;&lt;/a&gt;  &lt;br /&gt;  &lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_uDhjHk-G--Y/SimMCDWRlrI/AAAAAAAAABM/vHMDJBCSDiM/s1600-h/DoubleListBoxSample.png"&gt;&lt;/a&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;p&gt;On a number of projects I’ve had to implement a double list box control for different clients. It’s not a task I particularly enjoy, since I don’t think that the double list box is particularly user friendly. For the most part, I think that in the majority of cases a CheckBoxList works better and is far more easy to implement than a double list box. But, for those of us who have clients that insist on a double list box, here is the way to get one completed.&lt;/p&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;p&gt;1. Create a class library project like in my previous project.&lt;/p&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;p&gt;&lt;a title="http://thedalehawthorneeffect.blogspot.com/2009/05/another-way-to-handle-client-script.html" href="http://thedalehawthorneeffect.blogspot.com/2009/05/another-way-to-handle-client-script.html"&gt;http://thedalehawthorneeffect.blogspot.com/2009/05/another-way-to-handle-client-script.html&lt;/a&gt;&lt;/p&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;p&gt;2. Add a reference to System.Design.&lt;/p&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;p&gt;3. Add a class file named SortDirectionEnum.cs.&lt;/p&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;p&gt;4. Copy and paste the following code into SortDirectionEnum.cs:&lt;/p&gt;   &lt;code&gt;     &lt;br /&gt;      &lt;br /&gt;      &lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; DaleWare.Web.UI.Controls&lt;br /&gt;{&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Summary description for SortDirectionEnum&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;enum&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;SortDirectionEnum&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Ascending,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Descending&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;  &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;5. Add a class file named ListPickerControl.cs.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;6. Copy and paste the code below into ListPickerControl.cs.&lt;/p&gt;&lt;br /&gt;  &lt;code&gt;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Security.Permissions;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web.UI;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web.UI.WebControls;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.ComponentModel.Design;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; DaleWare.Web.UI.Controls&lt;br /&gt;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Summary description for ListPickerControl&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AspNetHostingPermission(&lt;span style="color: #2b91af"&gt;SecurityAction&lt;/span&gt;.Demand,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Level = AspNetHostingPermissionLevel.Minimal),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AspNetHostingPermission(&lt;span style="color: #2b91af"&gt;SecurityAction&lt;/span&gt;.InheritanceDemand,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Level = AspNetHostingPermissionLevel.Minimal),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ToolboxData(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;{0}:ListPicker runat=\&amp;quot;server\&amp;quot;&amp;gt; &amp;lt;/{0}:ListPicker&amp;gt;&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SupportsEventValidation(),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Designer(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(ListPickerControlDesigner), &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(IDesigner))]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;ListPickerControl&lt;/span&gt; : CompositeControl&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; ListBox _availableChoicesListBox = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; ListBox _selectedChoicesListBox = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; ListItemCollection _availableChoices = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; ListItemCollection _selectedChoices = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; Style _buttonStyle = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; Style _listBoxStyle = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;bool&lt;/span&gt; _sort;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; Button btnMoveAllLeftToRight = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; Button btnMoveSelectedLeftToRight = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; Button btnMoveSelectedRightToLeft = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; Button btnMoveAllRightToLeft = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;int&lt;/span&gt; _numberOfRows = 10;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; Label _availableChoicesLabel = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; Label _selectedChoicesLabel = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; Style _labelStyle = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Category(&lt;span style="color: #a31515"&gt;&amp;quot;Behavior&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(&lt;span style="color: #a31515"&gt;&amp;quot;This property gets or sets whether to use client script to move the items between the list boxes.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;span style="color: #a31515"&gt;&amp;quot;This property gets or sets whether to use client script to move the items between the list boxes.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Localizable(&lt;span style="color: blue"&gt;false&lt;/span&gt;)]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;bool&lt;/span&gt; UseClientScript&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;set&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Category(&lt;span style="color: #a31515"&gt;&amp;quot;Behavior&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(&lt;span style="color: #a31515"&gt;&amp;quot;This button moves all values from the left list box to the right list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;span style="color: #a31515"&gt;&amp;quot;Tool tip for the button that moves all values from the left list box to the right list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Localizable(&lt;span style="color: blue"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;string&lt;/span&gt; MoveAllLeftToRightButtonToolTip&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;;&lt;span style="color: blue"&gt;set&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Category(&lt;span style="color: #a31515"&gt;&amp;quot;Behavior&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(&lt;span style="color: #a31515"&gt;&amp;quot;This button moves all values from the right list box to the left list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;span style="color: #a31515"&gt;&amp;quot;Tool tip for the button that moves all values from the right list box to the left list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Localizable(&lt;span style="color: blue"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;string&lt;/span&gt; MoveAllRightToLeftButtonToolTip&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;set&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Category(&lt;span style="color: #a31515"&gt;&amp;quot;Behavior&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(&lt;span style="color: #a31515"&gt;&amp;quot;This button moves all selected values from the left list box to the right list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;span style="color: #a31515"&gt;&amp;quot;Tool tip for the button that moves all selected values from the left list box to the right list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Localizable(&lt;span style="color: blue"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;string&lt;/span&gt; MoveSelectedLeftToRightButtonToolTip&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Category(&lt;span style="color: #a31515"&gt;&amp;quot;Behavior&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(&lt;span style="color: #a31515"&gt;&amp;quot;This button moves all selected values from the right list box to the left list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;span style="color: #a31515"&gt;&amp;quot;Tool tip for the button that moves all selected values from the right list box to the left list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Localizable(&lt;span style="color: blue"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;string&lt;/span&gt; MoveSelectedRightToLeftButtonToolTip&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;;&lt;span style="color: blue"&gt;set&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Category(&lt;span style="color: #a31515"&gt;&amp;quot;Behavior&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(&lt;span style="color: #a31515"&gt;&amp;quot;This button moves all values from the right list box to the left list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;span style="color: #a31515"&gt;&amp;quot;Tool tip for the button that moves all values from the right list box to the left list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Localizable(&lt;span style="color: blue"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;string&lt;/span&gt; MoveAllRightToLeft&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;;&lt;span style="color: blue"&gt;set&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Bindable(&lt;span style="color: blue"&gt;true&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Category(&lt;span style="color: #a31515"&gt;&amp;quot;Behavior&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(&lt;span style="color: blue"&gt;true&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;span style="color: #a31515"&gt;&amp;quot;Whether to sort the listboxes.&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;bool&lt;/span&gt; Sort&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; _sort; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;set&lt;/span&gt; { _sort = &lt;span style="color: blue"&gt;value&lt;/span&gt;; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Bindable(&lt;span style="color: blue"&gt;true&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Category(&lt;span style="color: #a31515"&gt;&amp;quot;Behavior&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(SortDirection.Ascending),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;span style="color: #a31515"&gt;&amp;quot;Sort direction for sorting the listboxes.&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; SortDirection SortDirection&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Bindable(&lt;span style="color: blue"&gt;true&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Category(&lt;span style="color: #a31515"&gt;&amp;quot;Layout&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(10),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;span style="color: #a31515"&gt;&amp;quot;The default number of rows for the listboxes.&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;int&lt;/span&gt; NumberOfListBoxRows&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;set&lt;/span&gt; { _numberOfRows = &lt;span style="color: blue"&gt;value&lt;/span&gt;; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; _numberOfRows; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Category(&lt;span style="color: #a31515"&gt;&amp;quot;Behavior&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(&lt;span style="color: #a31515"&gt;&amp;quot;This is the label text for the left list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;span style="color: #a31515"&gt;&amp;quot;This is the label text for the left list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Localizable(&lt;span style="color: blue"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;string&lt;/span&gt; AvailableChoicesLabelText&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;set&lt;/span&gt;; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Category(&lt;span style="color: #a31515"&gt;&amp;quot;Behavior&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(&lt;span style="color: #a31515"&gt;&amp;quot;This is the label text for the right list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;span style="color: #a31515"&gt;&amp;quot;This is the label text for the right list box.&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Localizable(&lt;span style="color: blue"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;string&lt;/span&gt; SelectedChoicesLabelText&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;set&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Bindable(&lt;span style="color: blue"&gt;true&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue((&lt;span style="color: blue"&gt;string&lt;/span&gt;)&lt;span style="color: blue"&gt;null&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PersistenceMode(PersistenceMode.InnerProperty),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Editor(&lt;span style="color: #a31515"&gt;&amp;quot;System.Web.UI.Design.WebControls.ListItemsCollectionEditor,System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(System.Drawing.Design.UITypeEditor)),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MergableProperty(&lt;span style="color: blue"&gt;false&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;span style="color: #a31515"&gt;&amp;quot;The list of available items intended for the left list box.&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; ListItemCollection AvailableChoices&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoices == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoices = &lt;span style="color: blue"&gt;new&lt;/span&gt; ListItemCollection();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((IStateManager)&lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoices).TrackViewState();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoices;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Bindable(&lt;span style="color: blue"&gt;true&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue((&lt;span style="color: blue"&gt;string&lt;/span&gt;)&lt;span style="color: blue"&gt;null&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PersistenceMode(PersistenceMode.InnerProperty),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Editor(&lt;span style="color: #a31515"&gt;&amp;quot;System.Web.UI.Design.WebControls.ListItemsCollectionEditor,System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(System.Drawing.Design.UITypeEditor)),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MergableProperty(&lt;span style="color: blue"&gt;false&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Category(&lt;span style="color: #a31515"&gt;&amp;quot;Data&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;span style="color: #a31515"&gt;&amp;quot;The list of selected items intended for the right list box.&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; ListItemCollection SelectedItems&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoices == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoices = &lt;span style="color: blue"&gt;new&lt;/span&gt; ListItemCollection();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox != &lt;span style="color: blue"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items != &lt;span style="color: blue"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items.Count &amp;gt; 0)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (ListItem li &lt;span style="color: blue"&gt;in&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoices.Add(li);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((IStateManager)&lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoices).TrackViewState();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoices;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; Typed Style properties&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Category(&lt;span style="color: #a31515"&gt;&amp;quot;Styles&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(&lt;span style="color: blue"&gt;null&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DesignerSerializationVisibility(&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DesignerSerializationVisibility.Content),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PersistenceMode(PersistenceMode.InnerProperty),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a31515"&gt;&amp;quot;The strongly typed style for the Button child controls.&amp;quot;&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;virtual&lt;/span&gt; Style ButtonStyle&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (_buttonStyle == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _buttonStyle = &lt;span style="color: blue"&gt;new&lt;/span&gt; Style();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (IsTrackingViewState)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((IStateManager)_buttonStyle).TrackViewState();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; _buttonStyle;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Category(&lt;span style="color: #a31515"&gt;&amp;quot;Styles&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(&lt;span style="color: blue"&gt;null&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DesignerSerializationVisibility(&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DesignerSerializationVisibility.Content),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PersistenceMode(PersistenceMode.InnerProperty),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a31515"&gt;&amp;quot;The strongly typed style for the ListBox child controls.&amp;quot;&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;virtual&lt;/span&gt; Style ListBoxStyle&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (_listBoxStyle == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _listBoxStyle = &lt;span style="color: blue"&gt;new&lt;/span&gt; Style();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (IsTrackingViewState)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((IStateManager)_listBoxStyle).TrackViewState();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; _listBoxStyle;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Category(&lt;span style="color: #a31515"&gt;&amp;quot;Styles&amp;quot;&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DefaultValue(&lt;span style="color: blue"&gt;null&lt;/span&gt;),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DesignerSerializationVisibility(&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DesignerSerializationVisibility.Content),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PersistenceMode(PersistenceMode.InnerProperty),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description(&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a31515"&gt;&amp;quot;The strongly typed style for the listbox labels.&amp;quot;&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;virtual&lt;/span&gt; Style LabelStyle&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._labelStyle == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _labelStyle = &lt;span style="color: blue"&gt;new&lt;/span&gt; Style();&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (IsTrackingViewState)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((IStateManager)_labelStyle).TrackViewState();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; _labelStyle;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; Protected Properties&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;bool&lt;/span&gt; RenderClientScript&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;.UseClientScript &amp;amp;&amp;amp; (&lt;span style="color: blue"&gt;this&lt;/span&gt;.Page.Request.Browser.EcmaScriptVersion.Major &amp;gt;= 1)); }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; Protected Methods&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;override&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; RecreateChildControls()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EnsureChildControls();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;override&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; OnInit(&lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;base&lt;/span&gt;.OnInit(e);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.TrackViewState(); &lt;span style="color: green"&gt;// check to see whether this is necessary or not.&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;override&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; CreateChildControls()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Controls.Clear();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox = &lt;span style="color: blue"&gt;new&lt;/span&gt; ListBox();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.Rows = &lt;span style="color: blue"&gt;this&lt;/span&gt;.NumberOfListBoxRows;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.SelectionMode = ListSelectionMode.Multiple;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox = &lt;span style="color: blue"&gt;new&lt;/span&gt; ListBox();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Rows = &lt;span style="color: blue"&gt;this&lt;/span&gt;.NumberOfListBoxRows;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.SelectionMode = ListSelectionMode.Multiple;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllLeftToRight = &lt;span style="color: blue"&gt;new&lt;/span&gt; Button();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllLeftToRight.Text = &lt;span style="color: #a31515"&gt;&amp;quot;&amp;gt;&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllLeftToRight.ToolTip = &lt;span style="color: blue"&gt;this&lt;/span&gt;.MoveAllLeftToRightButtonToolTip;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllLeftToRight.CausesValidation = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedLeftToRight = &lt;span style="color: blue"&gt;new&lt;/span&gt; Button();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedLeftToRight.Text = &lt;span style="color: #a31515"&gt;&amp;quot; &amp;gt; &amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedLeftToRight.ToolTip = &lt;span style="color: blue"&gt;this&lt;/span&gt;.MoveSelectedLeftToRightButtonToolTip;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedLeftToRight.CausesValidation = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedRightToLeft = &lt;span style="color: blue"&gt;new&lt;/span&gt; Button();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedRightToLeft.Text = &lt;span style="color: #a31515"&gt;&amp;quot; &amp;lt; &amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedRightToLeft.ToolTip = &lt;span style="color: blue"&gt;this&lt;/span&gt;.MoveSelectedRightToLeftButtonToolTip;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedRightToLeft.CausesValidation = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllRightToLeft = &lt;span style="color: blue"&gt;new&lt;/span&gt; Button();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllRightToLeft.Text = &lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllRightToLeft.ToolTip = &lt;span style="color: blue"&gt;this&lt;/span&gt;.MoveAllRightToLeftButtonToolTip;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllRightToLeft.CausesValidation = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;.RenderClientScript)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.RegisterClientScriptResource(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(ListPickerControl), &lt;span style="color: #a31515"&gt;&amp;quot;DaleWare.Web.UI.Controls.ListPickerClientSide.js&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllLeftToRight.Click += &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(btnMoveAllLeftToRight_Click);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedLeftToRight.Click += &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(btnMoveSelectedLeftToRight_Click);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedRightToLeft.Click += &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(btnMoveSelectedRightToLeft_Click);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllRightToLeft.Click += &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(btnMoveAllRightToLeft_Click);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span style="color: blue"&gt;this&lt;/span&gt;.AvailableChoicesLabelText) == &lt;span style="color: blue"&gt;false&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesLabel = &lt;span style="color: blue"&gt;new&lt;/span&gt; Label();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesLabel.ApplyStyle(&lt;span style="color: blue"&gt;this&lt;/span&gt;.LabelStyle);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesLabel.Text = &lt;span style="color: blue"&gt;this&lt;/span&gt;.AvailableChoicesLabelText;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesLabel);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span style="color: blue"&gt;this&lt;/span&gt;.SelectedChoicesLabelText) == &lt;span style="color: blue"&gt;false&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesLabel = &lt;span style="color: blue"&gt;new&lt;/span&gt; Label();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesLabel.ApplyStyle(&lt;span style="color: blue"&gt;this&lt;/span&gt;.LabelStyle);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesLabel.Text = &lt;span style="color: blue"&gt;this&lt;/span&gt;.SelectedChoicesLabelText;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesLabel);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.Controls.Add(_availableChoicesListBox);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.Controls.Add(_selectedChoicesListBox);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.Controls.Add(btnMoveAllLeftToRight);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.Controls.Add(btnMoveAllRightToLeft);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.Controls.Add(btnMoveSelectedLeftToRight);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.Controls.Add(btnMoveSelectedRightToLeft);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoices != &lt;span style="color: blue"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoices.Count &amp;gt; 0)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;.Sort) &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoices.SortListItems(&lt;span style="color: blue"&gt;this&lt;/span&gt;.SortDirection == SortDirection.Descending);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (ListItem li &lt;span style="color: blue"&gt;in&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoices)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.Items.Add(li);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoices != &lt;span style="color: blue"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoices.Count &amp;gt; 0)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;.Sort) &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoices.SortListItems(&lt;span style="color: blue"&gt;this&lt;/span&gt;.SortDirection == SortDirection.Descending);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (ListItem li &lt;span style="color: blue"&gt;in&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoices)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items.Add(li);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;override&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; Render(HtmlTextWriter writer)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AddAttributesToRender(writer);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.AddAttribute(&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; HtmlTextWriterAttribute.Width, &lt;span style="color: blue"&gt;this&lt;/span&gt;.Width.ToString(), &lt;span style="color: blue"&gt;false&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.RenderBeginTag(HtmlTextWriterTag.Table);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._listBoxStyle != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.ApplyStyle(&lt;span style="color: blue"&gt;this&lt;/span&gt;._listBoxStyle);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.ApplyStyle(&lt;span style="color: blue"&gt;this&lt;/span&gt;._listBoxStyle);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._buttonStyle != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllLeftToRight.ApplyStyle(_buttonStyle);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllRightToLeft.ApplyStyle(_buttonStyle);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedLeftToRight.ApplyStyle(_buttonStyle);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedRightToLeft.ApplyStyle(_buttonStyle);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;.RenderClientScript)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllLeftToRight.Attributes.Add(&lt;span style="color: #a31515"&gt;&amp;quot;onclick&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;javascript:return moveListBoxItems(\'{0}\',\'{1}\',false);&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.ClientID,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.ClientID));&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedLeftToRight.Attributes.Add(&lt;span style="color: #a31515"&gt;&amp;quot;onclick&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;javascript:return moveListBoxItems(\'{0}\',\'{1}\',true);&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.ClientID,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.ClientID));&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedRightToLeft.Attributes.Add(&lt;span style="color: #a31515"&gt;&amp;quot;onclick&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;javascript:return moveListBoxItems(\'{0}\',\'{1}\',true);&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.ClientID,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.ClientID));&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllRightToLeft.Attributes.Add(&lt;span style="color: #a31515"&gt;&amp;quot;onclick&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;javascript:return moveListBoxItems(\'{0}\',\'{1}\',false);&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.ClientID,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.ClientID));&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;.IsInsideUpdatePanel() == &lt;span style="color: blue"&gt;false&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (ListItem li &lt;span style="color: blue"&gt;in&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;this&lt;/span&gt;.SelectedItems)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.Page.ClientScript.RegisterForEventValidation(&lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.UniqueID, li.Value);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (ListItem li &lt;span style="color: blue"&gt;in&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;this&lt;/span&gt;.AvailableChoices)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.Page.ClientScript.RegisterForEventValidation(&lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.UniqueID, li.Value);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.RenderBeginTag(HtmlTextWriterTag.Tr);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// first list box cell&amp;#160;&amp;#160; &lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.AddStyleAttribute(HtmlTextWriterStyle.TextAlign, &lt;span style="color: #a31515"&gt;&amp;quot;left&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.AddStyleAttribute(HtmlTextWriterStyle.Width, &lt;span style="color: #a31515"&gt;&amp;quot;40%&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.RenderBeginTag(HtmlTextWriterTag.Td);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// first list box&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesLabel != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesLabel.RenderControl(writer);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.WriteBreak();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.RenderControl(writer);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.RenderEndTag();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// button cell&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.AddStyleAttribute(HtmlTextWriterStyle.TextAlign, &lt;span style="color: #a31515"&gt;&amp;quot;center&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.AddStyleAttribute(HtmlTextWriterStyle.Width, &lt;span style="color: #a31515"&gt;&amp;quot;20%&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.RenderBeginTag(HtmlTextWriterTag.Td);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllLeftToRight.RenderControl(writer);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.WriteBreak();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedLeftToRight.RenderControl(writer);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.WriteBreak();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveSelectedRightToLeft.RenderControl(writer);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.WriteBreak();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.btnMoveAllRightToLeft.RenderControl(writer);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.RenderEndTag();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// second list box cell&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.AddStyleAttribute(HtmlTextWriterStyle.Width, &lt;span style="color: #a31515"&gt;&amp;quot;40%&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.RenderBeginTag(HtmlTextWriterTag.Td);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesLabel != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesLabel.RenderControl(writer);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.WriteBreak();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.RenderControl(writer);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.RenderEndTag(); &lt;span style="color: green"&gt;// td tag&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.RenderEndTag(); &lt;span style="color: green"&gt;// tr tag&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.RenderEndTag(); &lt;span style="color: green"&gt;// table tag&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; Custom state management&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;override&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; LoadViewState(&lt;span style="color: blue"&gt;object&lt;/span&gt; savedState)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (savedState == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;base&lt;/span&gt;.LoadViewState(&lt;span style="color: blue"&gt;null&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Triplet t = savedState &lt;span style="color: blue"&gt;as&lt;/span&gt; Triplet;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (t != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Always invoke LoadViewState on the base class even if &lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// the saved state is null.&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;base&lt;/span&gt;.LoadViewState(t.First);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; ((t.Second) != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((IStateManager)ButtonStyle).LoadViewState(t.Second);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; ((t.Third) != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((IStateManager)ListBoxStyle).LoadViewState(t.Third);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Invalid view state .&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;override&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;object&lt;/span&gt; SaveViewState()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;object&lt;/span&gt; baseState = &lt;span style="color: blue"&gt;base&lt;/span&gt;.SaveViewState();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;object&lt;/span&gt; buttonStyleState = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;object&lt;/span&gt; textBoxStyleState = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (_buttonStyle != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buttonStyleState =&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((IStateManager)_buttonStyle).SaveViewState();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (_listBoxStyle != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; textBoxStyleState =&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((IStateManager)_listBoxStyle).SaveViewState();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;new&lt;/span&gt; Triplet(baseState,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buttonStyleState, textBoxStyleState);&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;override&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; TrackViewState()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;base&lt;/span&gt;.TrackViewState();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (_buttonStyle != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((IStateManager)_buttonStyle).TrackViewState();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (_listBoxStyle != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((IStateManager)_listBoxStyle).TrackViewState();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; Event Handlers&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; btnMoveAllRightToLeft_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (ListItem li &lt;span style="color: blue"&gt;in&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.Items.Contains(li) == &lt;span style="color: blue"&gt;false&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.Items.Add(li);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items.Clear();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; btnMoveSelectedRightToLeft_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListItem li = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; i = 0; i &amp;lt; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items.Count; i++)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; li = &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items[i];&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (li.Selected &amp;amp;&amp;amp; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.Items.Contains(li) == &lt;span style="color: blue"&gt;false&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.Items.Add(li);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; j = &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items.Count - 1; j &amp;gt;= 0; j--)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; li = &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items[j];&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (li.Selected) &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items.Remove(li);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; btnMoveSelectedLeftToRight_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListItem li = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; i = 0; i &amp;lt; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.Items.Count; i++)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; li = &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.Items[i];&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (li.Selected &amp;amp;&amp;amp; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items.Contains(li) == &lt;span style="color: blue"&gt;false&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items.Add(li);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; j = &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.Items.Count - 1; j &amp;gt;= 0; j--)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; li = &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.Items[j];&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (li.Selected) &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.Items.Remove(li);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; btnMoveAllLeftToRight_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (ListItem li &lt;span style="color: blue"&gt;in&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.Items)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items.Contains(li) == &lt;span style="color: blue"&gt;false&lt;/span&gt;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._selectedChoicesListBox.Items.Add(li);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;._availableChoicesListBox.Items.Clear();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;  &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a60183e4-5bf4-48dd-953b-50dc30be68bd" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Custom+Controls" rel="tag"&gt;Custom Controls&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Ajax.NET" rel="tag"&gt;Ajax.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ScriptManager" rel="tag"&gt;ScriptManager&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-9217498475011046147?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/9217498475011046147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/9217498475011046147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/9217498475011046147'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/aspnet-double-listbox-custom-control.html' title='An ASP.NET Double ListBox Custom Control: Step 1'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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/_uDhjHk-G--Y/Si0JsYgGylI/AAAAAAAAABU/PdIk9tCtl5w/s72-c/DoubleListBoxSample.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6094800596146935474.post-2541821678875918198</id><published>2009-06-04T08:47:00.001-07:00</published><updated>2009-06-04T09:48:03.938-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='video training'/><title type='text'>Sharepoint and Silverlight Video Lessons</title><content type='html'>&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:eeb01527-df2e-4069-8aeb-9b9308bc55e4" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Sharepoint" rel="tag"&gt;Sharepoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;Silverlight&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;I’ve become much more enthusiastic lately about video training for developers. I’ve gone over the Silverlight screencasts below, and I’m continuing to go through the Sharepoint videos also. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://silverlight.net/Learn/videocat.aspx?cat=10"&gt;Screencasts for Silverlight 2&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Kirk Evans Blog: Free SharePoint Developer Training" href="http://blogs.msdn.com/kaevans/archive/2009/03/15/point8020-com.aspx"&gt;Kirk Evans Blog: Free SharePoint Developer Training&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Video training is no substitute for going over the documentation on MSDN for these technologies, and certainly no substitute for setting up a personal development environment and plunging into actually doing some coding, even if it is only a tutorial application. Yet it does engage a person in a different learning pathway than simply reading does. Years ago I learned classic ASP development primarily through MSDN and working alongside other developers. I think that the time to learn would have been less if there had been these kinds of video clips available.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-2541821678875918198?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/2541821678875918198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/sharepoint-and-silverlight-video.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/2541821678875918198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/2541821678875918198'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/sharepoint-and-silverlight-video.html' title='Sharepoint and Silverlight Video Lessons'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-8431215246702610047</id><published>2009-06-04T08:05:00.001-07:00</published><updated>2009-06-04T09:50:54.230-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>SOA/WCF Design Pattern: The Request Class</title><content type='html'>&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:aa5669fc-8f2b-427a-8ed0-e9597ba9df00" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SOA" rel="tag"&gt;SOA&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WCF" rel="tag"&gt;WCF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Design+Patterns" rel="tag"&gt;Design Patterns&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;This is a design pattern which can simplify tremendously of the number of methods needed to get an entity and a series of entities which satisfy a number of parameters. &lt;/p&gt;  &lt;p&gt;For someone who comes from a structured programming background to an object oriented background, there is a tendency to specify and write a large number of methods based on different parameters to return an object or collection of objects which satisfy the specified criteria. Usually, though, this can be reduced to two methods: one which returns a single object based on an object ID and one which returns a collection of objects based on a single Request class.&lt;/p&gt;  &lt;p&gt;Most entities have some kind of ID property which corresponds to the primary key of a database table. This will often be either a GUID or an identity integer. This should be the basis of a single method which requests a single entity, such as the following &lt;strong&gt;GetCustomer&lt;/strong&gt; method.&lt;/p&gt; &lt;code&gt;   &lt;p&gt;Customer GetCustomer(System.Guid customerId)      &lt;br /&gt;{&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Customer customer = null;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //retrieve customer entity into customer class instance       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //retrieve any customer property collections into customer properties       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return customer;       &lt;br /&gt;}&lt;/p&gt; &lt;/code&gt;  &lt;p&gt;Rather than making a number of methods which provide various parameters, or a single large method with a number of parameters, the Request class contains the parameters in a single class. It returns a collection of the entity class. It is a simple Data Transfer Object (DTO) class; it contains data, not behavior. For example, the GetCustomers method would take a Customer Request class and return a collection of Customers. Here is a sample Customer Request class.&lt;/p&gt; &lt;code&gt;   &lt;p&gt;[DataContract]      &lt;br /&gt;public class CustomerRequest       &lt;br /&gt;{&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [DataMember]      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Name {get; set;}       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [DataMember]       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public bool Active {get; set;}       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Any other parameters &lt;/p&gt;    &lt;p&gt;}&lt;/p&gt; &lt;/code&gt;  &lt;p&gt;Usually these parameters can be passed to a single SQL stored procedure or LINQ to SQL statement. Of course, to avoid SQL injection attacks, these parameters must never be concatenated inside a SQL ‘WHERE’ clause. (It’s amazing how this deprecated and insecure technique continues inside some code samples.) Rather, if necessary, the SQL statement can be concatenated with parameter placeholders which are appropriate to the RDBMS, and then the parameters can be passed in in a type safe manner.&lt;/p&gt;  &lt;p&gt;One limitation of this pattern is that it’s difficult to use it to check for a null values in any of the database columns for any of the parameters, though usually there are very few requirements that would entail needing to code this kind of functionality. &lt;/p&gt;  &lt;p&gt;In an actual WCF implementation, I would also recommend combining this pattern with an implementation of the Enterprise Library Validation block, and that validation attributes would be applied to the&amp;#160; DataMember attributes. This would save the need to write a custom WCF ParameterInspector or MessageInspector for the class. It would, moreover, provide additional defense in depth security from malicious input for the service layer of the multitier application, as parameterized stored procedures and SQL statements would provide for the database layer.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-8431215246702610047?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/8431215246702610047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/soawcf-design-pattern-request-class.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/8431215246702610047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/8431215246702610047'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/soawcf-design-pattern-request-class.html' title='SOA/WCF Design Pattern: The Request Class'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-7799053221308296295</id><published>2009-06-04T07:46:00.001-07:00</published><updated>2009-06-08T13:58:50.654-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>In Praise of Prototypes</title><content type='html'>&lt;p&gt;On a number of project I’ve been on, much time and effort could be saved if there were more attention given to making a prototype. &lt;/p&gt;  &lt;p&gt;Below are the two types of prototypes that I’ve generally advocated and used throughout the course of my development experience. Many projects which got into trouble fairly far down the road might have ended quicker, on time and with the required functionality if they had taken some time to do a prototype first.&lt;/p&gt;  &lt;h3&gt;1. The throwaway prototype.&lt;/h3&gt;  &lt;p&gt;This is the prototype which is used simply as an experiment. Not much attention is paid to making the code on these prototypes very pretty. Some of the connections to other systems may simply be stubs. Yet they are invaluable, especially in the early phases of a project. They can help avoid some nasty surprises later in the project as well as validate the intended implementation of the application.&lt;/p&gt;  &lt;p&gt;This kind of prototype is most useful for exploring:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Compatibility between different types of components.&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Often organizations may build an application with components from different vendors, or a combination of vendor supplied and internally developed components and component adapters and bridges. Before a commitment is made to any one component as a part of the final application, it needs to be compared for compatibility with the other components in a prototype. This prototype should contain functionality comparable to that of the intended application to make sure that all functionality which needs to be compatible is compatible.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Comparing different kinds of implementations and architectures.&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Sometimes the choice is between .NET and J2EE, or some other kind situation where there is a reason to go with one kind of architecture, platform or implementation. Or, these kinds of prototypes could compare an implementation in Silverlight, traditional ASP.NET, or Sharepoint for an Intranet application.Sometimes the implementation for an application is actually chosen on the basis of the skillset of whatever programmers – whatever the programmers are familiar with, like or want to learn -- are available for the project, rather than on whether the implementation is robust, scalable, secure and maintainable. These kinds of prototype can give indication as to which implementation can provide a faster delivery date and future extensibility. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Comparing different types of vendor products. &lt;/strong&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This is the kind of prototype that the vendors generally hate the most, but it actually gives a great indication as to which product is the best fit. It’s actually rarely done during the evaluation of a product, but it would help to avoid projects to implement a ‘road apple’ product with a great salesman. Simply develop a small prototype in each product, and submit it to manual testing and stress and performance testing, and let the product which produces the desired functionality with the quickest delivery time, scalability, maintainability, extensibility, usability and performance wins.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;A model for code generation.&lt;/strong&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This prototype would be a model of the basic tiers and architecture of an application but with only a subset of the required functionality. This prototype would then be the model for the output of a code generator for the project. The model application is actually the first step that should be taken, for the most part, prior to building a code generator to automate building the boilerplate and repetitive code for an application. The repetitive code could be identified more easily, and, in the case of .NET, moved into partial, generated classes.&lt;/p&gt;  &lt;h3&gt;2. The evolutionary prototype.&lt;/h3&gt;  &lt;p&gt;This kind of prototype is a necessity for multitier, complex application. Unfortunately, sometimes organizations attempt to build a multitier application one tier at a time, and then connect them toward the end of the project. There was a well known debacle by a major corporation about a decade ago which attempted this path. Since then, the conventional wisdom has been to build a prototype which exercises a small subset of the functionality but goes from end to end, through each tier, and then build out to final product. This validates the basic design of the tiers and identifies possible bottlenecks along the way.&lt;/p&gt;  &lt;p&gt;One thing which does need to be done in this case: the project should keep a copy of original or release level prototype in source control. This original copy can usually be morphed into a throwaway prototype and used in side projects for testing requested changes and additional functionality and exploring newly proposed techniques&lt;/p&gt;  &lt;p&gt;There is a third kind of prototype which has never been used on any project that I’ve been on, though I believe that its use could have clarified requirements and shortened project delivery times: &lt;strong&gt;&lt;em&gt;the paper prototype&lt;/em&gt;&lt;/strong&gt;. Jakob Nielsen has advocated this type often, and definitely usability would come about more quickly and easily if this type were pursued.&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:81158f78-5d77-4c91-a50f-dff30d906fed" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/prototype" rel="tag"&gt;prototype&lt;/a&gt;,&lt;a href="http://technorati.com/tags/software+development" rel="tag"&gt;software development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/projects" rel="tag"&gt;projects&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ntier+architecture" rel="tag"&gt;ntier architecture&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-7799053221308296295?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/7799053221308296295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/in-praise-of-prototypes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/7799053221308296295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/7799053221308296295'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/06/in-praise-of-prototypes.html' title='In Praise of Prototypes'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-1790470514941098032</id><published>2009-05-28T07:15:00.001-07:00</published><updated>2009-06-04T10:01:57.778-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding Standards'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>Suggested ASP.NET Secure Coding Standards and Guidelines</title><content type='html'>&lt;p&gt;Often I find when I go to a new project as a consultant, that there is some need for education, standards and guidelines for secure coding practices. Here are a set of sample guidelines that I put together on a recent project. As before, these can be updated, expanded and modified as the need arises.&lt;/p&gt;  &lt;p&gt;General:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Validate user input for text length, data type and correct pattern. Use regular expressions to check for correctly formatted input. Enforce correct input rather than trying to filter out incorrect patterns. Data validation is a secure coding practice as well as an application coding best practice. This includes both server side .NET code and client side Javascript, and any source which a malicious user or malicious code intercept and malign. &lt;/li&gt;    &lt;li&gt;Do not let sensitive application or database implementation information be returned to the user in error messages. &lt;/li&gt;    &lt;li&gt;Make sure that the production builds are in release mode and that no debugging information (.PDB) files are released to the production environment. &lt;/li&gt;    &lt;li&gt;Remove or hide buttons rather than disabling them since it is possible for a malicious user to generate a postback through a disabled button (elevation of privileges attack). &lt;/li&gt;    &lt;li&gt;Review URLs in code for proper direction to HTTPS for SSL before pages are moved to production. &lt;/li&gt;    &lt;li&gt;Avoid passing information between pages through query strings and hidden form fields since these can be exploited by malicious users. Use session state to pass information between pages and viewstate to pass information back to the same page between postbacks. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Code Access Security:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Review code for appropriate implementation of code access permissions. &lt;/li&gt;    &lt;li&gt;Avoid use of SecurityAction.Assert in production code. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Authorization &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Run any authentication or authorization code on all page requests, including postbacks. Use code like this (move this to a base page or master page class if possible): &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;protected void Page_Load(object sender, EventArgs e)&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;RunSecurityMethod();&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;Do not produce code like this:&lt;/p&gt;  &lt;p&gt;protected void Page_Load(object sender, EventArgs e)&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;&lt;b&gt;if(this.IsPostback == false)&lt;/b&gt; RunSecurityMethod();&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Review code for appropriate implementation of user authorization and authentication. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Cross site scripting attacks:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Make sure that any user input which is echoed back to the web page is HTML encoded (HttpServerUtility.HtmlEncode method) or URL encoded (HttpServerUtility.URLEncode) to avoid Cross Site Scripting attacks. This can also include situations where the user input is saved to a database, retrieved from the database and displayed in a web page. &lt;/li&gt;    &lt;li&gt;Make sure that each HTTP request is validated through ASP.NET request validation. The default for the machine.config file should be: &amp;lt;pages validateRequest=&amp;quot;true&amp;quot; ... /&amp;gt;. &lt;/li&gt;    &lt;li&gt;Consider including the Microsoft Cross Site Scripting Library to sanitize data from users and any other outside sources. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Cross-site request forgery (one-click attack):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Make sure that each page sets the ViewStateUserKey value (preferably through a base page class derived from System.Web.UI.Page or a master page). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;protected override OnInit(EventArgs e) &lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;base.OnInit(e); &lt;/p&gt;  &lt;p&gt;ViewStateUserKey = Session.SessionID;&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;SQL Injection Attacks:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Avoid string concatenation to form SQL strings. &lt;/li&gt;    &lt;li&gt;Prefer parameterized stored procedures to dynamic SQL. &lt;/li&gt;    &lt;li&gt;Avoid dynamic SQL inside stored procedures. &lt;/li&gt;    &lt;li&gt;If dynamic SQL is absolutely necessary, use parameters with a constructed string rather than string concatenation. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Encryption:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Do not create your own algorithms for encryption. &lt;/li&gt;    &lt;li&gt;Do not use DES or MD5 for encryption since these are known to be breakable. They were included in .NET primarily for backward compatibility. &lt;/li&gt;    &lt;li&gt;Use only an industry standard encryption algorithm known to be practically unbreakable. &lt;/li&gt;    &lt;li&gt;Use secure storage for all private encryption keys and certificates. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Password storage:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Store a generated hash of a password rather than a password itself. &lt;/li&gt;    &lt;li&gt;Do not store or send a password over a network connection in clear text. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Tracing: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Make sure that ASP.NET tracing is not enabled for remote tracing via trace.axd in the web.config file when an application is moved to a production server. &lt;/li&gt;    &lt;li&gt;Make sure no sensitive information revealed in Trace statements since traces can be turned on easily in configuration files. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Configuration files:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Do not store sensitive information such as database connection strings in configuration files except in an encrypted section. &lt;/li&gt;    &lt;li&gt;Make sure that any WCF services do not enable or expose metadata exchange endpoints in a production web.config file. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Code reviews:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Review code for security vulnerabilities during all formal and informal code reviews. &lt;/li&gt;    &lt;li&gt;Review code for Code Access Security permissions during formal and informal code reviews for whether there are more needed, and whether any there need to be more or less restrictive. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For more see: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/security/default.aspcx"&gt;MSDN Security Developer Center&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms998408.aspx"&gt;patterns &amp;amp; practices Security Guidance for Applications&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook.HomePage"&gt;The .NET Developer's Guide to Windows Security (Keith Brown: online reference)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/michael_howard/"&gt;Michael Howard's Web Log&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.esecurityplanet.com/"&gt;eSecurity Planet&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.owasp.org/index.php/Main_Page"&gt;The Open Web Application Security Project (OWASP)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.securecoding.cert.org/confluence/display/seccode/Top+10+Secure+Coding+Practices"&gt;Top 10 Secure Coding Practices&lt;/a&gt;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e1ad059e-b941-4251-a298-484339c4b0ed" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/secure+coding" rel="tag"&gt;secure coding&lt;/a&gt;,&lt;a href="http://technorati.com/tags/coding+standards" rel="tag"&gt;coding standards&lt;/a&gt;,&lt;a href="http://technorati.com/tags/software+development" rel="tag"&gt;software development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-1790470514941098032?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/1790470514941098032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/suggested-aspnet-secure-coding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/1790470514941098032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/1790470514941098032'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/suggested-aspnet-secure-coding.html' title='Suggested ASP.NET Secure Coding Standards and Guidelines'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-7575634080650837438</id><published>2009-05-28T05:36:00.001-07:00</published><updated>2009-05-28T05:36:43.597-07:00</updated><title type='text'>Suggested Standards and Guidelines for Error and Exception Handling</title><content type='html'>&lt;p&gt;Here are a set of basic suggestions that I put together for a client for error and exception handling on a multitier ASP.NET project with Visual Studio 2008/ .NET 3.5 SP1.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Basic Needs for Error / Exception Handling&lt;/b&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Flexible framework to log exception details in a way in which developers and support staff can find the information relevant to troubleshooting and fixing the problems. &lt;/li&gt;    &lt;li&gt;Coding standard to establish a consistent method to provide user friendly error messages while avoiding disclosing implementation details as a security risk. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Framework /Library Alternatives:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Alternative 1: Microsoft Enterprise Library 4.1 Exception Handling Block&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Targeted .NET Framework: 3.5 SP1&lt;/p&gt;  &lt;p&gt;Advantages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Free &lt;/li&gt;    &lt;li&gt;Easy to use &lt;/li&gt;    &lt;li&gt;Source code examples readily available &lt;/li&gt;    &lt;li&gt;Logs information to a variety of destinations such as the event log, files or a database &lt;/li&gt;    &lt;li&gt;Highly configurable &lt;/li&gt;    &lt;li&gt;Comes with configuration utility &lt;/li&gt;    &lt;li&gt;Externally maintained by Microsoft Patterns and Practices Team &lt;/li&gt;    &lt;li&gt;Documented and packaged with other Enterprise Library components &lt;/li&gt;    &lt;li&gt;Documentation integrated with Visual Studio / MSDN documentation &lt;/li&gt;    &lt;li&gt;Specifically targeted for the .NET 3.5 SP1 platform &lt;/li&gt;    &lt;li&gt;Incorporates additional functionality for WCF error handling and logging (note the section in the Enterprise Library documentation, ‘Integrating the Logging Application Block with WCF Applications’) &lt;/li&gt;    &lt;li&gt;Able to customize &lt;/li&gt;    &lt;li&gt;Familiar to many .NET developers &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Disadvantages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Requires some experimentation and prototyping to understand its functionality. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Alternative 2: Log4Net:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Targeted .NET Framework: 2.0&lt;/p&gt;  &lt;p&gt;Advantages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Free &lt;/li&gt;    &lt;li&gt;Easy to use &lt;/li&gt;    &lt;li&gt;Logs information to a variety of destinations &lt;/li&gt;    &lt;li&gt;Highly configurable &lt;/li&gt;    &lt;li&gt;Source code examples readily available &lt;/li&gt;    &lt;li&gt;Externally maintained by open source community &lt;/li&gt;    &lt;li&gt;Able to customize &lt;/li&gt;    &lt;li&gt;Familiar to many .NET developers &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Disadvantages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Targets earlier version of the framework &lt;/li&gt;    &lt;li&gt;Does not incorporate additional functionality for WCF error handling and logging &lt;/li&gt;    &lt;li&gt;No configuration utility &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Alternative 3: Internally developed component(s):&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Advantages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Primarily when necessary to meet any internal standards which cannot be met with a free or open source framework. &lt;/li&gt;    &lt;li&gt;Internal code maintenance not at the mercy of external corporations or developers. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Disadvantages:&lt;/p&gt;  &lt;p&gt;· Cost in time and money for internal development and maintenance&lt;/p&gt;  &lt;p&gt;· Learning curve for new hires and external resources&lt;/p&gt;  &lt;p&gt;· May reflect personal preferences and “blind spots” of internal developers&lt;/p&gt;  &lt;p&gt;· May open up security holes unless carefully reviewed&lt;/p&gt;  &lt;p&gt;· May not be transferable to later projects&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Suggested common sense coding standards for exception and error handling:&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Avoid ‘eating exceptions’ (catching an exception in an empty block): &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;try&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;// my cool code goes here&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;catch{} // I can’t find out or fix what happens here in production&lt;/p&gt;  &lt;p&gt;// errors may still propagate up the call stack and the user&lt;/p&gt;  &lt;p&gt;// may have a mysterious failure to deal with&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Use a ‘finally { } ‘ or a ‘using . . . { } ‘ block to dispose of unmanaged resources when an exception occurs. &lt;/li&gt;    &lt;li&gt;Log exceptions where possible, especially if the error condition indicates a network, database or file I/O problem. &lt;/li&gt;    &lt;li&gt;Log exception information such as the call stack and any associated input data along with user information. &lt;/li&gt;    &lt;li&gt;Throw exceptions to indicate error conditions rather than returning error codes, since error codes are rarely documented well enough for future maintenance and troubleshooting. &lt;/li&gt;    &lt;li&gt;Return null rather than throwing an exception if an expected object cannot be returned from a method, since testing for null in an if statement is usually less expensive than handling exceptions. &lt;/li&gt;    &lt;li&gt;Do not use exceptions for control flow. Check for null and error conditions with if and switch statements rather than throwing or catching exceptions. &lt;/li&gt;    &lt;li&gt;Use correct exception classes for throwing exceptions, such as ArgumentNullException if a null reference is passed as a parameter to a method and ArgumentException if a parameter passed to a method is otherwise invalid. &lt;/li&gt;    &lt;li&gt;Include information in any exceptions thrown to indicate the cause and correction for the exception. &lt;/li&gt;    &lt;li&gt;Derive new exception classes from System.Exception. Microsoft has deprecated the previously recommended practice of deriving new exception classes from System.ApplicationException. &lt;/li&gt;    &lt;li&gt;Error messages displayed to the user should suggest a possible correction if possible. &lt;/li&gt;    &lt;li&gt;Seek to return the application after an exception to a state where the user can continue or correct his or her previous action rather than force the user to start all over again. &lt;/li&gt;    &lt;li&gt;Use standard validation techniques as much as possible to correct user input rather than throwing exceptions. &lt;/li&gt;    &lt;li&gt;Incorporate a generic exception handling method in base classes that performs the standard method of handling and logging exceptions, such as a in a base web page or master page class. &lt;/li&gt;    &lt;li&gt;Incorporate an exception building method that returns the desired exception in classes which throw exceptions. &lt;/li&gt;    &lt;li&gt;Provoke exceptions during unit, integration and system testing to determine application security and robustness. &lt;/li&gt;    &lt;li&gt;For web pages, include error and exception handling in client side Javascript so that it ‘fails gracefully’ if something undesirable happens. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Recommendations:&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Implement the Exception Handling Block of Enterprise Library 4.1, and establish Exception Handling Policies for DataAccessExceptions, SqlExceptions, SecurityExceptions, WCF FaultExceptions and WCF CommunicationExceptions. If the Enterprise Library Validation Block is used, add an exception policy also for ValidationException. &lt;/li&gt;    &lt;li&gt;Consider logging error information to a centralized store. The alternatives with the Enterprise Library are to use the Database Trace Listener to log error information to a database or the MSMQ Trace Listener with the MSMQ Distributor Service with the Logging Application Block to log error information to a central store through an MSMQ queue. Log4Net contains database logging functionality. &lt;/li&gt;    &lt;li&gt;If the Enterprise Library Database Trace Listener is used, add an event listener for the event log or a flat file, and, optionally, an email listener for the Logging Errors and Warnings category under special sources to catch any errors that cannot be logged to the database. &lt;/li&gt;    &lt;li&gt;Establish coding standards for exception handling at each tier / layer of the application. &lt;/li&gt;    &lt;li&gt;Consider deriving application specific exception classes to wrap exceptions that get thrown. Examples: MyAppException, MyAppFaultException (for WCF errors), and MyAppClientException(for ASP.NET errors). These could be used for specific exception handling routines. &lt;/li&gt;    &lt;li&gt;Document the error logging method and location of error information for ongoing application maintenance and support staff. &lt;/li&gt;    &lt;li&gt;Consider using an exception handling and logging library that can send notifications through email to maintenance and support staff for severe errors. Both Enterprise Library and Log4Net contain this functionality. Homegrown logging solutions sometimes expose too much email functionality which can be exploited by malicious users (whether internal or external). &lt;/li&gt;    &lt;li&gt;Avoid internal development, maintenance and customization of exception handling and logging libraries unless the need is overwhelming. &lt;/li&gt;    &lt;li&gt;Provide a method to handle and log all uncaught exceptions at the ASP.NET and WCF levels. Handle the Application_Error event in Global.asax for ASP.NET pages and implement IErrorHandler at the WCF level. The ASP.NET error page should display a user friendly explanation of what happened. &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-7575634080650837438?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/7575634080650837438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/suggested-standards-and-guidelines-for_28.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/7575634080650837438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/7575634080650837438'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/suggested-standards-and-guidelines-for_28.html' title='Suggested Standards and Guidelines for Error and Exception Handling'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-7346612821516620858</id><published>2009-05-26T14:43:00.001-07:00</published><updated>2009-06-04T10:35:36.366-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='contracting'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='Negotiation'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>Lessons in Building Unconditionally Constructive Working Relationships</title><content type='html'>&lt;p&gt;Roger Fisher and Scott Brown, &lt;u&gt;Getting Together: Building Relationships As We Negotiate.&lt;/u&gt; New York: Penguin Books, 1989. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Summary:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;In working relations and human relations in general there is considerable confusion as to what constitutes a good relationship in practical terms. Too often a good working relationship is considered in terms of agreement, approval or having shared values instead of good substantive outcomes that leave the concerned parties emotionally at ease and where differences have been effectively dealt with. Relationship is a process itself separate from its outcomes, and rather is to be pursued on its own merits. &lt;/p&gt;  &lt;p&gt;As a process, it is possible to implement a definite strategy to foster good working relationships. The definition of the strategy itself is so concise and striking, it bears full citation:&lt;/p&gt;  &lt;blockquote&gt;   &lt;h4&gt;An Unconditionally Constructive Strategy&lt;/h4&gt;    &lt;p&gt;Do only those things that are both good for the relationship and good for us, whether or not they reciprocate.&lt;/p&gt;    &lt;p&gt;1. &lt;b&gt;Rationality.&lt;/b&gt; Even if they are acting emotionally,&lt;b&gt; balance emotions with reason.&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;2. &lt;b&gt;Understanding.&lt;/b&gt; Even if they misunderstand us, &lt;b&gt;try to understand them.&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;3. &lt;b&gt;Communication.&lt;/b&gt; Even if they are not listening, &lt;b&gt;consult them before deciding&lt;/b&gt; on matters that affect them.&lt;/p&gt;    &lt;p&gt;4. &lt;b&gt;Reliability.&lt;/b&gt; Even if they are trying to deceive us, neither trust them nor deceive them; &lt;b&gt;be reliable.&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;5. &lt;b&gt;Noncoercive mode of influence.&lt;/b&gt; Even if they are trying to coerce us, neither yield to coercion nor try to coerce them; &lt;b&gt;be open to persuasion and try to persuade them.&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;6. &lt;b&gt;Acceptance.&lt;/b&gt; Even if they reject us and our concerns are unworthy of their consideration, &lt;b&gt;accept them as worthy of our consideration, care about them, and be open to learning from them.&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;Roger Fisher and Scott Brown, &lt;u&gt;Getting Together: Building Relationships As We Negotiate&lt;/u&gt; (New York: Penguin Books, 1989), p.38&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;These guidelines are ‘unconditionally constructive’ because they can be good both for the relationship and the person or party that follows them regardless of whether the other side follows these same guidelines.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Rationality.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Even if they are acting emotionally,&lt;b&gt; balance emotions with reason.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;A proper working relationship means a realization that each one involved, including oneself, ‘the party of the first part,’ is a human being that is both rational and emotional, and that both these aspects need to be balanced. Emotions need to be understood and acknowledged as part of the working relationship, and harnessed to provide motivation and deepen mutual understanding, but not allowed to become so strong that they cloud the judgment one’s own judgment. This will help to deal with the conflicts and problems that may occur.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Understanding.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Even if they misunderstand us, &lt;b&gt;try to understand them.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Understanding differences is necessary to understand them. This means seeking constantly to learn more about the interests, perceptions, concerns and values of the others involved in the relationship. It requires the strength to be able to change one’s preconceptions and views during the course of the relationship, and to seek to understand the choices before the others who are involved.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Communication.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Even if they are not listening, &lt;b&gt;consult them before deciding&lt;/b&gt; on matters that affect them&lt;/i&gt;.&lt;/p&gt;  &lt;p&gt;Communication is not necessarily an indication of shared values, mutual approval or even friendship, and good communication is more necessary the less of any of these influence the relationship. Ineffective communication is no communication, one sided communication, or inconsistent communication (“mixed messages”). Effective communication means:&lt;/p&gt;  &lt;p&gt;· Always consult before deciding. This does not mean an abdication of personal authority or responsibility but rather sharing necessary information.&lt;/p&gt;  &lt;p&gt;· Listen effectively. &lt;/p&gt;  &lt;p&gt;· Plan the communication to minimize inconsistent communication.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Reliability.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Even if they are trying to deceive us, neither trust them nor deceive them; &lt;b&gt;be reliable&lt;/b&gt;&lt;/i&gt;&lt;b&gt;.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;This takes personal trust and/or suspicion out of the process, and shifts the goal to pursue personal reliability and an accurate assessment of the risks of relying on the other person. A history of erratic, careless, deceptive and dishonest conduct is at the root of distrust; predictability, clarity, honesty and taking promises seriously builds trustworthiness and demonstrates reliability. A reliance on ‘pure trust’ in dealing with others will require legitimate actions to reduce risk, granting trust where it has been earned, fair and precise giving of praise and blame, and treating incidents of unreliability as a ground for changing one’s own actions as well as the other person’s actions. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Noncoercive mode of influence.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Even if they are trying to coerce us, neither yield to coercion nor try to coerce them; &lt;b&gt;be open to persuasion and try to persuade them.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Coercion damages working relationships and the quality of agreements for the long term, which is the opposite of attempting to build a long term working relationship. Coercive tactics include personal attacks, treating the negotiation as a win/lose contest, taking a hard and fast position, narrowing options to ‘either/or’, trying to break the will of the other side, and making threats. The persuasive tactics are to attack the problem, treat negotiation as problem solving, to remain open to persuasion and to explore interests, to invent multiple mutually advantageous options, deal with what is fair, and to improve one’s own BATNA.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Acceptance.&lt;/i&gt;&lt;/b&gt;&lt;i&gt; Even if they reject us and our concerns are unworthy of their consideration, &lt;b&gt;accept them as worthy of our consideration, care about them, and be open to learning from them.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Rejection creates psychological obstacles to an effective working relationship; rather the need is a willingness to deal with the other person, treat him or her with respect, give the other person’s interests the weight that they deserve, and treat the other person as a equal as a human being.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Applying the Lessons to Working in IT:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Rationality.&lt;/b&gt; Even if they are acting emotionally,&lt;b&gt; balance emotions with reason.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· Since working on a project can mean assessing and evaluating the output of others, it can come up against emotional reactions from others in IT. It is therefore often necessary for the person involved to be the most rational and understanding person involved in the process. &lt;/p&gt;  &lt;p&gt;· There is also the potential for emotional reactions from others if there are unexpected indications of poor quality on the project or overly optimistic evaluations of the quality of a project. Again, follow the lesson here.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Understanding.&lt;/b&gt; Even if they misunderstand us, &lt;b&gt;try to understand them.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· Those involved in the software testing process can themselves be misunderstood and have their motives and objectives misunderstood. There is always a good possibility of being misunderstood by others on the project team as meddlers and nitpickers. The goal is to work past this and to understand what the project team is actually trying to accomplish, and be a part of this effort.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Communication.&lt;/b&gt; Even if they are not listening, &lt;b&gt;consult them before deciding&lt;/b&gt; on matters that affect them.&lt;/p&gt;  &lt;p&gt;· Constant communication and consultation is necessary throughout the process of testing with others on the project team. Often decisions are made along informal networks by those who have been working together for years. Still, the goal should be in the testing process to involve those who will be affected by testing decisions before those decisions are final.&lt;/p&gt;  &lt;p&gt;· This is contrary to a ‘do it first, then ask permission’ way of doing things in an organization. This minimizes the long term and often negative consequences of leaving people who are significantly impacted by decisions and actions out of the path of influencing those decisions and actions.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Reliability.&lt;/b&gt; Even if they are trying to deceive us, neither trust them nor deceive them; &lt;b&gt;be reliable.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· Reliability should be a normal qualification and method of operation for anyone involved in software testing or test consultation, or development for that matter.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· Reliability includes basic honesty.&lt;/p&gt;  &lt;p&gt;· Reliability is the basis for future respect and being treated as trustworthy.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Noncoercive mode of influence.&lt;/b&gt; Even if they are trying to coerce us, neither yield to coercion nor try to coerce them; &lt;b&gt;be open to persuasion and try to persuade them.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· One person may describe his own style of communication as persuasive, but the subjects of that communication style may call it more coercive. The truth is more often in the eye of the beholder in this instance. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Acceptance.&lt;/b&gt; Even if they reject us and our concerns are unworthy of their consideration, &lt;b&gt;accept them as worthy of our consideration, care about them, and be open to learning from them.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· Being always open and ready to undertake an effective working relationship with others despite their previous behavior toward us is a sign of strength and confidence that others will respect. At the end of the day, the people we all work with are still people, and as such deserve this kind of quality treatment.&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2316150d-53fa-4b0e-a8be-862ace078ac8" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Negotiation" rel="tag"&gt;Negotiation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IT+Management" rel="tag"&gt;IT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/team+development" rel="tag"&gt;team development&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-7346612821516620858?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/7346612821516620858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/lessons-in-building-unconditionally.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/7346612821516620858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/7346612821516620858'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/lessons-in-building-unconditionally.html' title='Lessons in Building Unconditionally Constructive Working Relationships'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-4814409901316402182</id><published>2009-05-26T14:39:00.001-07:00</published><updated>2009-06-04T10:34:00.002-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='contracting'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='Negotiation'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>Lessons in Lateral Leadership</title><content type='html'>&lt;p&gt;Roger Fisher and Alan Sharp, &lt;u&gt;Getting It Done: How to Lead When You’re NOT in Charge&lt;/u&gt;. HarperCollins Publishers, New York 1999.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Summary:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The goal of this book is to define ways to produce high quality results through collaboration by &lt;b&gt;lateral leadership&lt;/b&gt;. Lateral leadership is not guiding by superior authority but rather is inviting colleagues to work with you to solve problems. &lt;/p&gt;  &lt;p&gt;The primary guidelines are handled under a three step method to improve oneself first and then to guide others to change:&lt;/p&gt;  &lt;p&gt;· Organize and sharpen your personal skills at getting things done by yourself.&lt;/p&gt;  &lt;p&gt;· Understand clearly your strategic goal of getting things done with others.&lt;/p&gt;  &lt;p&gt;· Develop some tactics of participatory leadership.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;DEVELOP PURPOSE. &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· Sharpen your purpose: develop a purpose that motivates and guides you, in terms of results to be achieved. Formulate immediate objectives, mid range goals and a long term vision. &lt;/p&gt;  &lt;p&gt;· Everyone helps formulate a set of results to achieve together.&lt;/p&gt;  &lt;p&gt;· Lead in improving setting the purpose in your own organization. Find out the organizational purpose and the reasons for it, and find ways to make them focused and tangible.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;THINK SYSTEMATICALLY.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· Develop a personal framework for organized and clear thinking. Look for information that helps make decisions. Rather than react to symptoms, step back and look for causes. Invent creative approaches to different situations.&lt;/p&gt;  &lt;p&gt;· Clarify a vision of collaborative, systematic thinking.&lt;/p&gt;  &lt;p&gt;· Stimulate others to think systematically.&lt;/p&gt;  &lt;h3&gt;&lt;i&gt;&lt;/i&gt;&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;INTEGRATE THINKING WITH DOING.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· Follow a sequence of “Prepare -&amp;gt; Act -&amp;gt; Review,” to learn from experience.&lt;/p&gt;  &lt;p&gt;· Prepare and review together for a group learning experience. &lt;/p&gt;  &lt;p&gt;· Help your colleagues learn from experience.&lt;/p&gt;  &lt;p&gt;OFFER EVERYONE A CHALLENGING ROLE.&lt;/p&gt;  &lt;p&gt;· Reframe your job to include engaging challenges. Find opportunities to use your best skills, take time to contribute, even when it’s not your job, and expand your job to include things that aren’t being done.&lt;/p&gt;  &lt;p&gt;· Clarify a vision of everyone becoming fully engaged. Assume that contributing ideas is everyone’s job, share responsibility for dividing work, frame the success of the whole project as everyone’s responsibility.&lt;/p&gt;  &lt;p&gt;· Foster a climate that invites engagement of everyone in the projects, initiatives and group tasks.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;EXPRESS APPRECIATION AND OFFER CONSTRUCTIVE FEEDBACK.&lt;/i&gt;&lt;/b&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Learn how to offer supportive feedback. Express appreciation to motivate, offer advice to improve performance, evaluate against the performance of others only when needed to make a personnel decision.&lt;/p&gt;  &lt;p&gt;· Clarify a vision of mutual support and coaching: “Appreciation makes everyone perform better. Seeking coaching is a sign of competence. Anyone can coach anyone.”&lt;/p&gt;  &lt;p&gt;· Encourage others to offer feedback in ways that are helpful.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Applying the Lessons to Working in IT:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;DEVELOP PURPOSE.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Internalize your own reasons for the job role you’re in, in terms of the results that you wish to accomplish, and be able to articulate them.&lt;/p&gt;  &lt;p&gt;· Internalize the goals and objectives for your organization in terms of desired results, and relate your job goals and objectives to them. Draw the connections yourself. Use the connections during project consultation.&lt;/p&gt;  &lt;p&gt;· Ask intelligent questions about the larger reasons why things are being done the way they are being done, in terms of desired and expected results, rather than established routines.&lt;/p&gt;  &lt;p&gt;· Work with others to relate their projects, roles, goals and objectives to the larger organizational goals by asking the intelligent questions to them in a non threatening manner.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;THINK SYSTEMATICALLY.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· Research IT problems from both a technical and organizational (“process”) perspective. &lt;/p&gt;  &lt;p&gt;· Develop a personal systematic troubleshooting (“root cause analysis”) methodology to identify, formulate and articulate solutions to problems encountered.&lt;/p&gt;  &lt;p&gt;· Articulate how to troubleshoot problems efficiently and effectively, and encourage others to work problems through systematically.&lt;/p&gt;  &lt;p&gt;· Develop a personal technical analysis methodology to examine I/S initiatives, improvements and solutions for corporate benefits, possible pitfalls, unexplored risks, and possible improvements.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;strong&gt;INTEGRATE THINKING WITH DOING.&lt;/strong&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Prepare thoroughly but not excessively for ‘action.’ Remember that ‘doing’ can be written and oral communication with others as well as technical ‘hands on’ tasks. Formulate a desired result, consider the task in light of the others who will be or could be evaluating the result, and evaluate the probable effectiveness of the preparation throughout the course of the preparation.&lt;/p&gt;  &lt;p&gt;· Execute the planned actions skillfully.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;strong&gt;OFFER EVERYONE A CHALLENGING ROLE.&lt;/strong&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Take the initiative yourself to look beyond the routine responsibilities of your own job roles to include more challenging responsibilities.&lt;/p&gt;  &lt;p&gt;· Look beyond personal and social compatibilities to organizational synergies in working with technical teams.&lt;/p&gt;  &lt;p&gt;· Look for important but overlooked tasks that may be vital to the success of the team effort, and take the initiative to achieve those.&lt;/p&gt;  &lt;p&gt;· Assist the less forthright and articulate members to express their thoughts and take action, so that their contributions may be recognized.&lt;/p&gt;  &lt;p&gt;· Arrange so that all team members both take responsibility and take credit for the result of the team’s goals.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;strong&gt;EXPRESS APPRECIATION AND OFFER CONSTRUCTIVE FEEDBACK.&lt;/strong&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Look at the validity of information and direction rather than the authority level or position in the hierarchy of the source.&lt;/p&gt;  &lt;p&gt;· Express genuine appreciation for help offered and rendered.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;· Encourage others to accept valid information and direction and offer genuine appreciation.&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9981b7b8-1dde-4d84-9069-a810babe4d25" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Negotiation" rel="tag"&gt;Negotiation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IT+Management" rel="tag"&gt;IT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/team+development" rel="tag"&gt;team development&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-4814409901316402182?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/4814409901316402182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/lessons-in-lateral-leadership.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/4814409901316402182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/4814409901316402182'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/lessons-in-lateral-leadership.html' title='Lessons in Lateral Leadership'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-3977598930205911305</id><published>2009-05-26T14:33:00.001-07:00</published><updated>2009-06-04T10:32:45.983-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='contracting'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='Negotiation'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>Lessons in Breakthrough Negotiation</title><content type='html'>&lt;p&gt;William Ury, &lt;u&gt;Getting Past No: Negotiating Your Way from Confrontation to Cooperation.&lt;/u&gt; New York: Bantam Books, 1993.&lt;/p&gt;  &lt;p&gt;Summary:&lt;/p&gt;  &lt;p&gt;Negotiation, whether informal or formal, can be tough. There are primarily five real world barriers to cooperation:&lt;/p&gt;  &lt;p&gt;· Your own reaction to attack and attempts at exploitation.&lt;/p&gt;  &lt;p&gt;· The other side’s anger, hostility, fear and distrust.&lt;/p&gt;  &lt;p&gt;· The other side’s rigid adherence to their position.&lt;/p&gt;  &lt;p&gt;· The other side’s unwillingness to reach a mutually satisfactory agreement.&lt;/p&gt;  &lt;p&gt;· The other side’s determination to win as a demonstration of power.&lt;/p&gt;  &lt;p&gt;The strategy to break through these barriers are these five steps:&lt;/p&gt;  &lt;p&gt;· Go to the Balcony.&lt;/p&gt;  &lt;p&gt;· Step to their side.&lt;/p&gt;  &lt;p&gt;· Reframe.&lt;/p&gt;  &lt;p&gt;· Build them a golden bridge.&lt;/p&gt;  &lt;p&gt;· Use power to educate.&lt;/p&gt;  &lt;p&gt;Preparation for a negotiating situation is highly urged, and concentrates on thinking through the four major points from the previous book, Getting to Yes, in regard to oneself and the other parties involved in the negotiation.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;i&gt;GO TO THE BALCONY&lt;/i&gt;&lt;i&gt;.&lt;/i&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The natural reaction to aggressive, devious and stubborn behavior and attempts at exploitation are to strike back, to give in, or to break off relations. This step is the suggested alternative, and is a metaphor for distancing oneself from one’s natural impulses and emotions – detaching oneself from a reaction. The key is to name and recognize the stonewall, the attack, and the tricks, and then buy time to think. This can be done by a pause and silence, review what has transpired so far in the decision making process, or to take a time-out, even a brief one. This will avoid a possibly wrong and hasty decision under pressure.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;strong&gt;STEP TO THEIR SIDE&lt;/strong&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Negative emotions often are behind inflexible positions. Disarming these calls for doing the unexpected, to step to their side. The goal is to create a favorable climate for negotiation. This means:&lt;/p&gt;  &lt;p&gt;· Listening to understand – to hear out the other side with patience and discipline – and then paraphrase what they are saying back to them and ask for corrections. &lt;/p&gt;  &lt;p&gt;· Acknowledge – but do not necessarily agree with – their point. Recognize their feelings, offer an apology if they feel that they have been wronged and still demonstrate strength and confidence.&lt;/p&gt;  &lt;p&gt;· Agree wherever you can. This does not mean conceding anything, but rather returning the focus to whatever common ground can be found.&lt;/p&gt;  &lt;p&gt;· Acknowledge the person wherever possible. Act in contradiction to any negative perception, stereotype or caricature of you, and acknowledge whatever genuine authority and competence that they do have, and strive to build a working relationship with that person.&lt;/p&gt;  &lt;p&gt;· Express your own views without provocation. State your own feelings in terms of the way that you feel, and continue to stand up for yourself. Acknowledge your differences with optimism rather than antagonism.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;i&gt;REFRAME&lt;/i&gt;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Reframe a tough situation so that it can be directed into a mutual problem solving session. Ask the problem solving questions to discover underlying interests (“Why?” and “Why not?”, to brainstorm on possible solutions (“What if?”), to elicit advice (“What would you do in my situation?”), and to discuss standards of fairness (“What makes that fair?”). Likewise, there are specific tactics to reframe stonewalls, attacks, and tricks, and to negotiate about the negotiation itself. The turning point then comes when the tough negotiation becomes mutual problem solving.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;i&gt;BUILD THEM A GOLDEN BRIDGE&lt;/i&gt;&lt;i&gt;.&lt;/i&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The four biggest reasons for rejecting a proposal are:&lt;/p&gt;  &lt;p&gt;· It was not the idea of the other side.&lt;/p&gt;  &lt;p&gt;· It does not meet some basic interests of the other side.&lt;/p&gt;  &lt;p&gt;· It would mean that the other side would lose face.&lt;/p&gt;  &lt;p&gt;· It seems too much to agree to in too short a time.&lt;/p&gt;  &lt;p&gt;Instead of applying pressure, the metaphor is to build the other side a golden bridge to agreement – to draw them in the direction that you want them to come. This gets back to starting from where they are. The basic method again is to ask questions. Ask for their ideas and for constructive criticism of your own, and offer choices and alternatives. If there is still resistance, the advice is to probe for overlooked, often intangible, interests and needs which still have not been met. Additional tactics are suggested against face saving resistance, and helping the other side to frame the agreement in a positive light and to implement the agreement in an easy fashion.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;i&gt;USE POWER TO EDUCATE&lt;/i&gt;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The striking metaphor here is: “Use power to bring them to their senses, not to their knees.” The idea is to bring the other side to see that the cost of no agreement is greater than a mutually beneficial agreement. The idea is not to use power to force or punish, but to bring the other side to continuing to solve the problem together. Then the goal becomes forging a firm and lasting agreement that can be implemented effectively and which gives mutual satisfaction, not victory. A number of ways to do this are elucidated.&lt;/p&gt;  &lt;p&gt;Finally, the goal is repeated as not to “ . . . win over them, but to win them over.” This is the final strategy of breakthrough negotiation: to turn an adversary into a partner. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Applying the Lessons to Working in IT:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Many times, people both inside IT and outside IT can be at times notoriously difficult to work with, especially where there are circumstances which require joint efforts. These lessons can help to reduce adversarial conditions and improve cooperation with other areas. The need is still to turn real and potential adversaries into actual partners. The potential adversary can be an internal rival, an irate customer, or an exploitative colleague.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;strong&gt;GO TO THE BALCONY&lt;/strong&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Emotional outbursts can come from others. Seek to be the calmest person in the room if this happens.&lt;/p&gt;  &lt;p&gt;· Base your reaction not on the volatile and possibly provocative actions of others but take the time to weigh your reaction.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;strong&gt;STEP TO THEIR SIDE.&lt;/strong&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· The unexpected reaction of understanding and treating the other person with respect can also be the most powerful.&lt;/p&gt;  &lt;p&gt;· Understanding the other person does not invalidate one’s own ideas and interests, but provides the way to build the common ground necessary to build a mutually advantageous, effective and workable solution.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;i&gt;REFRAME&lt;/i&gt;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· A creative and artful act of reframing the negative responses of the other involved parties can be an effective turnaround of an antagonistic situation. Look for the unexplored aspects of the situation.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;i&gt;BUILD THEM A GOLDEN BRIDGE&lt;/i&gt;&lt;i&gt;.&lt;/i&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· No decision in a corporate environment is ultimately a battle of wills between individuals, since it will have consequences for the future stability, growth and prosperity of the business as a whole. Therefore don’t look for a one sided victory, to ‘beat’ the other person, but rather provide an honorable solution and cooperative working relationship for the future. Each decision, and how the decision is arrived at, has profound consequences for the future morale and cooperation within the organization.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;i&gt;USE POWER TO EDUCATE&lt;/i&gt;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· In IT, power is not necessarily the possession of managerial authority; it can be the possession of technical knowledge and expertise (such as support or programming training) or access to or control over technical resources (such as being a LAN or database administrator). These kinds of power can sometimes be used to try to humiliate or ‘win’ over other people. These kinds of power can also be used to educate others to bring them to a mutually advantageous solution. The people who do the latter are those who gain long term respect and responsibility in an organization.&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5d2d3b96-394b-456a-8331-d42cdb6d1138" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Negotiation" rel="tag"&gt;Negotiation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IT+Management" rel="tag"&gt;IT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/team+development" rel="tag"&gt;team development&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-3977598930205911305?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/3977598930205911305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/lessons-in-breakthrough-negotiation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/3977598930205911305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/3977598930205911305'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/lessons-in-breakthrough-negotiation.html' title='Lessons in Breakthrough Negotiation'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-4583794935968775691</id><published>2009-05-26T14:29:00.001-07:00</published><updated>2009-06-04T10:31:20.952-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='contracting'/><category scheme='http://www.blogger.com/atom/ns#' term='Negotiation'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>Lessons in Principled Negotiation</title><content type='html'>&lt;p&gt;Roger Fisher, William Ury and Bruce Patton, &lt;u&gt;Getting to Yes: Negotiating Agreement Without Giving In&lt;/u&gt;. Penguin Books, New York 1991.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Summary:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Principled negotiation is the central theme, where different parties work toward a common agreement based upon common principles, as opposed to positional negotiation, where different parties try to reconcile their different positions. Principled negotiation is deemed superior to positional negotiation in producing wise agreements, in efficiency at arriving over conclusions, and in preserving and improving ongoing relationships. &lt;/p&gt;  &lt;p&gt;Principled negotiation is based upon four major points:&lt;/p&gt;  &lt;p&gt;· People: separate the people from the problem.&lt;/p&gt;  &lt;p&gt;· Interests: focus on interests, not positions.&lt;/p&gt;  &lt;p&gt;· Options: generate a variety of possibilities before deciding what to do.&lt;/p&gt;  &lt;p&gt;· Criteria: insist that the result be based on some objective standard.&lt;/p&gt;  &lt;p&gt;It is also not simply ‘deal making,’ where both sides can become ‘partners in crime’, rather than working out decisions and situations where both sides achieve results to their advantage, and where no moral or ethical principles are breached. The goal is to achieve solutions which are also in accord with one’s own conscience.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;strong&gt;PEOPLE: SEPARATE THE PEOPLE FROM THE PROBLEM&lt;/strong&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;The primary objective is to deal with the other people in the negotiating process as people, with their own perceptions and emotions that become part of the process. The key is to deal tactfully with these factors and work at making communication with the other parties in the negotiation effective, so that the negotiation is carried out in a working, not adversarial, relationship. Specific instructions include:&lt;/p&gt;  &lt;p&gt;· Avoid putting the worst interpretation on the words and actions of the other side(s) or assigning blame to the other side.&lt;/p&gt;  &lt;p&gt;· Discuss each others’ perceptions of the situation and issues.&lt;/p&gt;  &lt;p&gt;· Don’t react to emotional outbursts.&lt;/p&gt;  &lt;p&gt;· Speak to be understood.&lt;/p&gt;  &lt;p&gt;· Speak to the problem, not the people.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;INTERESTS: FOCUS ON INTERESTS, NOT POSITIONS.&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Each negotiation involves the interests – the needs, desires, concerns and fears – of the people involved in the negotiation. These interests may motivate the formulation of opposing positions, but the development of a mutually acceptable solution involves reconciling both shared and conflicting interests. While attempting to understand the other parties involved in the negotiation, decide whose decision you need to affect and what decision you want to ask them to make, and then analyze the consequences of agreement or refusal from their perspective. Then specifically and vividly explain your interests, while acknowledging their interests also.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;OPTIONS: GENERATE A VARIETY OF POSSIBILITIES BEFORE DECIDING WHAT TO DO.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In many negotiations, the parties do not explore many options because of premature judgment about the other persons’ reactions or the solutions to the problems, or settling too early on a single answer, or looking to achieve only one’s self interest, or in the outcome of a negotiation as solely a win/lose proposition. The basic suggestion is to have a brainstorming session to explore options, and then to decide. As a tool for finding these, a Circle Chart is provided, to state the problem, to analyze the problem, to generate strategies and to define specific action steps. The aim is then to identify solutions that answer shared interests and dovetailing differing interests, and try to make the decision of the other parties in the negotiation easy for them.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;CRITERIA: INSIST THAT THE RESULT BE BASED ON SOME OBJECTIVE STANDARD.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The highest relational cost comes when negotiations become a battle of wills. The solution then becomes negotiation of objective criteria independent of the will of any party to the negotiation. This has the effect of producing wise, efficient and amicable agreements instead of embittering battles for dominance. First, look personally for mutually reasonable and fair standards and procedures for making a decision. In actual negotiation, frame each issue as a joint search for objective criteria, use reason and be open to the reasoning of the other parties in the negotiation. Finally, never yield to pressure, only to principle. If the other side tries to use pressure, “ &lt;strong&gt;. . . the principled response is to invite them to state their reasoning, suggest objective criteria you think apply, and refuse to budge except on this basis”&lt;/strong&gt; (p. 90).&lt;/p&gt;  &lt;p&gt;Succeeding chapters deal with a number of specific tactics that are often contradictory to the ‘conventional wisdom’ of negotiating:&lt;/p&gt;  &lt;p&gt;· Rather than having a ‘bottom line,’ have a BATNA (&lt;u&gt;B&lt;/u&gt;est &lt;u&gt;A&lt;/u&gt;lternative &lt;u&gt;t&lt;/u&gt;o a &lt;u&gt;N&lt;/u&gt;egotiated &lt;u&gt;A&lt;/u&gt;greement).&lt;/p&gt;  &lt;p&gt;· Verify all factual assertions. Personal trust is not an issue in doing so.&lt;/p&gt;  &lt;p&gt;· Use negotiation jujitsu rather than pushback and retaliation to sidestep stubborn assertions of a position, attacks on ideas and personal attacks; try to turn each one into a statement of interest and an attack on the problem. Ask questions and pause for an answer instead of making statements. &lt;/p&gt;  &lt;p&gt;· Address tricky, unethical and illegitimate bargaining tactics by negotiating about the rules of negotiating.&lt;/p&gt;  &lt;p&gt;· Learn how much authority the other side has to make an agreement.&lt;/p&gt;  &lt;p&gt;Finally, the book concludes with a series of clarifying questions and answers to specific application of the methods. Most boil down to variations on getting to know the interests of the other side and understanding one’s own interests and goals in the negotiation process.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Applying the Lessons to Working in IT &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;People: separate the people from the problem&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Throughout I/S, representatives from different groups must work out solutions to problems and long term goals. Personal histories and reputations, both positive and negative, become can become entrenched over time, many times upon inadequate information, personal grudges, and hearsay. Refuse to judge a person’s potential contribution or cooperation before attempting to resolve the problems with that person.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Interests: focus on interests, not positions.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Look at what a position, inference or conclusion is based upon – its underlying reasons – when confronted with a set position. Ask questions to determine these underlying reasons if they are not apparent.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Options: generate a variety of possibilities before deciding what to do.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Use brainstorming effectively to generate multiple approaches and possible solutions and objectives. ‘What if’ questions can be very effective in an IT environment.&lt;/p&gt;  &lt;p&gt;· Use the ‘what if’ to generate additional possibilities when it is apparent that decisions are being made prematurely.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Criteria: insist that the result be based on some objective standard.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· The objective standard often can and should be rooted in the common business objectives of the corporation and the goals and objectives of the lower levels in the hierarchy. At other times, appeal can be made to technical realities and industry standards. Whatever the standard, it should be something objective that can become common ground for the involved parties.&lt;/p&gt;  &lt;p&gt;· The corporate scandals of recent months have highlighted how unethical working relationships can become. Objective standards also include moral and ethical principles, as well as bare letter of the law. Basing decisions on objective ethical standards rather than ‘what we think we can get away with’ provides decisions which can stand both public and private scrutiny, as well as the scrutiny of one’s own conscience.&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f3416b22-f465-4220-aba3-310f1e230ace" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Negotiation" rel="tag"&gt;Negotiation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IT+Management" rel="tag"&gt;IT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/team+development" rel="tag"&gt;team development&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-4583794935968775691?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/4583794935968775691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/lessons-in-principled-negotiation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/4583794935968775691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/4583794935968775691'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/lessons-in-principled-negotiation.html' title='Lessons in Principled Negotiation'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-6462397088327935725</id><published>2009-05-26T14:24:00.001-07:00</published><updated>2009-06-04T10:29:27.968-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><title type='text'>Prologue: Lessons in Productive Negotiation and Cooperation From the Harvard Negotiation Project Team</title><content type='html'>&lt;p&gt;There is a constant need for productive working together in the corporate world, especially in IT projects, where much of what is accomplished is done through consultation with others. This means that there is a constant need for constant sharpening of soft skills in dealing with other people, both with those who are already cooperative and with those who are less so. These skills can be as critical as technical skills in achieving genuine productivity. &lt;/p&gt;  &lt;p&gt;Insightful lessons in negotiation and cooperation in a working environment come from the four books from lawyers Roger Fisher and William Ury, who were originally part of the Harvard Negotiation Project. Negotiation is a genuine part of the IT work environment when it is defined as &lt;strong&gt;&lt;em&gt;mutual problem solving&lt;/em&gt;&lt;/strong&gt;. In order to achieve genuine results in the IT work environment, the productive IT knowledge worker needs to absorb and apply the kinds of lessons that are found in these books. The following blog posts are only an introduction to and application of the lessons that they offer, and is certainly not a substitute for personal reading, understanding and application of their books.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/05/lessons-in-principled-negotiation.html"&gt;Lessons in Principled Negotiation&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Based on: Roger Fisher, William Ury and Bruce Patton, &lt;u&gt;Getting to Yes: Negotiating Agreement Without Giving In&lt;/u&gt;. Penguin Books, New York 1991.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/05/lessons-in-breakthrough-negotiation.html"&gt;Lessons in Breakthrough Negotiation&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Based on: William Ury, &lt;u&gt;Getting Past No: Negotiating Your Way from Confrontation to Cooperation.&lt;/u&gt; New York: Bantam Books, 1993.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/05/lessons-in-lateral-leadership.html"&gt;Lessons in Lateral Leadership&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Based on: Roger Fisher and Alan Sharp, &lt;u&gt;Getting It Done: How to Lead When You’re NOT in Charge&lt;/u&gt;. HarperCollins Publishers, New York 1999.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/05/lessons-in-building-unconditionally.html"&gt;Lessons in Building Unconditionally Constructive Working Relationships&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Based on: Roger Fisher and Scott Brown, &lt;u&gt;Getting Together: Building Relationships As We Negotiate.&lt;/u&gt; New York: Penguin Books, 1989.&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a493d602-87e4-4108-99c9-b229b8ceb5f6" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Negotiation" rel="tag"&gt;Negotiation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/iT+Management" rel="tag"&gt;iT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/team+development" rel="tag"&gt;team development&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-6462397088327935725?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/6462397088327935725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/prologue-lessons-in-productive.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/6462397088327935725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/6462397088327935725'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/prologue-lessons-in-productive.html' title='Prologue: Lessons in Productive Negotiation and Cooperation From the Harvard Negotiation Project Team'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-2276208228570757732</id><published>2009-05-25T18:16:00.001-07:00</published><updated>2009-06-04T10:27:46.796-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gifted and Talented'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>Workplace Issues for GTs in IT Organizations</title><content type='html'>&lt;hr /&gt;  &lt;p&gt;In my previous post, &lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/05/managing-gts-in-it-organizations.html"&gt;Managing GTs in IT Organizations&lt;/a&gt;, I shared some ideas on how I as a (Gifted and Talented Adult) would prefer to be managed. Since there are a number of GTs in IT, I’m sharing the following observations for their benefit as well. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Overqualification and underemployment are real difficulties for many GT adults in the modern workplace.&lt;/strong&gt; &lt;/p&gt;      &lt;p&gt;Earlier in my career, I found this was an issue with positions in which I was frankly overqualified and underemployed. Our capabilities can put us into situations where we may even find ourselves outperforming everyone around us but being held back by management because we are 'indispensable.' I think the key is to realize that some of these positions are transitional, and to seek to keep ourselves from being 'indispensable' by cross training our coworkers. If we can find some way to let our managers know that we're gifted in an appropriate manner, we can also head off some problems if they begin to expect everyone to be able to pick up things like we can and do the variety of things that we can. But I found that jobs with easily mastered, routine and repetitive responsibilities were not really suitable for me for the long term. Rather, these jobs were stepping stones to other positions with greater responsibilities and challenges. &lt;/p&gt;      &lt;p&gt;Generally, most people nowadays seek more out of a job than just a paycheck, and this is even more so for GTs. Unfortunately, many people still have some strange ideas about employment; it does not have to be misery inducing monotony. Rather, a GT is a person who is most satisfied when being productive and making a significant contribution, and this can often be very profitable both for the GT and the organization which employs him or her. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Vocational choice is a real difficulty also for many GT adults.&lt;/strong&gt; &lt;/p&gt;      &lt;p&gt;When a person can do many things well, there are a number of vocational choices open. Here is one of the places where a GT can make a good choice that goes sour when it seems that there are many good choices. It is also a place where externally imposed choices can cause years of heartache and frustration, where a GT person takes up a profession or job which others say would be good for them but is in fact against their best interests and contradictory to his or her entire set of abilities and temperament. &lt;/p&gt;      &lt;p&gt;A GT person most likely will deliver excellent results and can often do so within a work environment which is wrong for them in the long term. But the cost will be in lost productivity and lost potential. The reward will be much greater GTs find work environments in which they can find that they can show their potential and demonstrate their personal productivity.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Chronic mismanagement is a real difficulty also for many GT adults in the modern workplace. &lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;The first way in which a GT can be mismanaged is when the greater potential and productivity of the GT are disdained. A nonGT boss may have the belief that anyone can do what we can as fast as we can and with the same quality as we can -- the 'you're nothing special' jibe.&lt;/p&gt;      &lt;p&gt;The other way in which a GT can be mismanaged is to attempt to make others do everything that the GT can. Unfortunately, they will all resent this tremendously. All attempts to clone me on and off the job have failed miserably -- thank goodness. The answer is rather to recognize the GT as an individual with his or her own unique potential, like everyone else in the department and organization. This is part of what I wanted to communicate in my previous post, &lt;a href="http://thedalehawthorneeffect.blogspot.com/2009/05/managing-gts-in-it-organizations.html"&gt;Managing GTs in IT Organizations&lt;/a&gt;.&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:536ac249-ace5-44ec-8edc-7210f8a656c7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Gifted+and+Talented" rel="tag"&gt;Gifted and Talented&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IT+Management" rel="tag"&gt;IT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/consulting" rel="tag"&gt;consulting&lt;/a&gt;,&lt;a href="http://technorati.com/tags/team+development" rel="tag"&gt;team development&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-2276208228570757732?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/2276208228570757732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/workplace-issues-for-gts-in-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/2276208228570757732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/2276208228570757732'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/workplace-issues-for-gts-in-it.html' title='Workplace Issues for GTs in IT Organizations'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-5485693606201062382</id><published>2009-05-25T17:43:00.001-07:00</published><updated>2009-06-04T10:09:07.905-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gifted and Talented'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='team development'/><category scheme='http://www.blogger.com/atom/ns#' term='IT Management'/><title type='text'>Managing GTs in IT Organizations</title><content type='html'>&lt;p&gt;Here are a general set of guidelines that I put together. It appeared first on my personal blog, but here I reproduce it for the benefit of others who may have GTs in their departments and organizations. &lt;/p&gt;  &lt;p&gt;GT is short for ‘Gifted and Talented.’ These are adults in the workforce who may or may not have been in a Gifted and Talented program during their schooling. They may or may not have received high grades when in school. They may or may not be members of Mensa. Generally, they score in the upper 2% of standard intelligence tests such as the Stanford Binet and also demonstrate multipotentiality (talent and accomplishment in multiple disciplines and areas). It’s more than simply being intelligent. And yes, I qualify as GT under the generally accepted criteria.&lt;/p&gt;  &lt;p&gt;Information Technology often has more GTs than other areas of business. Unfortunately, many managers do not know much about how to manage a GT; it’s simply not covered in Organizational Behavior classes or texts on management techniques. Here’s what I came up with when I thought about what I would look for from a manager. &lt;/p&gt;  &lt;p&gt;What most GTs need is simply good and fair management. This means management without negative effect on their natural productivity and creativity. If management provides this kind of environment, the GT can both shine individually, and make both the department and the manager look extremely impressive as well. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Recognize that a GT Person in Your Department Can Be a Substantial Asset &lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;A manager can easily be threatened by abilities of many GTs. This may well be entirely unreasonable and more a measure of the insecurity of the manager than the actual intentions, conscious or unconscious, of the GT. Many GTs simply do not want management positions, since those positions would entail dealing with people more than they would like. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Seek to Build a Partnership with the GT Person &lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;GTs will often be quirky people, but they have a surplus of creativity, intensity and understanding and often a very strong work ethic. The aim for a manager should be to build a partnership of mutual cooperation with the GT. An attempt to build a relationship of managerial domination will more often fail than not. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Practice Uniform and Fair Expectations for Performance, Promotion and Pay &lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;One experience that GTs often have in both school and the workplace is a continually rising bar of expectations for them, often much greater than others theoretically at the same grade or job level. Unless there is a special job level especially for GTs (and antidiscrimination laws would not permit this), be fair in applying the corporate expectations for performance, promotion and pay to the GT as to the nonGT. In other words, it is simply discrimination to expect stronger performance from the GT to receive the same promotions and pay that a nonGT with the same responsibilities would receive. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Do Not Assign Them to Work with Underachievers to Bring Up the Performance of the Underachievers&lt;/strong&gt; &lt;/p&gt;      &lt;p&gt;Another experience that GTs often have in both school and the workplace is that they can be paired with the underachievers with the hope that they can bring up the performance of marginal students and employees. This is often quite counterproductive; the marginal employee may simply slack off even more, or even attempt to sabotage the joint effort once because the disparity in abilities simply smarts even more because of having to work with someone whom he or she may deeply resent and envy. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Foster an Atmosphere of and Be an Example of Professional Courtesy and Cooperation &lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;Most companies have values statements which set forth standards of professional conduct. Review them, practice them, and hold others to them. Often these are enough, but unless these standards of professional conduct are followed, they are simply window dressing. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Retain Your Own Authority and Responsibility as Manager &lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;Ultimately, the responsibility for the department is that of the manager. Allow the GT to lead, but do not abdicate authority. Retain and practice your right and responsibility to set the direction and standards of the department. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Provide Challenging Assignments Which Call for Creativity &lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;GTs can be bored easily with routine work. This is one area where it may call for extra thought to provide these kinds of assignments, but the payback in retention of the GT will make it definitely worthwhile. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Accept and Encourage Lateral Leadership by GTs &lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;Refer the GT to the book &lt;u&gt;Getting It Done: How to Lead When You’re NOT in Charge&lt;/u&gt;(Roger Fisher and Alan Sharp, HarperCollins Publishers, New York 1999), for the concept and methodology of lateral leadership. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Recognize that GTs May Move Up and Onward More Rapidly Than Others &lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;This may entail some 'going to bat' for the GT with Human Resources, if there is some track laid out for advancement which is too rigid in terms of timelines. The GT employee may actually be promotable more quickly than someone who takes longer to master the same skills. Thus the GT employee may not follow a timetable that was set for the advancement of nonGTs. The danger here is that the GT may become overqualified for his or her job level or responsibilities, and leave to find something else because the way of advancement is simply too slow.&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1241e1d8-ea85-4611-967d-16be62a4ab02" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/IT+Management" rel="tag"&gt;IT Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Gifted+and+Talented" rel="tag"&gt;Gifted and Talented&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-5485693606201062382?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/5485693606201062382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/managing-gts-in-it-organizations.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/5485693606201062382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/5485693606201062382'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/managing-gts-in-it-organizations.html' title='Managing GTs in IT Organizations'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-4809871929002926022</id><published>2009-05-21T14:37:00.001-07:00</published><updated>2009-06-04T10:25:45.254-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Error Handling'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='Exceptions'/><category scheme='http://www.blogger.com/atom/ns#' term='Exception Handling'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='NTier'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding Standards'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Library'/><title type='text'>Suggested Standards and Guidelines for Error and Exception Handling</title><content type='html'>&lt;p&gt;Here are a set of basic suggestions that I put together for a client for error and exception handling on a multitier ASP.NET project with Visual Studio 2008/ .NET 3.5 SP1.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Basic Needs for Error / Exception Handling&lt;/b&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Flexible framework to log exception details in a way in which developers and support staff can find the information relevant to troubleshooting and fixing the problems. &lt;/li&gt;    &lt;li&gt;Coding standard to establish a consistent method to provide user friendly error messages while avoiding disclosing implementation details as a security risk. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Framework /Library Alternatives:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Alternative 1: Microsoft Enterprise Library 4.1 Exception Handling Block&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Targeted .NET Framework: 3.5 SP1&lt;/p&gt;  &lt;p&gt;Advantages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Free &lt;/li&gt;    &lt;li&gt;Easy to use &lt;/li&gt;    &lt;li&gt;Source code examples readily available &lt;/li&gt;    &lt;li&gt;Logs information to a variety of destinations such as the event log, files or a database &lt;/li&gt;    &lt;li&gt;Highly configurable &lt;/li&gt;    &lt;li&gt;Comes with configuration utility &lt;/li&gt;    &lt;li&gt;Externally maintained by Microsoft Patterns and Practices Team &lt;/li&gt;    &lt;li&gt;Documented and packaged with other Enterprise Library components &lt;/li&gt;    &lt;li&gt;Documentation integrated with Visual Studio / MSDN documentation &lt;/li&gt;    &lt;li&gt;Specifically targeted for the .NET 3.5 SP1 platform &lt;/li&gt;    &lt;li&gt;Incorporates additional functionality for WCF error handling and logging (note the section in the Enterprise Library documentation, ‘Integrating the Logging Application Block with WCF Applications’) &lt;/li&gt;    &lt;li&gt;Able to customize &lt;/li&gt;    &lt;li&gt;Familiar to many .NET developers &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Disadvantages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Requires some experimentation and prototyping to understand its functionality. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Alternative 2: Log4Net:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Targeted .NET Framework: 2.0&lt;/p&gt;  &lt;p&gt;Advantages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Free &lt;/li&gt;    &lt;li&gt;Easy to use &lt;/li&gt;    &lt;li&gt;Logs information to a variety of destinations &lt;/li&gt;    &lt;li&gt;Highly configurable &lt;/li&gt;    &lt;li&gt;Source code examples readily available &lt;/li&gt;    &lt;li&gt;Externally maintained by open source community &lt;/li&gt;    &lt;li&gt;Able to customize &lt;/li&gt;    &lt;li&gt;Familiar to many .NET developers &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Disadvantages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Targets earlier version of the framework &lt;/li&gt;    &lt;li&gt;Does not incorporate additional functionality for WCF error handling and logging &lt;/li&gt;    &lt;li&gt;No configuration utility &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Alternative 3: Internally developed component(s):&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Advantages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Primarily when necessary to meet any internal standards which cannot be met with a free or open source framework. &lt;/li&gt;    &lt;li&gt;Internal code maintenance not at the mercy of external corporations or developers. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Disadvantages:&lt;/p&gt;  &lt;p&gt;· Cost in time and money for internal development and maintenance&lt;/p&gt;  &lt;p&gt;· Learning curve for new hires and external resources&lt;/p&gt;  &lt;p&gt;· May reflect personal preferences and “blind spots” of internal developers&lt;/p&gt;  &lt;p&gt;· May open up security holes unless carefully reviewed&lt;/p&gt;  &lt;p&gt;· May not be transferable to later projects&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Suggested common sense coding standards for exception and error handling:&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Avoid ‘eating exceptions’ (catching an exception in an empty block): &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;try&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;// my cool code goes here&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;catch{} // I can’t find out or fix what happens here in production&lt;/p&gt;  &lt;p&gt;// errors may still propagate up the call stack and the user&lt;/p&gt;  &lt;p&gt;// may have a mysterious failure to deal with&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Use a ‘finally { } ‘ or a ‘using . . . { } ‘ block to dispose of unmanaged resources when an exception occurs. &lt;/li&gt;    &lt;li&gt;Log exceptions where possible, especially if the error condition indicates a network, database or file I/O problem. &lt;/li&gt;    &lt;li&gt;Log exception information such as the call stack and any associated input data along with user information. &lt;/li&gt;    &lt;li&gt;Throw exceptions to indicate error conditions rather than returning error codes, since error codes are rarely documented well enough for future maintenance and troubleshooting. &lt;/li&gt;    &lt;li&gt;Return null rather than throwing an exception if an expected object cannot be returned from a method, since testing for null in an if statement is usually less expensive than handling exceptions. &lt;/li&gt;    &lt;li&gt;Do not use exceptions for control flow. Check for null and error conditions with if and switch statements rather than throwing or catching exceptions. &lt;/li&gt;    &lt;li&gt;Use correct exception classes for throwing exceptions, such as ArgumentNullException if a null reference is passed as a parameter to a method and ArgumentException if a parameter passed to a method is otherwise invalid. &lt;/li&gt;    &lt;li&gt;Include information in any exceptions thrown to indicate the cause and correction for the exception. &lt;/li&gt;    &lt;li&gt;Derive new exception classes from System.Exception. Microsoft has deprecated the previously recommended practice of deriving new exception classes from System.ApplicationException. &lt;/li&gt;    &lt;li&gt;Error messages displayed to the user should suggest a possible correction if possible. &lt;/li&gt;    &lt;li&gt;Seek to return the application after an exception to a state where the user can continue or correct his or her previous action rather than force the user to start all over again. &lt;/li&gt;    &lt;li&gt;Use standard validation techniques as much as possible to correct user input rather than throwing exceptions. &lt;/li&gt;    &lt;li&gt;Incorporate a generic exception handling method in base classes that performs the standard method of handling and logging exceptions, such as a in a base web page or master page class. &lt;/li&gt;    &lt;li&gt;Incorporate an exception building method that returns the desired exception in classes which throw exceptions. &lt;/li&gt;    &lt;li&gt;Provoke exceptions during unit, integration and system testing to determine application security and robustness. &lt;/li&gt;    &lt;li&gt;For web pages, include error and exception handling in client side Javascript so that it ‘fails gracefully’ if something undesirable happens. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Recommendations:&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Implement the Exception Handling Block of Enterprise Library 4.1, and establish Exception Handling Policies for DataAccessExceptions, SqlExceptions, SecurityExceptions, WCF FaultExceptions and WCF CommunicationExceptions. If the Enterprise Library Validation Block is used, add an exception policy also for ValidationException. &lt;/li&gt;    &lt;li&gt;Consider logging error information to a centralized store. The alternatives with the Enterprise Library are to use the Database Trace Listener to log error information to a database or the MSMQ Trace Listener with the MSMQ Distributor Service with the Logging Application Block to log error information to a central store through an MSMQ queue. Log4Net contains database logging functionality. &lt;/li&gt;    &lt;li&gt;If the Enterprise Library Database Trace Listener is used, add an event listener for the event log or a flat file, and, optionally, an email listener for the Logging Errors and Warnings category under special sources to catch any errors that cannot be logged to the database. &lt;/li&gt;    &lt;li&gt;Establish coding standards for exception handling at each tier / layer of the application. &lt;/li&gt;    &lt;li&gt;Consider deriving application specific exception classes to wrap exceptions that get thrown. Examples: MyAppException, MyAppFaultException (for WCF errors), and MyAppClientException(for ASP.NET errors). These could be used for specific exception handling routines. &lt;/li&gt;    &lt;li&gt;Document the error logging method and location of error information for ongoing application maintenance and support staff. &lt;/li&gt;    &lt;li&gt;Consider using an exception handling and logging library that can send notifications through email to maintenance and support staff for severe errors. Both Enterprise Library and Log4Net contain this functionality. Homegrown logging solutions sometimes expose too much email functionality, however. &lt;/li&gt;    &lt;li&gt;Avoid internal development, maintenance and customization of exception handling and logging libraries unless the need is overwhelming. &lt;/li&gt;    &lt;li&gt;Provide a method to handle and log all uncaught exceptions at the ASP.NET and WCF levels. Handle the Application_Error event in Global.asax for ASP.NET pages and implement IErrorHandler at the WCF level. The ASP.NET error page should display a user friendly explanation of what happened. &lt;/li&gt; &lt;/ul&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9805738c-c5fb-4f88-8df4-a6db78de1bac" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Enterprise+Library" rel="tag"&gt;Enterprise Library&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Log4Net" rel="tag"&gt;Log4Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Exception" rel="tag"&gt;Exception&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Exception+Handling" rel="tag"&gt;Exception Handling&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Error+Handling" rel="tag"&gt;Error Handling&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Coding+Standards" rel="tag"&gt;Coding Standards&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-4809871929002926022?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thedalehawthorneeffect.blogspot.com/feeds/4809871929002926022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/suggested-standards-and-guidelines-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/4809871929002926022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6094800596146935474/posts/default/4809871929002926022'/><link rel='alternate' type='text/html' href='http://thedalehawthorneeffect.blogspot.com/2009/05/suggested-standards-and-guidelines-for.html' title='Suggested Standards and Guidelines for Error and Exception Handling'/><author><name>Dale Hawthorne</name><uri>http://www.blogger.com/profile/18440275249241785587</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-6094800596146935474.post-572975715410761177</id><published>2009-05-21T14:10:00.001-07:00</published><updated>2009-06-04T10:22:29.178-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='NTier'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>Suggested Minimum Architectural and Coding Standards for Multitier .NET Applications</title><content type='html'>&lt;p&gt;For a previous client with little experience of multiple tier .NET applications, I put together the following list of recommendations for what this architecture entails. The other developers on the project had primarily worked with two tier Visual Basic 6 client server applications, and they were unused to the kind of architecture that the project required.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Requirements definition for scalability&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Define the number of simultaneous external users: minimum, normal, peak. &lt;/li&gt;    &lt;li&gt;Put together some profiles of typical users and use cases &lt;/li&gt;    &lt;li&gt;Define a projected number of simultaneous HTTP requests. &lt;/li&gt;    &lt;li&gt;Define the projected size of the database &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Physical Architecture Recommendation: &lt;/b&gt;6 Server Configuration in 3 Tiers&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;2 Internet servers (at least one primary, one backup) running Windows Server 2003 / 2008 with .NET Framework 3.0 / 3.5 installed.These servers host the WCF outer tier and routes WCF Web Service requests to the Application Servers. &lt;/li&gt;    &lt;li&gt;2 redundant application servers (at least one primary, one backup) running Windows Server 2003 / 2008 with .NET Framework 3.0 / 3.5 will host the application code. &lt;/li&gt;    &lt;li&gt;2 redundant database servers (at least one primary, one backup) running SQL Server 2005 / 2008 will host the application databases. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Advantages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Each server is redundant for maintenance and redundancy. &lt;/li&gt;    &lt;li&gt;The minimum functionality is exposed to the external Internet. &lt;/li&gt;    &lt;li&gt;The database server is protected behind the firewall protection of the internal network. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Possible problems: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;WCF routing can be a performance hit. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Physical Architecture to Avoid:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;One server for both the database and the application code.      &lt;ul&gt;       &lt;li&gt;This would provide no application or database failover. &lt;/li&gt;        &lt;li&gt;One server would need have to provide all the disk storage and processing power for all the application and database processing. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;One database server and one application server.      &lt;ul&gt;       &lt;li&gt;This would provide no application or database failover. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;b&gt;Application Tiers and Layers:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;These logical application layers should encompass at least one component in each layer; this will usually mean a separate Visual Studio project at each layer. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Client Tier: &lt;/b&gt;This client tier could be a Windows Smart Client application, which is would be updated through ClickOnce through a server folder marked as a Trusted Publisher through internal group policy. An alternative would be a Windows Presentation Foundation (WPF) application hosted in Internet Explorer, or a standard ASP.NET application.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Presentation: &lt;/b&gt;This layer would contain the actual user interface elements. For Windows Smart Client application, this would be the .Designer file, for a WPF application, this would be the actual XAML markup, and for an ASP.NET application this would be the .ASPX markup file.&lt;b&gt;&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;User interface code:&lt;/b&gt; This layer would contain any code for UI processing. This would be both Javascript and the code behind for an ASP.NET application, and the .vb files for a WPF or Smart client application. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Business Logic Interaction code (optional): &lt;/b&gt;This code will call the service façade directly. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Middle Tier:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Service Façade: &lt;/b&gt;This will be the actual Windows Communication Foundation interfaces, classes and .svc files. This layer must call only methods in the business logic layer. It will also be responsible for logging any errors from the middle tier and submitting any FaultExceptions back to the client layer. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Business Object Layer: &lt;/b&gt;This layer will contain all Data Transfer Objects (DTOs). These will be objects which contain state only (Public Properties) defined with the WCF DataContract and Enterprise Library Validation attributes. These objects will contain data to be passed onto the client layer. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Business Logic Layer:&lt;/b&gt; This layer will contain all classes which implement specific business logic. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Business Workflow Layer: &lt;/b&gt;This will be any Windows Workflow Foundation (WF) workflows as they are deemed necessary to the application. An alternative would be BizTalk 2006 orchestrations. This layer will also contain any business rules to be processed by either the WF or BizTalk rules engine.&lt;b&gt;&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Service Layer: &lt;/b&gt;This will contain any proxies to any internally hosted web services. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Database Tier:&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Physical Database Tables &lt;/li&gt;    &lt;li&gt;Stored Procedures and Functions &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Application Coding and Database Recommendations:&lt;/b&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Adopt as a minimum standard the &lt;a href="http://msdn2.microsoft.com/en-us/library/h63fsef3(VS.80).aspx"&gt;Microsoft Visual Basic .NET coding guidelines&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Implement the Microsoft Enterprise Library for business object data validation, application instrumentation and tracing, and error logging. Other available functionality within the Enterprise Library can be implemented when an appropriate use in line with define application functionality has been identified. &lt;/li&gt;    &lt;li&gt;Eliminate the use of datasets, typed or non-typed, from the middle tier because of their impact on memory and disk performance. DataReaders and XMLReaders (SELECT statements with the FOR XML directive), ExecuteScalar method calls, and ExecuteNonQuery output parameters use less system resources and generally provide superior performance, especially where there is only a very limited subset of data needed. &lt;/li&gt;    &lt;li&gt;Remove hard coded strings and numbers into separate static utility class, and provide them with meaningful names to increase understandability and maintainability. &lt;/li&gt;    &lt;li&gt;Avoid the use of helper and manager classes. Move common functionality into base classes instead. &lt;/li&gt;    &lt;li&gt;Use asynchronous method calls for database operations and XML processing as much as possible to increase responsiveness for multiple concurrent users. &lt;/li&gt;    &lt;li&gt;Us the AsyncCallback delegate to call methods that may implement long running operations if possible, and make sure that the timeout setting on the WCF binding reflects a permitted upper time limit. &lt;/li&gt;    &lt;li&gt;Use XML code comments on all class definitions, public properties and public methods. The use of code comments on private variables, properties and methods is encouraged where there is any possible ambiguity or misunderstanding. &lt;/li&gt;    &lt;li&gt;Each public class should exist in its own separate file. Private classes for the use of a single public class can exist in the same file, but its use should be documented in comments. &lt;/li&gt;    &lt;li&gt;On classes which implement IDisposable, call the Dispose() method, preferably in a Finally block at the end of a (VB.NET) Try . . . Catch .. .&amp;#160; Finally block or use the Using . . . End Using construct. This will free unmanaged resources faster than waiting for the .NET garbage collector for instances of classes which properly implement the IDisposable interface. &lt;/li&gt;    &lt;li&gt;All exceptions should be caught and logged at some point in the application logic flow. A general exception handling and logging policy will be implemented. Where specific exceptions are anticipated, these should be handled. &lt;/li&gt;    &lt;li&gt;Catching and not handling exceptions will not be permitted due to the performance overhead of constructing and propagating an exception as well as the loss of possibly valuable information for troubleshooting. Rather, application code needs to anticipate and avoid situations which may throw exceptions, and log exceptions where they occur. Anticipate and avoid possible error conditions with simple If .. Else .. End If structures. &lt;/li&gt;    &lt;li&gt;Use only parameterized stored procedures from the application to access the database for Create, Retrieve, Update and Delete (CRUD) operations. No dynamically generated SQL or SQL statements will be permitted throughout the application to reduce the possibility of SQL attacks from outside the application. User accounts contained in the configuration files in an encrypted configuration strings section will have access only to execute these stored procedures. &lt;/li&gt;    &lt;li&gt;SQL SELECT statements inside parameterized stored procedures with appropriate WHERE clauses will be used to retrieve specified individual rows. Retrieval of entire tables or multiple rows from the database for lookup of an individual row will not be permitted throughout the application. Specific data retrieval techniques exist where there are dynamic conditions for a WHERE clause, and these should be used rather than dynamic SQL statements. &lt;/li&gt;    &lt;li&gt;Each SELECT statement within a stored procedure should have a default ORDER BY column where the data will commonly be sorted by a single column. Any other sorts will need to be done after the data has been retrieved from the server. &lt;/li&gt;    &lt;li&gt;No user without the administrator role will have direct INSERT, UPDATE or DELETE rights to the database tables. Selected internal users with specific technical expertise and who have the responsibility for creating ad hoc reports may be given SELECT access on the database tables. Preference will be for developers to fulfill reporting requirements with canned reports from SQL Server 2005 / 2008 Reporting Services. &lt;/li&gt; &lt;/ol&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c0939911-0acc-4268-9eaa-a186abe35158" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Coding+Standards" rel="tag"&gt;Coding Standards&lt;/a&gt;,&lt;a href="http://technorati.com/tags/software+development" rel="tag"&gt;software development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Ntier+architecture" rel="tag"&gt;Ntier architecture&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6094800596146935474-572975715410761177?l=thedalehawthorneeffect.blogspot.com' alt='' /&gt;&lt;/div&gt
