<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.foderick.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">David Foderick&amp;#39;s Blog - OnMaterialize()</title><subtitle type="html" /><id>http://www.foderick.com/blogs/onmaterialize/atom.aspx</id><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/default.aspx" /><link rel="self" type="application/atom+xml" href="http://www.foderick.com/blogs/onmaterialize/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2006-11-07T01:32:00Z</updated><entry><title>RUAlive 0.2 released</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2007/10/02/rualive-0-2-released.aspx" /><link rel="enclosure" type="text/html; charset=utf-8" length="17528" href="http://netknowledgenow.com:81/CS/files/folders/samplecode/entry2077.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2007/10/02/rualive-0-2-released.aspx</id><published>2007-10-02T22:39:00Z</published><updated>2007-10-02T22:39:00Z</updated><content type="html">&lt;p&gt;A new version is available. See the end of the post for a link. Major enhancements are support for mutliple sites, ability to view the response and the beginnings of a Vista Gadget implementation.&lt;/p&gt;&lt;img title="RUAlive" style="WIDTH:600px;HEIGHT:400px;" height="400" alt="RUAlive" src="http://netknowledgenow.com/CS/photos/sample/images/2078/original.aspx" width="600" /&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=2084" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author></entry><entry><title>Making Cuyahoga and Community Server play nice together</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2007/09/30/Making-Cuyahoga-and-Community-Server-play-nice-together.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2007/09/30/Making-Cuyahoga-and-Community-Server-play-nice-together.aspx</id><published>2007-09-30T18:14:00Z</published><updated>2007-09-30T18:14:00Z</updated><content type="html">&lt;p&gt;I use Cuyahoga for my main website pages and relegate Community Server&amp;nbsp;to be a&amp;nbsp;subservient web app&amp;nbsp;to take advantage of its&amp;nbsp;blog and forums components.&amp;nbsp;The latest Cuyahoga 1.5&amp;nbsp;upgrade threw a small wrinkle into the configuration process.&lt;/p&gt;&lt;p&gt;The basic setup is to have two virtual roots.&lt;br /&gt;&lt;a href="http://www.netknowledgenow.com/"&gt;http://www.netknowledgenow.com/&lt;/a&gt;&amp;nbsp;has its own web.config for Cuyahoga.&lt;br /&gt;&lt;a href="http://netknowledgenow.com:81/CS"&gt;http://netknowledgenow.com:81/CS&lt;/a&gt; is a virtual root under the main site with its own web.config for Community Server.&lt;/p&gt;&lt;p&gt;As &lt;a href="http://netknowledgenow.com:81/CS/blogs/onmaterialize/archive/2005/01/29/5.aspx"&gt;this post describes&lt;/a&gt;, Cuyahoga adds some HttpModules to its site. These have to be removed in the Community Server web.config. You have to move the dll&amp;#39;s from Cuyahoga&amp;#39;s bin directory into Community Server&amp;#39;s bin directory in order to remove the HttpModules.&amp;nbsp;Starting with Cuyahoga version 1.5 there are also HttpHandlers registered by Cuyahoga. These HttpHandlers also have to be removed in CommunityServer&amp;#39;s web config otherwise the Community Server pages do not function. No error message was being thrown but every subpage in Community Server was being redirected to the Community Server default home&amp;nbsp;page. However, once you remove the Cuyahoga HttpHandler you have to re-enable Asp.Net&amp;#39;s default handler (in machine.config). If anyone knows a cleaner way to remove this stuff and reset the HttpHandler to the default, please let me know!&lt;/p&gt;&lt;p&gt;A step-by-step recipe for making this work goes like this:&lt;br /&gt;1. Copy the Cuyahoga dll&amp;#39;s from the Cuyahoga bin directory into Community Server&amp;#39;s bin directory.&lt;br /&gt;2. Edit Community Server&amp;#39;s web.config HttpModule and HttpHandler sections to look like this:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#006400"&gt;&amp;lt;!--&amp;nbsp;START&amp;nbsp;-&amp;nbsp;CommunityServer&amp;nbsp;specific&amp;nbsp;application&amp;nbsp;settings&amp;nbsp;here&amp;nbsp;--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;httpModules&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#006400"&gt;&amp;lt;!--&amp;lt;remove&amp;nbsp;name=&amp;quot;UrlHandlerModule&amp;quot;&amp;nbsp;/&amp;gt;--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;remove&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;AuthenticationModule&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;remove&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;CoreRepositoryModule&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;remove&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;NHibernateSessionWebModule&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;add&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;CommunityServer&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;CommunityServer.CSHttpModule,&amp;nbsp;CommunityServer.Components&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;add&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;CSProfile&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Microsoft.ScalableHosting.Profile.ProfileModule,&amp;nbsp;MemberRole,&amp;nbsp;Version=1.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=b7c773fb104e7562&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;add&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;CSRoleManager&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Microsoft.ScalableHosting.Security.RoleManagerModule,&amp;nbsp;MemberRole,&amp;nbsp;Version=1.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=b7c773fb104e7562&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#006400"&gt;&amp;lt;!--&amp;nbsp;&amp;lt;add&amp;nbsp;name=&amp;quot;CSReporting&amp;quot;&amp;nbsp;type=&amp;quot;CommunityServer.Reporting.ReportingHttpModule,&amp;nbsp;CommunityServer.Reporting&amp;quot;&amp;nbsp;/&amp;gt;&amp;nbsp;--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;httpModules&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;httpHandlers&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;remove&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;verb&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;*&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;path&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Error.aspx&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;remove&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;verb&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;*&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;path&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;*.aspx&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;add&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;verb&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;*&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;path&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;*.aspx&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;System.Web.UI.PageHandlerFactory&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;add&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;verb&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;GET&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;path&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Utility/redirect.aspx&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;CommunityServer.Components.Redirect,&amp;nbsp;CommunityServer.Components&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;add&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;verb&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;GET&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;path&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;aggbug.aspx&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;CommunityServer.Components.HttpHandler.AggBugHandler,&amp;nbsp;CommunityServer.Components&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;add&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;verb&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;GET&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;path&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;avatar.aspx&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;CommunityServer.Components.HttpHandler.AvatarHttpHandler,&amp;nbsp;CommunityServer.Components&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;add&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;verb&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;GET&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;path&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;vcard.aspx&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;CommunityServer.Components.HttpHandler.VCardHttpHandler,&amp;nbsp;CommunityServer.Components&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;add&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;verb&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;GET&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;path&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;r.ashx&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;CommunityServer.Components.HttpHandler.TinyUrlHttpHandler,&amp;nbsp;CommunityServer.Components&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;httpHandlers&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=2079" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author><category term="Cuyahoga" scheme="http://www.foderick.com/blogs/onmaterialize/archive/tags/Cuyahoga/default.aspx" /></entry><entry><title>RUAlive - a WPF tool to check if a website is running.</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2007/09/27/RUAlive-_2D00_-a-WPF-tool-to-check-if-a-website-is-running_2E00_.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2007/09/27/RUAlive-_2D00_-a-WPF-tool-to-check-if-a-website-is-running_2E00_.aspx</id><published>2007-09-27T04:27:00Z</published><updated>2007-09-27T04:27:00Z</updated><content type="html">&lt;p&gt;RUAlive is a WPF utility that answers the question &amp;quot;Is my website still running?&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;img alt="RUAlive" height="525" src="http://netknowledgenow.com:81/CS/photos/sample/images/2078/original.aspx" style="width:840px;height:525px;" title="RUAlive" width="840" /&gt;&lt;/p&gt;&lt;p&gt;RUAlive is written using Visual Studio 2008 Beta 2 Orcas. &lt;a href="http://netknowledgenow.com:81/CS/files/folders/samplecode/entry2077.aspx"&gt;Download&amp;nbsp;the source&amp;nbsp;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;To run RUAlive, you can either run the solution or run RUAlive.exe. Of course you need &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=d2f74873-c796-4e60-91c8-f0ef809b09ee&amp;amp;displaylang=en"&gt;.NET 3.5 Beta 2 installed&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;To use RUAlive:&lt;br /&gt;1. Enter the http address of the site you want to monitor&lt;br /&gt;2. Click on Config to enter the contents of the page that you want to search for. Also enter the frequency to perform checks.&lt;br /&gt;3. Close the configuration screen to go back&amp;nbsp;to the main screen and&amp;nbsp;press the Start button.&lt;br /&gt;4. To see any errors hover over the line.&lt;br /&gt;5. To clear the list right-click and select &amp;quot;Clear History&amp;quot;.&lt;/p&gt;&lt;p&gt;RUAlive is not only a simple tool that performs a useful function. It is also demonstates some useful technologies such as&amp;nbsp;Windows Presentation Framework and Domain Driven Design.&lt;/p&gt;&lt;p&gt;The backlog of feature enhancements include:&lt;br /&gt;1. Implement persistence&lt;br /&gt;2. Improve the overall look and feel with images, animation and themes.&lt;br /&gt;3. Enhance the plug-in architecture (similar to the Composite Application Block)&lt;br /&gt;4. Implement some sort of dependency injection&lt;br /&gt;5. Send alerts&lt;br /&gt;6. View response page&lt;br /&gt;7. Make a Vista gadget&lt;br /&gt;8. Lots of other goodies&amp;nbsp;that I can&amp;#39;t recall off the top of my head now.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=2076" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author><category term="WPF RUAlive" scheme="http://www.foderick.com/blogs/onmaterialize/archive/tags/WPF+RUAlive/default.aspx" /></entry><entry><title>Debugging WCF Serialization issues</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2007/03/12/Debugging-WCF-Serialization-issues.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2007/03/12/Debugging-WCF-Serialization-issues.aspx</id><published>2007-03-12T18:50:00Z</published><updated>2007-03-12T18:50:00Z</updated><content type="html">&lt;p&gt;When serializing objects over WCF you might encounter the following not-so-helpful message.&lt;/p&gt;&lt;font size="1"&gt;&lt;p&gt;System.ServiceModel.CommunicationException : The underlying connection was closed: The connection was closed unexpectedly.&lt;/p&gt;&lt;/font&gt;&lt;p&gt;And the&amp;nbsp;Close method of your service proxy&amp;nbsp;may complain that&lt;/p&gt;&lt;font size="1"&gt;&lt;p&gt;System.ServiceModel.Security.MessageSecurityException : An unsecured or incorrectly secured fault was received from the other party. See the inner FaultException for the fault code and detail.&lt;/p&gt;&lt;/font&gt;&lt;p&gt;Which seems to indicate that there is a security exception. However, in my experience, the root problem has usually been a serialization issue.&lt;/p&gt;&lt;p&gt;To debug server-side issues, use a combination of the &lt;a href="http://msdn2.microsoft.com/en-us/library/ms732023.aspx"&gt;SvcTraceViewer.exe&lt;/a&gt;, an indispensible tool for debugging and tracing WCF messages, and simple tracing into the server-side code by &lt;a href="http://msdn2.microsoft.com/en-us/library/c6wf8e4z.aspx"&gt;attaching to the server process&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If indeed you have a serialization issue, you will be able to step through&amp;nbsp;the Service method and the Server stack trace will end right at the point where you return from the service method.&lt;/p&gt;&lt;p&gt;Server stack trace: &lt;br /&gt;&amp;nbsp;&amp;nbsp; at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)&lt;br /&gt;&amp;nbsp;&amp;nbsp; at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)&lt;br /&gt;&amp;nbsp;&amp;nbsp; at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)&lt;br /&gt;...&lt;/p&gt;&lt;p&gt;However, at no point do you actually see the true source of the exception. It seems to get eaten somewhere in the channel.&amp;nbsp;The best way that I have discovered to track down any serialization issues is to write unit tests that manually serialize the objects that pass through the WCF service. My serialization&amp;nbsp;helper is a generic method like this:&lt;/p&gt;&lt;font size="2"&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void LogDTO&amp;lt;TDTO&amp;gt;(TDTO dto)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataContractSerializer ser =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new DataContractSerializer(typeof(TDTO));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileStream writer = new FileStream(@&amp;quot;C:\log\&amp;quot;+dto.GetType().Name+&amp;quot;.xml&amp;quot;, FileMode.Create);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ser.WriteObject(writer, dto);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;The unit test simply calls the LogDTO method for each serializable object.&lt;/font&gt;&lt;font size="2"&gt;&lt;font size="2"&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;Serializer.LogDTO&amp;lt;myDTO&amp;gt;(myDTOInstance); &lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;And now&amp;nbsp;you can resolve any serialization issues with an appropriate stack trace and exception message.&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=2068" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author><category term="WCF" scheme="http://www.foderick.com/blogs/onmaterialize/archive/tags/WCF/default.aspx" /></entry><entry><title>Don't serialize your delegates!</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2007/03/01/Don_2700_t-serialize-your-delegates_2100_.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2007/03/01/Don_2700_t-serialize-your-delegates_2100_.aspx</id><published>2007-03-01T00:29:00Z</published><updated>2007-03-01T00:29:00Z</updated><content type="html">&lt;p&gt;This point is pretty obvious: when&amp;nbsp;serializing objects in order to pass them through a service boundry, you should not bother to serialize the delegates. Since a delegate is a pointer to some method on some object in your memory space, that target object that the delegate points to&amp;nbsp;probably doesn&amp;#39;t exist in the memory space of the other machine! You will encounter this scenario if you create custom events on your business objects and then serialize them through WCF. Remember that&amp;nbsp;a .NET event is just a list of delegates (commonly called the event&amp;#39;s invocation list).&lt;/p&gt;&lt;p&gt;There are two issues that make this problem particularly onerous. First, if there are no subscribers to the event, the serialization works just fine! So your unit tests may work perfect -&amp;nbsp;unless you are the one anal fool that&amp;nbsp;unit tests subscribing to events and serializing those objects. Second, back in the UI, it may not be your code - it may be framework code -&amp;nbsp;that is subscribing to these events and you will only get the SerializationException&amp;nbsp;after you have&amp;nbsp;databound the objects&amp;nbsp;to UI controls and then try to serialize the databound objects.&amp;nbsp;This will happen if for some crazy reason you want to implement &lt;font size="2"&gt;INotifyPropertyChanged on your business entities.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;Fortunately, the problem is pretty obvious when you encounter it. The excetpion message you get in&amp;nbsp;the .NET 3.0 DataContractSerializer&amp;nbsp;is :&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;quot;Type &amp;#39;System.DelegateSerializationHolder+DelegateEntry&amp;#39; with data contract name &amp;#39;DelegateSerializationHolder.DelegateEntry:http://schemas.datacontract.org/2004/07/System&amp;#39; is not expected. Add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.&amp;quot;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Forget .NET&amp;#39;s advice.&amp;nbsp;The way to fix it simple. Just mark your event as NonSerialized.&lt;/p&gt;&lt;font color="#008000" size="2"&gt;&lt;p&gt;[field: NonSerialized]&lt;br /&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;event&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;PropertyChangedEventHandler&lt;/font&gt;&lt;font size="2"&gt; PropertyChanged;&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;p&gt;The bottom line rule&amp;nbsp;is to always mark events with the [field:NonSerialized] attribute on&amp;nbsp;classes whose objects&amp;nbsp;will be serialized accross a service boundry.&lt;/p&gt;&lt;p&gt;Reference: &lt;a href="http://weblogs.asp.net/rosherove/archive/2004/12/29/343659.aspx"&gt;Do not serialize delegates and events blindly&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=2067" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author></entry><entry><title>Upgrade Winforms 2005 project to WPF</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2007/02/24/Upgrade-Winforms-2005-project-to-WPF.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2007/02/24/Upgrade-Winforms-2005-project-to-WPF.aspx</id><published>2007-02-24T17:44:00Z</published><updated>2007-02-24T17:44:00Z</updated><content type="html">&lt;p&gt;Lately I&amp;#39;ve been upgrading my Winforms CAB applications to use the &lt;a href="http://www.codeplex.com/wpfcab"&gt;Windows Presenation Framework version&amp;nbsp;of the Composite Application Block&lt;/a&gt;. This post will explain how you can do an &amp;quot;in place&amp;quot;&amp;nbsp;conversion of your Winform project to WPF.&lt;/p&gt;&lt;p&gt;The normal way to convert a project to WPF would be backup your Winform project, create a new WPF project, recreate all your screens as WPF Windows (or&amp;nbsp;UserControls)&amp;nbsp;and copy and paste the non-visual code from the backup into the new WPF project. That would be the recommended way for most projects, especially if you have many forms&amp;nbsp;or user controls to upgrade. However, I have several projects that have but one view and all that copying and renaming and adding projects seemed like too much rigamarole. Besides, I liked the names of my projects and didn&amp;#39;t want to create new projects with new namespaces and get all the naming right. Plus, I would have to add references, etc.&amp;nbsp;So I decided to perform a manual conversion of&amp;nbsp;some projects to use WPF. Here is how I did it.&lt;/p&gt;&lt;p&gt;First, I will assume that you have your WPF version of your Shell project already created (use the BankTeller WPF example as a guide).&amp;nbsp;This post will only cover the conversion of a module project because its simpler and it shows the general philosophy and gotchas&amp;nbsp;of the conversion.&lt;/p&gt;&lt;p&gt;First, start by ripping out the references to Winforms. Remove the references to System.Windows.Forms and System.Drawing. Add references to WindowsBase, PresentationCore and PresentationFramework. Rename your winforms views to get them out of the way. Create new WPF UserContols to replace&amp;nbsp;the old Winforms views.&amp;nbsp;Recreate your new UI&amp;nbsp;using WPF controls. This could take some effort but&amp;nbsp;if your views are simple and slim then&amp;nbsp;most of your code will be in the Presenter/Controller and it will be a&amp;nbsp;reasonably&amp;nbsp;easy task to recreate the new UI in WPF. Remove the Winform view from the project&amp;nbsp;when you no longer need it.&lt;/p&gt;&lt;p&gt;You can now attempt to build. You &lt;strong&gt;should&lt;/strong&gt; get a cryptic compilation error message that says &lt;strong&gt;&amp;quot;The name &amp;#39;InitializeComponent&amp;#39; does not exist in the current context&amp;quot;&lt;/strong&gt;. Don&amp;#39;t worry, you didn&amp;#39;t do anything wrong. There is one additional step to complete. In order for msbuild to compile your .NET 3.0 project, it needs to know about the WinFX build configuration. This step, which you will do manually, would normally be done automatically when you create a new WPF project instead of converting in-place like I am showing. With one of the files from your project open for editing, right click the name of the file in the editing tab and select &amp;quot;Open Containing Folder&amp;quot;. This will open Windows Explorer in your project folder. Open your .proj file with your favorite editor such as Notepad. Down near the bottom of the file, you will see a line that says:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;lt;Import Project=&amp;quot;$(MSBuildBinPath)\Microsoft.CSharp.targets&amp;quot; /&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Add the following line right below it:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;lt;Import Project=&amp;quot;$(MSBuildBinPath)\Microsoft.WinFX.targets&amp;quot; /&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Save the change and reload the project. Build succeeded!&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=2066" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author><category term="WPF CAB" scheme="http://www.foderick.com/blogs/onmaterialize/archive/tags/WPF+CAB/default.aspx" /></entry><entry><title>Assembly '' was not found. The 'clr-namespace' URI refers to an assembly that is not referenced by the project.	</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2007/01/24/Limited-designer-support-with-WPF-in-Visual-Studio-2005.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2007/01/24/Limited-designer-support-with-WPF-in-Visual-Studio-2005.aspx</id><published>2007-01-24T19:27:00Z</published><updated>2007-01-24T19:27:00Z</updated><content type="html">&lt;p&gt;It almost seems like a cruel joke. Innumerable WPF samples indicate that you can implement databinding in a particular way. However, doing so breaks designer support and you have to rearrange code to reflect the reality of current limitations with Cider. Let me explain what I mean.&lt;/p&gt;&lt;p&gt;When you create XAML&amp;nbsp;markup you are&amp;nbsp;declaratively creating objects with XML. Normally, the XAML tags will create controls like textboxes and&amp;nbsp;labels, etc. But there is nothing to stop you from instantiating model objects in XAML. So, instead of writing&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Person p = new Person();&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;in your code behind, you can instantiate a person like this&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;lt;Window.Resources&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;local:Person x:Key=&amp;quot;myDataSource&amp;quot; Name=&amp;quot;Joe&amp;quot;/&amp;gt;&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;or like this&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;lt;Window.Resources&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;ObjectDataProvider x:Key=&amp;quot;myDataSource&amp;quot; ObjectType=&amp;quot;{x:Type local:Person}&amp;quot; /&amp;gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The XML namespaces (local and x above) have to be registered at the top of your file like this:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;xmlns:x=&amp;quot;&lt;/strong&gt;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml"&gt;&lt;strong&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;quot;&lt;br /&gt;xmlns:local=&amp;quot;clr-namespace:YourProjectNamespace&amp;quot;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;You can then databind to the person object like this:&lt;/p&gt;&lt;p&gt;&amp;lt;TextBlock Text=&amp;quot;{Binding Source={StaticResource myDataSource}, Path=Name}&amp;quot;/&amp;gt;&lt;/p&gt;&lt;p&gt;Make sure you put the Window.Resource element above the TextBlock element otherwise your datasource won&amp;#39;t exist at the time you are databinding and you will get a null reference exception.&amp;nbsp;Finally, can run the sample and it will execute perfectly. But don&amp;#39;t venture into the designer! If you do, you get a nasty error in the error list:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Assembly &amp;#39;&amp;#39; was not found. The &amp;#39;clr-namespace&amp;#39; URI refers to an assembly that is not referenced by the project.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;There is no designer support for declaratively created model object in the current release that I know of. To get designer support for these types of pages, rip out the dynamically created object and change the codebehind to instantiate and object explicitly and bind up the object to the context.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Window1()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();&lt;br /&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Parent p = new Parent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.DataContext = p;&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=2054" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author></entry><entry><title>January 2007 Orcas CTP: Don't bother</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2007/01/22/January-2007-Orcas-CTP_3A00_-Don_2700_t-bother.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2007/01/22/January-2007-Orcas-CTP_3A00_-Don_2700_t-bother.aspx</id><published>2007-01-22T20:54:00Z</published><updated>2007-01-22T20:54:00Z</updated><content type="html">I spent the better part of a day downloading and setting up the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=1FF0B35D-0C4A-40B4-915A-5331E11C39E6&amp;amp;displaylang=en"&gt;new Orcas&lt;/a&gt; in anticipation of playing with .NET 3.0 and 3.5 (Greenbits). Unless you want to play with Entity Framework in its &amp;quot;Raw&amp;quot; format (no visual designer) stay away from this download - its problems are &lt;a href="http://bloggingabout.net/blogs/erwyn/archive/2007/01/12/visual-studio-orcas-january-2007-ctp.aspx"&gt;detailed here&lt;/a&gt;. The bottom line is its not configured to do .NET 3.0 development. I just don&amp;#39;t really see any reason why this CTP release was even attempted. Let&amp;#39;s hope the February CTP is a lot better.&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=2053" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author></entry><entry><title>New project for 2007</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2007/01/21/New-project-for-2007.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2007/01/21/New-project-for-2007.aspx</id><published>2007-01-21T22:00:00Z</published><updated>2007-01-21T22:00:00Z</updated><content type="html">&lt;p&gt;Next week I start a new project for one of my clients. Its a premier project for the company that will be using the latest .NET 3.0 technologies: Windows Presentation Foundation, Windows Workflow Foundation and Windows Communication Foundataion. The best part of it is that the team will be comprised of a small number (6) of incredibly smart developers - some of the best in the region. Architecturally speaking, the most interesting piece will be designing and implementing the &lt;a href="http://www.microsoft.com/biztalk/solutions/soa/esb.mspx"&gt;Enterprise Service Bus&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Stay tuned throughout the year as I share through&amp;nbsp;my blog&amp;nbsp;any insights that I gain - at least anything that&amp;#39;s not proprietary.&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=2052" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author></entry><entry><title>Control WCF Serialization of Collections with IXmlSerializable</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2007/01/18/Control-WCF-Serialization-of-Collections-with-IXmlSerializable.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2007/01/18/Control-WCF-Serialization-of-Collections-with-IXmlSerializable.aspx</id><published>2007-01-18T18:56:00Z</published><updated>2007-01-18T18:56:00Z</updated><content type="html">&lt;p&gt;WCF doesn&amp;#39;t always serialize custom collections of objects the way that you would like. For example, a Family may have a collection of Members.&lt;/p&gt;&lt;pre&gt;    public class SerializeObjectModel
    {
        [DataContract(Name = &amp;quot;Family&amp;quot;)]
        public class Family
        {
            [DataMember(Name = &amp;quot;Members&amp;quot;)]
            public FamilyMembers MembersList = new FamilyMembers();
        }

        public class FamilyMembers : List&amp;lt;string&amp;gt;
        {
        }
}&lt;/pre&gt;&lt;p&gt;If you load up the list with some data and serialize it through WCF (WCF uses the DataContractSerializer by default to serialize objects so you can simulate serialization in a test harness by calling the class directly) &lt;/p&gt;&lt;pre&gt;            Family f = new Family();
            f.MembersList.Add(&amp;quot;A&amp;quot;);
            f.MembersList.Add(&amp;quot;B&amp;quot;);
            f.MembersList.Add(&amp;quot;C&amp;quot;);
            f.MembersList.Add(&amp;quot;D&amp;quot;);
            ...
            DataContractSerializer ser = new DataContractSerializer(typeof(Family));
            ser.WriteObject(cwriter, f);

&lt;/pre&gt;&lt;p&gt;It will serialize like this: &lt;/p&gt;&lt;pre&gt;  &amp;lt;Family xmlns:i=&amp;quot;&lt;a href="http://www.w3.org/2001/XMLSchema-instance"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/a&gt;&amp;quot; xmlns=&amp;quot;&lt;a href="http://schema/"&gt;http://schema/&lt;/a&gt;&lt;br /&gt;
s.datacontract.org/2004/07/ObjectModel&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;Members xmlns:d2p1=&amp;quot;&lt;a href="http://schemas.microsoft.com/2003/10/Serialization/Arrays"&gt;http://schemas.microsoft.com/2003/10/Serialization/Arrays&lt;/a&gt;&lt;br /&gt;
&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;d2p1:string&amp;gt;A&amp;lt;/d2p1:string&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;d2p1:string&amp;gt;B&amp;lt;/d2p1:string&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;d2p1:string&amp;gt;C&amp;lt;/d2p1:string&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;d2p1:string&amp;gt;D&amp;lt;/d2p1:string&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/Members&amp;gt;&lt;br /&gt;
&amp;lt;/Family&amp;gt;  

&lt;/pre&gt;&lt;p&gt;That&amp;#39;s fine. Now you add some additional members to the FamilyMembers class, maybe a list of family members that have been deleted fromt the list (granny passed away, RIP). &lt;/p&gt;&lt;pre&gt;        public class FamilyMembers : List &amp;lt;string&amp;gt;
        {
&lt;strong&gt;            //DKF: added this list
            public List&amp;lt;string&amp;gt; DeletedList = new List&amp;lt;string&amp;gt;();&lt;/strong&gt;

&lt;/pre&gt;You run it through the WCF Serializer &lt;pre&gt;            Family f = new Family();
            f.MembersList.Add(&amp;quot;A&amp;quot;);
            ...
            //WANT TO GET THIS SERIALIZED TOO!
            f.MembersList.DeletedList.Add(&amp;quot;Dave Foderick&amp;quot;);&lt;/pre&gt;&lt;p&gt;and you don&amp;#39;t see the deleted list! It looks exactly like the previous output. If the deleted list never gets to the other end of the wire then they never get removed from the database. &lt;/p&gt;&lt;p&gt;To get the list to serialize the way we would like, we have to get control of how WCF serialized it. &lt;a href="http://blogs.msdn.com/sowmy/archive/2006/02/22/536747.aspx"&gt;This post&lt;/a&gt; is the golden nugget that describes the precedence of how lists are serialized. You see that what is serializing our list is #6 which apparently iterates through the collection and spits out the members, ignoring anything else that may be of interest to us on the list iteself. The only hook into the serialization process that has higher prececedence and will allow us the flexibility (CollectionDataContractAttribute won&amp;#39;t do!) is IXmlSerializable. So modify the collection class to implement that interface.&lt;/p&gt;&lt;pre&gt;        public class FamilyMembers : List&amp;lt;string&amp;gt; , IXmlSerializable
        {
            //DKF: added this list
            public List&amp;lt;string&amp;gt; DeletedList = new List&amp;lt;string&amp;gt;();

            #region IXmlSerializable Members

            public System.Xml.Schema.XmlSchema GetSchema()
            {
                return null;
            }

            public void ReadXml(XmlReader reader)
            {
                throw new Exception(&amp;quot;The method or operation is not implemented.&amp;quot;);
            }

            public void WriteXml(XmlWriter writer)
            {
                //First, serialize all the items in the base list
                writer.WriteStartElement(&amp;quot;Items&amp;quot;);
                foreach (string item in this)
                {
                    writer.WriteElementString(&amp;quot;Member&amp;quot;, item);
                }
                writer.WriteEndElement();

                //now, serialize all the items in the deleted list
                writer.WriteStartElement(&amp;quot;DeletedItems&amp;quot;);
                foreach (string deletedItem in DeletedList)
                {
                    writer.WriteElementString(&amp;quot;Member&amp;quot;, deletedItem);
                }
                writer.WriteEndElement();
            }

&lt;/pre&gt;&lt;p&gt;More code to write for sure but victory is ours!&lt;/p&gt;&lt;p&gt;&amp;lt;Family xmlns:i=&amp;quot;&lt;a href="http://www.w3.org/2001/XMLSchema-instance"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/a&gt;&amp;quot; xmlns=&amp;quot;&lt;a href="http://schema"&gt;http://schema&lt;/a&gt;&lt;br /&gt;s.datacontract.org/2004/07/ObjectModel&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Members&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Items&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Member&amp;gt;A&amp;lt;/Member&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Member&amp;gt;B&amp;lt;/Member&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Member&amp;gt;C&amp;lt;/Member&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Member&amp;gt;D&amp;lt;/Member&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Items&amp;gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DeletedItems&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Member&amp;gt;Dave Foderick&amp;lt;/Member&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DeletedItems&amp;gt;&lt;br /&gt;&lt;/strong&gt;&amp;nbsp; &amp;lt;/Members&amp;gt;&lt;br /&gt;&amp;lt;/Family&amp;gt;&lt;/p&gt;&lt;p&gt;To get this working right in a real app, you have to write the deserialization logic too. Here is a more realistic implementation (TDto is a generic parameter for a custom class that replaces string in the above samples).&lt;/p&gt;&lt;pre&gt;        #region IXmlSerializable Members

        /// 
        /// Get xml schema
        /// In this case, we don&amp;#39;t have any
        /// 
        /// 
        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }

        private DataContractSerializer GetSerializer()
        {
            Type dtoType = typeof(TDto);
            DataContractSerializer ser = new DataContractSerializer(dtoType);
            return ser;
        }

        /// 
        /// Deserialize the object
        /// 
        /// 

        public void ReadXml(XmlReader reader)
        {
            DataContractSerializer ser = GetSerializer();

            //read past the first element. This is the outermost element for the list
            reader.ReadStartElement();

            //read in the undeleted objects
            ReadXmlObjects(reader, &amp;quot;Items&amp;quot;, this);

            //now read in the deleted list
            ReadXmlObjects(reader, &amp;quot;DeletedItems&amp;quot;, this._deletedList);
        }

        private string PrefixedElementName(XmlReader reader, string elementName)
        {
            string retval = reader.Prefix;
            if (reader.Prefix.Length &amp;gt; 0)
            {
                retval += &amp;quot;:&amp;quot;;
            }
            retval += elementName;
            return retval;
        }

        /// 
        /// read objects into list
        /// 
        /// 

        /// 

        /// 

        private void ReadXmlObjects(XmlReader reader,string elementName, IList list)
        {
            DataContractSerializer ser = GetSerializer();

            Type dtoType = typeof(TDto);
            string prefixedCollection = PrefixedElementName(reader,elementName);
            if (reader.IsStartElement(prefixedCollection))
            {
                reader.ReadStartElement();
                //TODO: very tricky!
                //element name must match classname. Is this always true???
                //another strategy is to embed a count of the number of object to 
                //read inside the xml. Then this code can be a foreach
                string prefixedClassName = PrefixedElementName(reader,dtoType.Name);
                while (reader.IsStartElement(prefixedClassName))
                {
                    TDto dto = (TDto)ser.ReadObject(reader);
                    list.Add(dto);
                }
                if (reader.IsStartElement() == false)
                {
                    reader.ReadEndElement();
                }
            }
        }

        /// 
        /// Serialize the object
        /// 
        /// 

        public void WriteXml(System.Xml.XmlWriter writer)
        {
            //This is the WCF default Serializer
            DataContractSerializer ser = new DataContractSerializer(typeof(TDto));

            //First, serialize all the items in the base list
            writer.WriteStartElement(&amp;quot;Items&amp;quot;);
            foreach (TDto item in this)
            {
                ser.WriteObject(writer, item);
            }
            writer.WriteEndElement();
            //ser.WriteObject(writer, this.Items);

            //now, serialize all the items in the deleted list
            writer.WriteStartElement(&amp;quot;DeletedItems&amp;quot;);
            foreach (TDto deletedItem in _deletedList)
            {
                ser.WriteObject(writer, deletedItem);
            }
            //ser.WriteObject(writer, _deletedList);
            writer.WriteEndElement();

        }

        #endregion
&lt;/pre&gt;&lt;pre&gt;&lt;a href="http://netknowledgenow.com:81/CS/files/folders/samplecode/entry2051.aspx"&gt;Download my test harness with sample code&lt;/a&gt;.&lt;/pre&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=2050" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author><category term="WCF" scheme="http://www.foderick.com/blogs/onmaterialize/archive/tags/WCF/default.aspx" /></entry><entry><title>NHibernate on ASP 2.0 Web Site Project and 2005 Web Developer Express</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2007/01/18/NHibernate-on-ASP-2.0-Web-Site-Project-and-2005-Web-Developer-Express.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2007/01/18/NHibernate-on-ASP-2.0-Web-Site-Project-and-2005-Web-Developer-Express.aspx</id><published>2007-01-18T17:11:00Z</published><updated>2007-01-18T17:11:00Z</updated><content type="html">&lt;p&gt;Many people (including myself) have had difficulties getting NHibernate to work with ASP.NET 2.0. The usual problem centers around how to get NHibernate to read in the configuration files for your entites and the problem is exacerbated by ASP.NET 2.0&amp;#39;s new&amp;nbsp;dynamic compilation&amp;nbsp;model. I can tell you that it is possible to make it work&amp;nbsp;and here is how I did it.&lt;/p&gt;&lt;p&gt;In ASP.NET 1.1 you could specify that&amp;nbsp;configuration files, such as hbm.xml files, could be embedded resources which meant that they would get baked into the single dll produced from building your web site. You could let NHibernate know about all your entities by simply pointing it to the single dll &lt;/p&gt;&lt;pre&gt;Configuration cfg = new Configuration();
cfg.AddAssembly(&amp;quot;MySite.dll&amp;quot;);
&lt;/pre&gt;&lt;p&gt;This technique also works in 2.0 if you use the &lt;a href="http://msdn2.microsoft.com/en-us/asp.net/aa336618.aspx"&gt;Web Application Project&amp;nbsp;compilation model&lt;/a&gt; because it works like 1.1 and builds a single dll and allows you to embed resources into that dll. But it won&amp;#39;t work if you use the default&amp;nbsp;&lt;a href="http://weblogs.asp.net/scottgu/archive/2005/08/21/423201.aspx"&gt;Web Site Project compilation model&lt;/a&gt; or Express. Both of the latter use a dynamic compilation model where you can just copy .cs to the web site and it automatically compiles. And, as far as I know, there is no way to embed the xml configuration files into the resultant dll.&lt;/p&gt;&lt;p&gt;So to make it work in 2.0 here is the most direct solution. First, put all your hbm.xml files into the same directory on the server. This could be App_Code or App_Data or whevever you keep your entity classes (which should be somewhere under App_Code) or anywhere else on the web site. I put them in App_Code\Resources. Then, configure NHibernate with the AddXmlFile method giving it each and every configuration file that you have,&amp;nbsp;like this:&lt;/p&gt;&lt;pre&gt;Configuration cfg = new Configuration(); 
string basePath = System.Web.HttpContext.Current.Server.MapPath(@&amp;quot;~/App_Code/Resources/&amp;quot;); 
cfg.AddXmlFile(basePath+&amp;quot;Customer.hbm.xml&amp;quot;);
cfg.AddXmlFile(basePath+&amp;quot;Order.hbm.xml&amp;quot;);
&lt;/pre&gt;&lt;p&gt;Note that you have to add a line for each configuration file, which kinda sucks when you have to add more hbm.xml files to your project.&lt;/p&gt;&lt;p&gt;The last trick to get this working is to fix up the hbm.xml files themselves. Had you&amp;nbsp;have been&amp;nbsp;building a site to one specific dll (Web Project compilation, VS2003)&amp;nbsp;then all your types live in that dll and it is easy to tell the xml file where the type lives. With dynamic compilation in&amp;nbsp;ASP.NET 2.0&amp;nbsp;where does your entity type live? Well, if you put your entity class anywhere under the Add_Code directory it will be compiled into the App_Code.dll. Therefore, just make sure you place your entity classes somewhere under the App_Code directory and then&amp;nbsp;modify your hbm.xml files to reference your entity types in App_Code.dll. Here is what my hbm.xml file starts with.&lt;/p&gt;&lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt; &lt;br /&gt;&amp;lt;hibernate-mapping xmlns=&amp;quot;urn:nhibernate-mapping-2.0&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;class name=&amp;quot;Domain.Portfolio, App_Code&amp;quot; table=&amp;quot;PortfolioHead&amp;quot;&amp;gt; &lt;br /&gt;... &lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Note that this is for NHibernate 1.0. Your mapping version may need to be something different. Use whatever is appropriate for your version of NHibernate. NHibernate and ASP.NET are now one with each other.&lt;/p&gt;&lt;p&gt;This topic was discussed on the &lt;a href="http://forum.hibernate.org/viewtopic.php?t=969413&amp;amp;start=0&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;highlight="&gt;NHibernate forum&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=2049" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author><category term="NHibernate" scheme="http://www.foderick.com/blogs/onmaterialize/archive/tags/NHibernate/default.aspx" /></entry><entry><title>Study Links for 70-553: Upgrade to Enterprise Developer</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2006/12/16/Study-Links-for-70_2D00_553_3A00_-Upgrade-to-Enterprise-Developer.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2006/12/16/Study-Links-for-70_2D00_553_3A00_-Upgrade-to-Enterprise-Developer.aspx</id><published>2006-12-16T21:48:00Z</published><updated>2006-12-16T21:48:00Z</updated><content type="html">&lt;p&gt;Since I have a couple of exam certificates that are expiring at the end of the year, I&amp;#39;ve decided to use them to get certified as an Enterprise Developer. The upgrade is spread over two exams 70-553 and 70-554. On 70-553 there are three parts that correspond to three other microsoft exams: Fundamentals, Web and Windows. Since I already have links for the Fundamentals and Web exams elsewhere&amp;nbsp;on my blog, I&amp;#39;m just going to list the ones covered here for the Windows portion.&lt;/p&gt;&lt;p&gt;Section 3&lt;br /&gt;&lt;strong&gt;Creating a UI for a Windows Forms Application by Using Standard Controls &lt;br /&gt;&lt;p&gt;Manage control layout on a Windows Form. &lt;/p&gt;&lt;p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Group and arrange controls by using the Panel control, GroupBox control, TabControl control, FlowLayoutPanel control, and TableLayoutPanel control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the SplitContainer control to create dynamic container areas. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Add and configure a Windows Forms control. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the integrated development environment (IDE) to add a control to a Windows Form or other container control of a project at design time. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Add controls to a Windows Form at run time. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure controls on a Windows Form at design time to optimize the UI. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Modify control properties. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure controls on a Windows Form at run time to ensure that the UI complies with best practices. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure command controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure text edit controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure text display controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the LinkLabel control to add Web-style links to Windows Forms applications. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Provide a list of options on a Windows Form by using a ListBox control, a ComboBox control, or a CheckedListBox control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the layout and functionality of a Windows Form to display a list of items. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Implement value-setting controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a WebBrowser control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Add and configure date-setting controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Display images by using Windows Forms controls. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the NotifyIcon component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create access keys for Windows Forms controls. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Create and configure menus. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure a MenuStrip component on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Change the displayed menu structure programmatically. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure the ContextMenuStrip component on a Windows Form.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;strong&gt;Integrating Data in a Windows Forms Application &lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Implement data-bound controls. &lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the DataGridView control to display and update the tabular data contained in a data source. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use a simple data-bound control to display a single data element on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Implement complex data binding to integrate data from multiple sources. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Navigate forward and backward through records in a DataSet in Windows Forms. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Define a data source by using a DataConnector component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create data forms by using the Data Form Wizard.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="dataTable" id="ETAAC"&gt;&lt;tr class="evenRecord"&gt;&lt;td&gt;&lt;p&gt;Manage connections and transactions. &lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a connection to a database by using the Connection Wizard. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a connection to a database by using Server Explorer. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a connection to a database by using the Connection class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Connect to a database by using specific database Connection objects. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Enumerate through instances of Microsoft SQL Server. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Open an ADO.NET connection to a database. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Close an ADO.NET connection to a database by using the Close method of the Connection object. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Protect access to data source connection details. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create a connection designed for reuse in a connection pool. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Control a connection pool by configuring ConnectionString values based on database type. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the Connection events to detect database information. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Handle exceptions when connecting to a database. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Perform transactions by using the Transaction object. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;img alt="The course includes material to prepare you for this task" height="13" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/icons/ms_compare3.gif" width="13" /&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center" style="border-right:#cccccc 1px solid;"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="record"&gt;&lt;td&gt;&lt;p&gt;Read, write, and validate XML by using the XmlReader class and the XmlWriter class. &lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read XML data by using the XmlReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read all XML element and attribute content. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read specific element and attribute content. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read XML data by using the XmlTextReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read node trees by using the XmlNodeReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Validate XML data by using the XmlValidatingReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Write XML data by using the XmlWriter class.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;strong&gt;Enhancing Usability&lt;/strong&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Create, configure, and customize user assistance controls and components. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms171823.aspx" target="_blank"&gt;Configure the PropertyGrid component&lt;/a&gt;. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the ProgressBar control to indicate progress graphically. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Display status information by using the StatusStrip control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the ToolTip component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.errorprovider.aspx" target="_blank"&gt;ErrorProvider&lt;/a&gt; component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.helpprovider.aspx" target="_blank"&gt;HelpProvider&lt;/a&gt; component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Play system sounds and audio files by using the &lt;a href="http://msdn2.microsoft.com/en-us/library/w5bfdtza.aspx" target="_blank"&gt;SoundPlayer&lt;/a&gt;. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.timer.aspx" target="_blank"&gt;Timer&lt;/a&gt; component to raise an event at regular intervals. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Enable scrolling by using the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.hscrollbar.aspx" target="_blank"&gt;HScrollBar&lt;/a&gt; and &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.hscrollbar.aspx" target="_blank"&gt;VScrollBar&lt;/a&gt; controls.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;strong&gt;Implementing Asynchronous Programming Techniques to Improve the User Experience&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Manage a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Run a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Announce the completion of a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Cancel a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Report the progress of a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Request the status of a background process by using the BackgroundWorker component.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;strong&gt;Configuring and Deploying Applications&lt;/strong&gt; &lt;br /&gt;&lt;p&gt;Configure the installation of a Windows Forms application by using ClickOnce technology.&lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Install a Windows Forms application on a client computer by using ClickOnce deployment. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Install a Windows Forms application from a server by using ClickOnce deployment. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the required permissions of an application by using ClickOnce deployment.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Manage control layout on a Windows Form. &lt;/p&gt;&lt;p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Group and arrange controls by using the Panel control, GroupBox control, TabControl control, FlowLayoutPanel control, and TableLayoutPanel control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the SplitContainer control to create dynamic container areas. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Add and configure a Windows Forms control. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the integrated development environment (IDE) to add a control to a Windows Form or other container control of a project at design time. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Add controls to a Windows Form at run time. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure controls on a Windows Form at design time to optimize the UI. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Modify control properties. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure controls on a Windows Form at run time to ensure that the UI complies with best practices. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure command controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure text edit controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure text display controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the LinkLabel control to add Web-style links to Windows Forms applications. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Provide a list of options on a Windows Form by using a ListBox control, a ComboBox control, or a CheckedListBox control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the layout and functionality of a Windows Form to display a list of items. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Implement value-setting controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a WebBrowser control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Add and configure date-setting controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Display images by using Windows Forms controls. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the NotifyIcon component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create access keys for Windows Forms controls. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Create and configure menus. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure a MenuStrip component on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Change the displayed menu structure programmatically. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure the ContextMenuStrip component on a Windows Form.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;strong&gt;Integrating Data in a Windows Forms Application &lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Implement data-bound controls. &lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the DataGridView control to display and update the tabular data contained in a data source. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use a simple data-bound control to display a single data element on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Implement complex data binding to integrate data from multiple sources. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Navigate forward and backward through records in a DataSet in Windows Forms. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Define a data source by using a DataConnector component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create data forms by using the Data Form Wizard.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="dataTable" id="ETAAC"&gt;&lt;tr class="evenRecord"&gt;&lt;td&gt;&lt;p&gt;Manage connections and transactions. &lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a connection to a database by using the Connection Wizard. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a connection to a database by using Server Explorer. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a connection to a database by using the Connection class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Connect to a database by using specific database Connection objects. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Enumerate through instances of Microsoft SQL Server. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Open an ADO.NET connection to a database. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Close an ADO.NET connection to a database by using the Close method of the Connection object. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Protect access to data source connection details. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create a connection designed for reuse in a connection pool. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Control a connection pool by configuring ConnectionString values based on database type. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the Connection events to detect database information. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Handle exceptions when connecting to a database. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Perform transactions by using the Transaction object. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;img alt="The course includes material to prepare you for this task" height="13" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/icons/ms_compare3.gif" width="13" /&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center" style="border-right:#cccccc 1px solid;"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="record"&gt;&lt;td&gt;&lt;p&gt;Read, write, and validate XML by using the XmlReader class and the XmlWriter class. &lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read XML data by using the XmlReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read all XML element and attribute content. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read specific element and attribute content. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read XML data by using the XmlTextReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read node trees by using the XmlNodeReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Validate XML data by using the XmlValidatingReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Write XML data by using the XmlWriter class.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;strong&gt;Enhancing Usability&lt;/strong&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Create, configure, and customize user assistance controls and components. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms171823.aspx" target="_blank"&gt;Configure the PropertyGrid component&lt;/a&gt;. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the ProgressBar control to indicate progress graphically. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Display status information by using the StatusStrip control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the ToolTip component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.errorprovider.aspx" target="_blank"&gt;ErrorProvider&lt;/a&gt; component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.helpprovider.aspx" target="_blank"&gt;HelpProvider&lt;/a&gt; component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Play system sounds and audio files by using the &lt;a href="http://msdn2.microsoft.com/en-us/library/w5bfdtza.aspx" target="_blank"&gt;SoundPlayer&lt;/a&gt;. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.timer.aspx" target="_blank"&gt;Timer&lt;/a&gt; component to raise an event at regular intervals. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Enable scrolling by using the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.hscrollbar.aspx" target="_blank"&gt;HScrollBar&lt;/a&gt; and &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.hscrollbar.aspx" target="_blank"&gt;VScrollBar&lt;/a&gt; controls.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;strong&gt;Implementing Asynchronous Programming Techniques to Improve the User Experience&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Manage a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Run a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Announce the completion of a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Cancel a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Report the progress of a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Request the status of a background process by using the BackgroundWorker component.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;strong&gt;Configuring and Deploying Applications&lt;/strong&gt; &lt;br /&gt;&lt;p&gt;Configure the installation of a Windows Forms application by using ClickOnce technology.&lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Install a Windows Forms application on a client computer by using ClickOnce deployment. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Install a Windows Forms application from a server by using ClickOnce deployment. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the required permissions of an application by using ClickOnce deployment.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;Manage control layout on a Windows Form. &lt;/p&gt;&lt;p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Group and arrange controls by using the Panel control, GroupBox control, TabControl control, FlowLayoutPanel control, and TableLayoutPanel control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the SplitContainer control to create dynamic container areas. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Add and configure a Windows Forms control. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the integrated development environment (IDE) to add a control to a Windows Form or other container control of a project at design time. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Add controls to a Windows Form at run time. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure controls on a Windows Form at design time to optimize the UI. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Modify control properties. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure controls on a Windows Form at run time to ensure that the UI complies with best practices. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure command controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure text edit controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure text display controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the LinkLabel control to add Web-style links to Windows Forms applications. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Provide a list of options on a Windows Form by using a ListBox control, a ComboBox control, or a CheckedListBox control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the layout and functionality of a Windows Form to display a list of items. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Implement value-setting controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a WebBrowser control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Add and configure date-setting controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Display images by using Windows Forms controls. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the NotifyIcon component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create access keys for Windows Forms controls. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Create and configure menus. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure a MenuStrip component on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Change the displayed menu structure programmatically. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure the ContextMenuStrip component on a Windows Form.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;strong&gt;Integrating Data in a Windows Forms Application &lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Implement data-bound controls. &lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the DataGridView control to display and update the tabular data contained in a data source. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use a simple data-bound control to display a single data element on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Implement complex data binding to integrate data from multiple sources. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Navigate forward and backward through records in a DataSet in Windows Forms. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Define a data source by using a DataConnector component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create data forms by using the Data Form Wizard.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="dataTable" id="ETAAC"&gt;&lt;tr class="evenRecord"&gt;&lt;td&gt;&lt;p&gt;Manage connections and transactions. &lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a connection to a database by using the Connection Wizard. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a connection to a database by using Server Explorer. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a connection to a database by using the Connection class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Connect to a database by using specific database Connection objects. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Enumerate through instances of Microsoft SQL Server. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Open an ADO.NET connection to a database. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Close an ADO.NET connection to a database by using the Close method of the Connection object. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Protect access to data source connection details. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create a connection designed for reuse in a connection pool. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Control a connection pool by configuring ConnectionString values based on database type. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the Connection events to detect database information. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Handle exceptions when connecting to a database. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Perform transactions by using the Transaction object. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;img alt="The course includes material to prepare you for this task" height="13" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/icons/ms_compare3.gif" width="13" /&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center" style="border-right:#cccccc 1px solid;"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="record"&gt;&lt;td&gt;&lt;p&gt;Read, write, and validate XML by using the XmlReader class and the XmlWriter class. &lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read XML data by using the XmlReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read all XML element and attribute content. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read specific element and attribute content. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read XML data by using the XmlTextReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read node trees by using the XmlNodeReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Validate XML data by using the XmlValidatingReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Write XML data by using the XmlWriter class.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;strong&gt;Enhancing Usability&lt;/strong&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Create, configure, and customize user assistance controls and components. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms171823.aspx" target="_blank"&gt;Configure the PropertyGrid component&lt;/a&gt;. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the ProgressBar control to indicate progress graphically. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Display status information by using the StatusStrip control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the ToolTip component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the ErrorProvider component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the HelpProvider component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Play system sounds and audio files by using the SoundPlayer. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the Timer component to raise an event at regular intervals. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Enable scrolling by using the HScrollBar and VScrollBar controls.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;strong&gt;Implementing Asynchronous Programming Techniques to Improve the User Experience&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Manage a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Run a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Announce the completion of a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Cancel a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Report the progress of a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Request the status of a background process by using the BackgroundWorker component.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;strong&gt;Configuring and Deploying Applications&lt;/strong&gt; &lt;br /&gt;&lt;p&gt;Configure the installation of a Windows Forms application by using ClickOnce technology.&lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Install a Windows Forms application on a client computer by using ClickOnce deployment. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Install a Windows Forms application from a server by using ClickOnce deployment. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the required permissions of an application by using ClickOnce deployment.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;Manage control layout on a Windows Form. &lt;/p&gt;&lt;p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Group and arrange controls by using the Panel control, GroupBox control, TabControl control, FlowLayoutPanel control, and TableLayoutPanel control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the SplitContainer control to create dynamic container areas. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Add and configure a Windows Forms control. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the integrated development environment (IDE) to add a control to a Windows Form or other container control of a project at design time. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Add controls to a Windows Form at run time. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure controls on a Windows Form at design time to optimize the UI. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Modify control properties. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure controls on a Windows Form at run time to ensure that the UI complies with best practices. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure command controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure text edit controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure text display controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the LinkLabel control to add Web-style links to Windows Forms applications. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Provide a list of options on a Windows Form by using a ListBox control, a ComboBox control, or a CheckedListBox control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the layout and functionality of a Windows Form to display a list of items. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Implement value-setting controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a WebBrowser control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Add and configure date-setting controls on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Display images by using Windows Forms controls. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the NotifyIcon component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create access keys for Windows Forms controls. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Create and configure menus. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure a MenuStrip component on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Change the displayed menu structure programmatically. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create and configure the ContextMenuStrip component on a Windows Form.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;strong&gt;Integrating Data in a Windows Forms Application &lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Implement data-bound controls. &lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the DataGridView control to display and update the tabular data contained in a data source. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use a simple data-bound control to display a single data element on a Windows Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Implement complex data binding to integrate data from multiple sources. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Navigate forward and backward through records in a DataSet in Windows Forms. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Define a data source by using a DataConnector component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create data forms by using the Data Form Wizard.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="dataTable" id="ETAAC"&gt;&lt;tr class="evenRecord"&gt;&lt;td&gt;&lt;p&gt;Manage connections and transactions. &lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a connection to a database by using the Connection Wizard. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a connection to a database by using Server Explorer. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure a connection to a database by using the Connection class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Connect to a database by using specific database Connection objects. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Enumerate through instances of Microsoft SQL Server. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Open an ADO.NET connection to a database. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Close an ADO.NET connection to a database by using the Close method of the Connection object. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Protect access to data source connection details. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Create a connection designed for reuse in a connection pool. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Control a connection pool by configuring ConnectionString values based on database type. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Use the Connection events to detect database information. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Handle exceptions when connecting to a database. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Perform transactions by using the Transaction object. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;img alt="The course includes material to prepare you for this task" height="13" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/icons/ms_compare3.gif" width="13" /&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td align="center" style="border-right:#cccccc 1px solid;"&gt;&lt;br /&gt;&lt;p class="lastInCell"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="record"&gt;&lt;td&gt;&lt;p&gt;Read, write, and validate XML by using the XmlReader class and the XmlWriter class. &lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read XML data by using the XmlReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read all XML element and attribute content. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read specific element and attribute content. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read XML data by using the XmlTextReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Read node trees by using the XmlNodeReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Validate XML data by using the XmlValidatingReader class. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Write XML data by using the XmlWriter class.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;strong&gt;Enhancing Usability&lt;/strong&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Create, configure, and customize user assistance controls and components. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the PropertyGrid component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the ProgressBar control to indicate progress graphically. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Display status information by using the StatusStrip control. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the ToolTip component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the ErrorProvider component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the HelpProvider component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Play system sounds and audio files by using the SoundPlayer. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the Timer component to raise an event at regular intervals. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Enable scrolling by using the HScrollBar and VScrollBar controls.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;strong&gt;Implementing Asynchronous Programming Techniques to Improve the User Experience&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Manage a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;p class="lastInCell"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Run a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Announce the completion of a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Cancel a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Report the progress of a background process by using the BackgroundWorker component. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Request the status of a background process by using the BackgroundWorker component.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;strong&gt;Configuring and Deploying Applications&lt;/strong&gt; &lt;br /&gt;&lt;p&gt;Configure the installation of a Windows Forms application by using ClickOnce technology.&lt;/p&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Install a Windows Forms application on a client computer by using ClickOnce deployment. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Install a Windows Forms application from a server by using ClickOnce deployment. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="listBullet"&gt;&amp;bull;&lt;/td&gt;&lt;td class="listItem"&gt;&lt;p class="lastInCell"&gt;Configure the required permissions of an application by using ClickOnce deployment.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=2048" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author><category term="Certification" scheme="http://www.foderick.com/blogs/onmaterialize/archive/tags/Certification/default.aspx" /></entry><entry><title>Welcome, PJ!</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2006/11/19/Welcome_2C00_-PJ_2100_.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2006/11/19/Welcome_2C00_-PJ_2100_.aspx</id><published>2006-11-19T20:54:00Z</published><updated>2006-11-19T20:54:00Z</updated><content type="html">&lt;p&gt;My first son was born to us this week, entering into the world happy and alert. What a change! Now my days are filled with baby bottles and diaper changing. Here&amp;#39;s a look at him during the weigh in.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img align="left" alt="Baby PJ" height="375" src="http://netknowledgenow.com:81/CS/photos/peter2006/images/1935/500x375.aspx" style="width:500px;height:375px;" title="Baby PJ" width="500" /&gt;&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=2025" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author><category term="Personal" scheme="http://www.foderick.com/blogs/onmaterialize/archive/tags/Personal/default.aspx" /></entry><entry><title>Create a custom IWorkItemActivationSerivce for the Composite UI Application Block</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2006/11/07/Create-a-custom-IWorkItemActivationSerivce-for-the-Composite-UI-Application-Block.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2006/11/07/Create-a-custom-IWorkItemActivationSerivce-for-the-Composite-UI-Application-Block.aspx</id><published>2006-11-07T02:09:00Z</published><updated>2006-11-07T02:09:00Z</updated><content type="html">&lt;p&gt;Sooner or later, I&amp;#39;m convinced that most advanced implementations of CAB will have to&amp;nbsp;write their own version of the IWorkItemActivationService. The WorkItemActivationService is closely tied into the &lt;a href="http://netknowledgenow.com:81/CS/blogs/onmaterialize/archive/2006/09/10/Lifecycle-of-a-WorkItem.aspx"&gt;lifecycle of the CAB WorkItem&lt;/a&gt; so please make sure you understand about WorkItem.Status otherwise this post will make no sense!&lt;/p&gt;&lt;p&gt;The concept of IWorkItemActivationSerice is simple. Everytime a WorkItem changes status it registers the status change with an implementation of IWorkItemActivationService by calling the ChangeStatus method as in the following code from the WorkItem class:&lt;/p&gt;&lt;pre&gt;if (ActivationService != null)
{
	ActivationService.ChangeStatus(this);
}&lt;/pre&gt;&lt;p&gt;The default implementation of IWorkItemActivationService is found in the SimpleWorkItemActivationClass: &lt;/p&gt;&lt;pre&gt;public void ChangeStatus(WorkItem item)
{
   lock (syncroot)
   {
      if (item != activeWorkItem &amp;amp;&amp;amp; item.Status == WorkItemStatus.Active)
      {
         if (activeWorkItem != null &amp;amp;&amp;amp; activeWorkItem.Status != WorkItemStatus.Terminated)
            activeWorkItem.Deactivate();

         activeWorkItem = item;
      }
   }
}
&lt;/pre&gt;&lt;p&gt;The purpose of this code is to ensure that only one WorkItem at a time is active (if a new WorkItem is being activated it simply deactivates the previously active one). Besides the bug (which I&amp;#39;ll point out in a minute), this code may not suit your needs. In my case, when a child WorkItem activates I don&amp;#39;t want to deactivate the parent WorkItem because the WorkItem is programmed to disable (hide) certain toolbars when the WorkItem deactivates. Hiding and showing toolbars caused too much flicker. The bug is subtle and would only cause a problem in rare instances. The bug is that during the execution of activeWorkItem there are two WorkItems with a status of Active! Obviously item.Status is Active but so is activeWorkItem.Status (using the object references from the code sample above). If you were to query the activation service for active work item inside the Deactivate event it should point to the workitem that just became active, not the workitem that is being activated.&lt;/p&gt;&lt;p&gt;So, to implement my custom activation service, I had to follow a couple of steps. First, subtype the IWorkItemActivationService to expose the currently active WorkItem. Sometimes its nice for client code to know which workitem is active:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;    public interface IMyWorkItemActivationService : IWorkItemActivationService
    {
        /// 
        /// The currently active work item
        /// 
        WorkItem ActiveWorkItem { get; set; }
    }
&lt;/pre&gt;&lt;p&gt;Then implement the new interface with the bug fix in place.&lt;/p&gt;&lt;pre&gt;    /// 
    /// An implementation of IWorkItemActivationService that tracks the 
    /// last activated work item
    /// 
    [Service]
    public class WorkItemActivationSerivce : IMyWorkItemActivationService
    {
        private object syncroot = new object();
        private WorkItem activeWorkItem;

        /// 
        /// The currently active work item
        /// 
        public WorkItem ActiveWorkItem
        {
            get
            {
                return activeWorkItem;
            }
            set
            {
                activeWorkItem = value;
            }
        }

        /// 
        /// Initializes a new instance of the  class.
        /// 
        public WorkItemActivationSerivce()
        {
        }

        #region IWorkItemActivationService Members

        public void ChangeStatus(WorkItem item)
        {

            lock (syncroot)
            {
                if (item != activeWorkItem &amp;amp;&amp;amp; item.Status == WorkItemStatus.Active)
                {
                    WorkItem previouslyActiveWorkItem = activeWorkItem;

                    //update the currently active work item
                    //this needs to be set BEFORE the deactivate is called
                    //so that during the execution of deactivate this service knows which work item is active
                    activeWorkItem = item;

                    //deactivate the currently active work item
                    //ONLY if the newly active work item is not a child work item
                    //TODO: may have to recursively descend through workitem containership hierarchy
                    //to look for descendants
                    if (previouslyActiveWorkItem != null 
                        &amp;amp;&amp;amp; previouslyActiveWorkItem.Status != WorkItemStatus.Terminated
                        &amp;amp;&amp;amp; previouslyActiveWorkItem.WorkItems.ContainsObject(item) == false)
                    {
                        previouslyActiveWorkItem.Deactivate();
                    }

                }
            }

        }

        #endregion
    }
&lt;/pre&gt;&lt;p&gt;Next, update your app.config to add the service.&lt;/p&gt;&lt;font color="#0000ff" size="2"&gt;&lt;p&gt;&amp;lt;&lt;font color="#a31515" size="2"&gt;add&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;serviceType&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;Microsoft.Practices.CompositeUI.IWorkItemActivationService, Microsoft.Practices.CompositeUI&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;instanceType&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;YourNamespace.WorkItemActivationSerivce, YourDll&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;serviceType&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;Microsoft.Practices.CompositeUI.IWorkItemActivationService, Microsoft.Practices.CompositeUI&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;instanceType&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;YourNamespace.WorkItemActivationSerivce, YourDll&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; /&amp;gt;&lt;/font&gt; &lt;p&gt;I like to be able to query the system for the ActiveWorkItem from my WorkItem base class.&lt;/p&gt;&lt;pre&gt;        /// 
        /// The currently active work item
        /// 
        public WorkItem ActiveWorkItem
        {
            get
            {
                IMyWorkItemActivationService wias = this.RootWorkItem.Services.Get() as IMyWorkItemActivationService;
                if (wias == null) return null;
                return wias.ActiveWorkItem;
            }
            set
            {
                IMyWorkItemActivationService wias = this.RootWorkItem.Services.Get() as IMyWorkItemActivationService;
                if (wias != null)
                {
                    wias.ActiveWorkItem = value;
                }
            }
        }
&lt;/pre&gt;&lt;p&gt;Finally, I had to create a new implementation of the WorkItem.Activate method to deactivate (and then reactivate) the workitem in case a WorkItem outside of the currently active WorkItem hierarchy becomes active. This is a bit of a hack but it worked for my immediate purposes.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;        public new void Activate()
        {
            //because of the new workitemactivationservice, more than two work items can be active at a time
            //Activate may now have to fire the activating work item events 
            // even if it is already activated.
            //only suppress the deactivate if the previously activated work item was a child work item
            if (this.Status == WorkItemStatus.Active 
                &amp;amp;&amp;amp; this.WorkItems.ContainsObject(this.ActiveWorkItem) == false)
            {
                Deactivate();
            }
            this.ActiveWorkItem = this;
            base.Activate();
        }
&lt;/pre&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=1778" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author><category term="Composite UI Application Block (CAB)" scheme="http://www.foderick.com/blogs/onmaterialize/archive/tags/Composite+UI+Application+Block+_2800_CAB_2900_/default.aspx" /></entry><entry><title>Unit testing Composite UI Application Block modules</title><link rel="alternate" type="text/html" href="http://www.foderick.com/blogs/onmaterialize/archive/2006/11/07/Unit-testing-Composite-UI-Application-Block-modules.aspx" /><id>http://www.foderick.com/blogs/onmaterialize/archive/2006/11/07/Unit-testing-Composite-UI-Application-Block-modules.aspx</id><published>2006-11-07T01:32:00Z</published><updated>2006-11-07T01:32:00Z</updated><content type="html">&lt;p&gt;Unit testing of CAB modules can be difficult because of all the dependency injection going on. Typically you will unit test&amp;nbsp;at least all&amp;nbsp;your presenters. The problem is that you will probably need the presenter to be built up by Objectbuilder which injects the references to WorkItem and State objects on the presenter. What you need is some mock object that takes the place of the RootWorkItem providing a context under which to run your WorkItems and presenters. Take a cue from the PAG team and borrow their TestableRootWorkItem from the nUnit project that comes with CAB.&lt;/p&gt;&lt;p&gt;Although you may be able to use it out of the box, the reality is that you will probably need to modify it to add services that your WorkItems require. Just add these in the TestableAddServices method.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;using Microsoft.Practices.CompositeUI.BuilderStrategies;
using Microsoft.Practices.CompositeUI.Commands;
using Microsoft.Practices.CompositeUI.EventBroker;
using Microsoft.Practices.ObjectBuilder;
using Microsoft.Practices.CompositeUI.Services;

namespace Microsoft.Practices.CompositeUI.Tests
{
    public class TestableRootWorkItem : WorkItem //WorkItemBase
    {
        public TestableRootWorkItem()
        {
            InitializeRootWorkItem(CreateBuilder());

            Services.AddNew&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;strong&gt;&lt;font color="#2b91af" size="2"&gt;CommandAdapterMapService&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ICommandAdapterMapService&lt;/font&gt;&lt;/strong&gt;&lt;font size="2"&gt;&amp;gt;&lt;/font&gt;();
            Services.AddNew&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;strong&gt;&lt;font color="#2b91af" size="2"&gt;TraceSourceCatalogService&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ITraceSourceCatalogService&lt;/font&gt;&lt;/strong&gt;&lt;font size="2"&gt;&amp;gt;&lt;/font&gt;();

            TestableAddServices();

            BuildUp();
        }
&lt;strong&gt;
        protected virtual void TestableAddServices()
        {
            //Do these module loaders really need to be added?
            Services.AddNew&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;strong&gt;&lt;font color="#2b91af" size="2"&gt;ModuleLoaderService&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;IModuleLoaderService&lt;/font&gt;&lt;/strong&gt;&lt;font size="2"&gt;&amp;gt;&lt;/font&gt;();
        }
&lt;/strong&gt;
        public Builder Builder
        {
            get { return InnerBuilder; }
        }

        public IReadWriteLocator Locator
        {
            get { return InnerLocator; }
        }

        private Builder CreateBuilder()
        {
            Builder builder = new Builder();

            builder.Strategies.AddNew&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;strong&gt;&lt;font color="#2b91af" size="2"&gt;EventBrokerStrategy&lt;/font&gt;&lt;/strong&gt;&lt;font size="2"&gt;&amp;gt;&lt;/font&gt;(BuilderStage.Initialization);
            builder.Strategies.AddNew&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;strong&gt;&lt;font color="#2b91af" size="2"&gt;CommandStrategy&lt;/font&gt;&lt;/strong&gt;&lt;font size="2"&gt;&amp;gt;&lt;/font&gt;(BuilderStage.Initialization);
            builder.Strategies.AddNew&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;strong&gt;&lt;font color="#2b91af" size="2"&gt;ObjectBuiltNotificationStrategy&lt;/font&gt;&lt;/strong&gt;&lt;font size="2"&gt;&amp;gt;&lt;/font&gt;(BuilderStage.PostInitialization);

            builder.Policies.SetDefault&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;strong&gt;&lt;font color="#2b91af" size="2"&gt;ObjectBuiltNotificationPolicy&lt;/font&gt;&lt;/strong&gt;&lt;font size="2"&gt;&amp;gt;&lt;/font&gt;(new ObjectBuiltNotificationPolicy());
            builder.Policies.SetDefault&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;strong&gt;&lt;font color="#2b91af" size="2"&gt;ISingletonPolicy&lt;/font&gt;&lt;/strong&gt;&lt;font size="2"&gt;&amp;gt;&lt;/font&gt;(new SingletonPolicy(true));

            return builder;
        }
    }
}
&lt;/pre&gt;Using the TestableRootWorkItem is easy. The key is to realize that ObjectBuilder builds up an object when you add the object to a ManagedObjectCollection such as WorkItem.Items. The simple act of adding the object to the collection causes all dependent objects to be injected. Here&amp;#39;s a sample test. &lt;pre&gt;        [Test]
        public void RunBatchClose()
        {
            TestableRootWorkItem root = new TestableRootWorkItem();
            BatchCloseWorkItem wi = root.WorkItems.AddNew&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;strong&gt;&lt;font color="#2b91af" size="2"&gt;BatchCloseWorkItem&lt;/font&gt;&lt;/strong&gt;&lt;font size="2"&gt;&amp;gt;&lt;/font&gt;();
            BatchCloseController controller = wi.Items.AddNew&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;strong&gt;&lt;font color="#2b91af" size="2"&gt;BatchCloseController&lt;/font&gt;&lt;/strong&gt;&lt;font size="2"&gt;&amp;gt;&lt;/font&gt;();
            DataImportDTO batch = GetFirstOpenBatch();
            Assert.IsNotNull(batch);
        }
&lt;/pre&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=1777" width="1" height="1"&gt;</content><author><name>admin</name><uri>http://www.foderick.com/members/admin.aspx</uri></author><category term="Composite UI Application Block (CAB)" scheme="http://www.foderick.com/blogs/onmaterialize/archive/tags/Composite+UI+Application+Block+_2800_CAB_2900_/default.aspx" /></entry></feed>