<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.foderick.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Net Knowledge</title><link>http://www.foderick.com/blogs/</link><description>Ideas to Implementation</description><dc:language>en-US</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>RUAlive 0.2 released</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2007/10/02/rualive-0-2-released.aspx</link><pubDate>Tue, 02 Oct 2007 22:39:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:2084</guid><dc:creator>admin</dc:creator><slash:comments>2</slash:comments><description>&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;</description><enclosure url="http://netknowledgenow.com:81/CS/files/folders/samplecode/entry2077.aspx" length="17528" type="text/html; charset=utf-8" /></item><item><title>Making Cuyahoga and Community Server play nice together</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2007/09/30/Making-Cuyahoga-and-Community-Server-play-nice-together.aspx</link><pubDate>Sun, 30 Sep 2007 18:14:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:2079</guid><dc:creator>admin</dc:creator><slash:comments>2</slash:comments><description>&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;</description><category domain="http://www.foderick.com/blogs/onmaterialize/archive/tags/Cuyahoga/default.aspx">Cuyahoga</category></item><item><title>RUAlive - a WPF tool to check if a website is running.</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2007/09/27/RUAlive-_2D00_-a-WPF-tool-to-check-if-a-website-is-running_2E00_.aspx</link><pubDate>Thu, 27 Sep 2007 04:27:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:2076</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><description>&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;</description><category domain="http://www.foderick.com/blogs/onmaterialize/archive/tags/WPF+RUAlive/default.aspx">WPF RUAlive</category></item><item><title>Debugging WCF Serialization issues</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2007/03/12/Debugging-WCF-Serialization-issues.aspx</link><pubDate>Mon, 12 Mar 2007 18:50:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:2068</guid><dc:creator>admin</dc:creator><slash:comments>4</slash:comments><description>&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;</description><category domain="http://www.foderick.com/blogs/onmaterialize/archive/tags/WCF/default.aspx">WCF</category></item><item><title>Don't serialize your delegates!</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2007/03/01/Don_2700_t-serialize-your-delegates_2100_.aspx</link><pubDate>Thu, 01 Mar 2007 00:29:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:2067</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><description>&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;</description></item><item><title>Upgrade Winforms 2005 project to WPF</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2007/02/24/Upgrade-Winforms-2005-project-to-WPF.aspx</link><pubDate>Sat, 24 Feb 2007 17:44:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:2066</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><description>&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;</description><category domain="http://www.foderick.com/blogs/onmaterialize/archive/tags/WPF+CAB/default.aspx">WPF CAB</category></item><item><title>Assembly '' was not found. The 'clr-namespace' URI refers to an assembly that is not referenced by the project.	</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2007/01/24/Limited-designer-support-with-WPF-in-Visual-Studio-2005.aspx</link><pubDate>Wed, 24 Jan 2007 19:27:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:2054</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><description>&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;</description></item><item><title>January 2007 Orcas CTP: Don't bother</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2007/01/22/January-2007-Orcas-CTP_3A00_-Don_2700_t-bother.aspx</link><pubDate>Mon, 22 Jan 2007 20:54:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:2053</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><description>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;</description></item><item><title>New project for 2007</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2007/01/21/New-project-for-2007.aspx</link><pubDate>Sun, 21 Jan 2007 22:00:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:2052</guid><dc:creator>admin</dc:creator><slash:comments>1</slash:comments><description>&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;</description></item><item><title>Control WCF Serialization of Collections with IXmlSerializable</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2007/01/18/Control-WCF-Serialization-of-Collections-with-IXmlSerializable.aspx</link><pubDate>Thu, 18 Jan 2007 18:56:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:2050</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><description>&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;</description><category domain="http://www.foderick.com/blogs/onmaterialize/archive/tags/WCF/default.aspx">WCF</category></item><item><title>NHibernate on ASP 2.0 Web Site Project and 2005 Web Developer Express</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2007/01/18/NHibernate-on-ASP-2.0-Web-Site-Project-and-2005-Web-Developer-Express.aspx</link><pubDate>Thu, 18 Jan 2007 17:11:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:2049</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><description>&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;</description><category domain="http://www.foderick.com/blogs/onmaterialize/archive/tags/NHibernate/default.aspx">NHibernate</category></item><item><title>Study Links for 70-553: Upgrade to Enterprise Developer</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/12/16/Study-Links-for-70_2D00_553_3A00_-Upgrade-to-Enterprise-Developer.aspx</link><pubDate>Sat, 16 Dec 2006 21:48:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:2048</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><description>&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;</description><category domain="http://www.foderick.com/blogs/onmaterialize/archive/tags/Certification/default.aspx">Certification</category></item><item><title>Welcome, PJ!</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/11/19/Welcome_2C00_-PJ_2100_.aspx</link><pubDate>Sun, 19 Nov 2006 20:54:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:2025</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><description>&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;</description><category domain="http://www.foderick.com/blogs/onmaterialize/archive/tags/Personal/default.aspx">Personal</category></item><item><title>Create a custom IWorkItemActivationSerivce for the Composite UI Application Block</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/11/07/Create-a-custom-IWorkItemActivationSerivce-for-the-Composite-UI-Application-Block.aspx</link><pubDate>Tue, 07 Nov 2006 02:09:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:1778</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><description>&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;</description><category domain="http://www.foderick.com/blogs/onmaterialize/archive/tags/Composite+UI+Application+Block+_2800_CAB_2900_/default.aspx">Composite UI Application Block (CAB)</category></item><item><title>Unit testing Composite UI Application Block modules</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/11/07/Unit-testing-Composite-UI-Application-Block-modules.aspx</link><pubDate>Tue, 07 Nov 2006 01:32:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:1777</guid><dc:creator>admin</dc:creator><slash:comments>1</slash:comments><description>&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;</description><category domain="http://www.foderick.com/blogs/onmaterialize/archive/tags/Composite+UI+Application+Block+_2800_CAB_2900_/default.aspx">Composite UI Application Block (CAB)</category></item><item><title>Getting Started with WCF in Vista RC1</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/09/26/Getting-Started-with-WCF-in-Vista-RC1.aspx</link><pubDate>Tue, 26 Sep 2006 20:58:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:1030</guid><dc:creator>dfoderick</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;At my current gig, we&amp;#39;re getting ready to use Windows Communications Framework as the platform for our middle tier. Here&amp;#39;s the simplified instructions on how to get rolling.&lt;/p&gt;&lt;p&gt;On a pristine machine with XP SP2 and .NET 2.0 installed, do the following.&lt;br /&gt;1. Install &lt;a href="http://www.sellsbrothers.com/news/showTopic.aspx?ixTopic=2042"&gt;Vista RC1, 3.0 Runtime and the Visual Studio extensions&lt;/a&gt;&lt;br /&gt;2. Follow the instructions for the &lt;a href="http://windowssdk.msdn.microsoft.com/en-us/library/ms751527.aspx"&gt;One Time WCF Samples Setup&lt;br /&gt;&lt;/a&gt;3. If you installed IIS after installing .NET, register IIS by running aspnet_regiis -i in the .NET 2.0 directory&lt;br /&gt;4. Explode the WCF samples from C:\Program Files\Microsoft SDKs\Windows\v6.0\Samples and run the Getting Started sample in WCFSamples\TechnologySamples\Basic\GettingStarted\CS\GettingStarted.sln&lt;/p&gt;&lt;p&gt;If the project runs then you&amp;#39;re all ready to roll.&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=1030" width="1" height="1"&gt;</description></item><item><title>Fixing the "There is already an open DataReader associated with this Command which must be closed first." exception in Entity Framework</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/09/20/Fixing-the-_2200_There-is-already-an-open-DataReader-associated-with-this-Command-which-must-be-closed-first_2E002200_-exception-in-Entity-Framework.aspx</link><pubDate>Wed, 20 Sep 2006 20:18:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:923</guid><dc:creator>dfoderick</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;Once you get your model, database and mapping metadata files configured correctly for Entity Framework, one of the first exceptions that you&amp;#39;re likely to face is the DataReader already open exception. It will normally surface when you&amp;#39;re iterating over a result set and then lazy loading a child collection. In the following example I have a Contact entity that has a Phone collection. If I lazy load the Phones then I&amp;#39;ll get the DataReader exception.&lt;/p&gt;&lt;pre&gt;                var contacts = from c in db.Contact
                                select c;

                foreach (Contact c in contacts)
                {
                    if (c.Phones.IsLoaded == false)
                        c.Phones.Load();

                    if (c.Phones.Count &amp;gt; 0)
                    {
                        Console.WriteLine(c.LastName);
                        foreach (ContactPhone p in c.Phones)
                        {
                            Console.WriteLine(&amp;quot;\t&amp;quot;+p.ContactPhoneId);
                        }
                    }
                }
&lt;/pre&gt;&lt;p&gt;The reason for the exception is that there is an open data reader while reading in the contacts and then the loading of the child Phone collection is attempting to open another DataReader. By default,&amp;nbsp;the SqlClient ADO.NET driver&amp;nbsp;does not allow this.&lt;/p&gt;&lt;p&gt;There are two ways to fix this. First, if you are using SQL Server 2005,&amp;nbsp;you can just&amp;nbsp;enable MARS in your connection string.&lt;/p&gt;&lt;pre&gt;	
&lt;pre&gt;	
add name=&amp;quot;YourDBConnectionString&amp;quot; connectionString=&amp;quot;metadata=.;&lt;/pre&gt;&lt;pre&gt;	provider=System.Data.SqlClient;provider connection string=&amp;quot;Data Source=irv-dev-vms05;Initial Catalog=YourDB;Integrated Security=True;&lt;/pre&gt;&lt;pre&gt;	MultipleActiveResultSets=true&amp;quot;&amp;quot; providerName=&amp;quot;System.Data.Mapping&amp;quot; /
&lt;/pre&gt;	
&lt;/pre&gt;&lt;p&gt;A second&amp;nbsp;option is to read&amp;nbsp;all the results into memory in&amp;nbsp;one shot and close the connection. Then you are free to open another connection to the database to read in the child entities. So how do you control this? The trip to the database does not happen when the LINQ statement is assigned to the var in the code above. Instead, the query to the database happens during the inplicit call to the enumerator of the contacts collection. To force all the contacts to be loaded, simply copy them to a list in memory using the ToList method and then continue the normal processing.&lt;/p&gt;&lt;pre&gt;                var contacts = from c in db.Contact
                                select c;

                List results = contacts.ToList();

                foreach (Contact c in results)
                {
                    if (c.Phones.IsLoaded == false)
                        c.Phones.Load();

                    if (c.Phones.Count &amp;gt; 0)
                    {
                        Console.WriteLine(c.LastName);
                        foreach (ContactPhone p in c.Phones)
                        {
                            Console.WriteLine(&amp;quot;\t&amp;quot;+p.ContactPhoneId);
                        }
                    }
                }
&lt;/pre&gt;&lt;p&gt;This works as expected. Another important realization here is that there is&amp;nbsp;an open&amp;nbsp;connection to the database as long as you are reading in records through that enumerator! A novice programmer may unwittingly include a massive number of time consuming operations within the foreach loop (calling a web service, for example, comes to mind) which will keep the connection to the database open for an inordinate length of time. Of course, you won&amp;#39;t fall into that trap. &lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=923" width="1" height="1"&gt;</description></item><item><title>Lifecycle of a WorkItem</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/09/10/Lifecycle-of-a-WorkItem.aspx</link><pubDate>Sun, 10 Sep 2006 18:01:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:737</guid><dc:creator>dfoderick</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;An important facet of programming with the Composite UI Application Block is understanding the sequence of events that fire during the lifetime of a WorkItem. For example, in the Activate event for your WorkItem you&amp;nbsp;may want to enable some toolbar or menu items and then show a view.&lt;/p&gt;&lt;p&gt;WorkItem events fall into 3 categories. The startup event is RunStarted. The operating events are Activating, Activated, Deactivating and Deactivated. The shutdown events are Terminating and Terminated. These events follow the standard .NET conventions. For example, Activating&amp;nbsp;fires before&amp;nbsp;Activated and is cancelable.&lt;/p&gt;&lt;p&gt;RunStarted fires during the Run method. Activating fires before the WorkItem status changes to Active - Activated fires after. Deactivating fires before the WorkItem status changes to Inactive - Deactivated fires after the status change. Terminating fires before the WorkItem status changes to Terminated - Terminated fires after.&lt;/p&gt;&lt;p&gt;These WorkItem events are the foundation of &lt;a href="http://netknowledgenow.com:81/CS/blogs/onmaterialize/archive/2006/08/25/What-is-a-WorkItemExtension_3F00_.aspx" target="_blank"&gt;WorkItemExtensions&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=737" width="1" height="1"&gt;</description><category domain="http://www.foderick.com/blogs/onmaterialize/archive/tags/Composite+UI+Application+Block+_2800_CAB_2900_/default.aspx">Composite UI Application Block (CAB)</category></item><item><title>Catch First Chance Exceptions to debug CAB Pub/Sub Events</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/09/02/Catch-First-Chance-Exceptions.aspx</link><pubDate>Sat, 02 Sep 2006 19:38:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:591</guid><dc:creator>dfoderick</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Debugging the Composite UI Application Block EventBroker can be a lesson in frustration. Often, an event subscription can do something substantial such as show a View or run a WorkItem. Should&amp;nbsp;the event subscriber throw an exception, you get&amp;nbsp;a&amp;nbsp;not-so-helpful exception message&amp;nbsp;caught at the publisher that reads something like &amp;quot;One or more exceptions occured while firing the topic &amp;#39;YourEvent&amp;#39;&amp;quot;. Gee, thanks. No stack. No inner exception. So how do you debug this sucker?&lt;/p&gt;&lt;p&gt;Of course, you could trace&amp;nbsp;through your handler, line-by-line, but there is a better way. The trick is to catch first chance exceptions. Whenever you are running in debug mode in Visual Studio and an exception occurs you can control what happens. By default the exception will be thrown and handled by your application&amp;#39;s code exactly as it would be at runtime in the production app. But,&amp;nbsp;toggle a debugger setting&amp;nbsp;and you can now&amp;nbsp;tell Visual Studio to jump into the debugger at exactly where the exception occured with the stack at exactly the point BEORE the exception is thrown! This is a first chance exception because you have a chance to debug it&amp;nbsp;before the exception happens. Its a great productivity tool, ESPECIALLY when you work on a team where some members love to eat exceptions!!! Now you can actually see the crap that your fellow programmers have swept under the rug and you can now properly debug your app.&lt;/p&gt;&lt;p&gt;Here&amp;#39;s how to enable this magic.&lt;br /&gt;1. In Visual Studio, press Control+Alt+E. You get the Exceptions window.&lt;br /&gt;2. Notice that next to Common Language Runtime Exceptions, Thrown is not checked. Check it off at this level to debug into all CLS Exceptions or drill down if you are only interested in specific exception types.&lt;br /&gt;3. Click Ok&lt;/p&gt;&lt;p&gt;Now you are in debugging bliss. Whenever an exception happens the Visual Studio debugger will be happily pointing you to exactly the source of the problem.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=591" width="1" height="1"&gt;</description></item><item><title>DataEventArgs: a generic EventArgs Class</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/09/02/DataEventArgs_3A00_-a-generic-EventArgs-Class.aspx</link><pubDate>Sat, 02 Sep 2006 19:36:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:590</guid><dc:creator>dfoderick</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Back in the bad old days, before generics, writing custom event handlers to pass additional data to the event subscriber was a pain in the butt. With the built in .NET 1.0 EventHandler you can signal that an event occured. Thats&amp;#39; fine except that the event handler usually needs&amp;nbsp;more information about an event in order to do its job. Under .NET 1.0 you have a couple of solutions. You can cast the sender object to a specific known&amp;nbsp;type and pull off the properties you need or you could&amp;nbsp;define a delegate for the EventHandler and also subclass the EventArgs class to define the additional data to be passed to the handler. Casting the sender leads to brittle, highly coupled code. Creating the delegate and EventArgs subclass is not overly difficult but it&amp;nbsp;does eat some brain cycles&amp;nbsp;and leads to an explosion of classes.&lt;/p&gt;&lt;p&gt;Fortunately, with CAB and .NET 2.0 generics there is a much&amp;nbsp;easier way called DataEventArgs. No casting, no delegate and no EventArgs subclass needed. Here&amp;#39;s how you use it. First, define your event along with the custom data that will be send to the handler like this:&lt;/p&gt;&lt;font size="2"&gt;&lt;p&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="#008080" size="2"&gt;EventHandler&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#008080" size="2"&gt;DataEventArgs&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;Account&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;&amp;gt; AccountSelected;&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;In this example I am defining an event called AccountSelected and the event publisher will pass an Account object to the event subscriber. Account is just one of my domain model classes but it could be any type of object including something like a string or int.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;Whenever a new Account is selected I can raise the AccountSelected event with this code:&lt;/font&gt;&lt;/p&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;p&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;void&lt;/font&gt;&lt;font size="2"&gt; OnAccountSelected(Account a&lt;/font&gt;&lt;font size="2"&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp; if&lt;/font&gt;&lt;font size="2"&gt; (AccountSelected != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AccountSelected(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;this&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#008080" size="2"&gt;DataEventArgs&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#008080" size="2"&gt;Account&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;(a));&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/font&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;void&lt;/font&gt;&lt;font size="2"&gt; OnAccountSelected(Account a&lt;/font&gt;&lt;font size="2"&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp; if&lt;/font&gt;&lt;font size="2"&gt; (AccountSelected != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AccountSelected(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;this&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#008080" size="2"&gt;DataEventArgs&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#008080" size="2"&gt;Account&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;(a));&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/font&gt; &lt;p&gt;Now your subscriber (the event handler) simply reads the data off the passed DataEventArgs object.&lt;/p&gt;&lt;font size="2"&gt;&lt;p&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;void&lt;/font&gt;&lt;font size="2"&gt; AccountSelected(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt; sender, &lt;/font&gt;&lt;font color="#008080" size="2"&gt;DataEventArgs&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;Account&lt;/font&gt;&lt;font size="2"&gt;&amp;gt; e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font size="2"&gt;ShowView();&lt;br /&gt;&amp;nbsp;&amp;nbsp; presenter.SelectAccount(e.Data);&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/font&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;void&lt;/font&gt;&lt;font size="2"&gt; AccountSelected(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt; sender, &lt;/font&gt;&lt;font color="#008080" size="2"&gt;DataEventArgs&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;Account&lt;/font&gt;&lt;font size="2"&gt;&amp;gt; e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font size="2"&gt;ShowView();&lt;br /&gt;&amp;nbsp;&amp;nbsp; presenter.SelectAccount(e.Data);&lt;br /&gt;}&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;This is much simpler than the equivalent 1.0 code. The passed data is exposed in the Data property of the EventArgs object and it doesn&amp;#39;t need to be casted to use it.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;If you want to use this class just include it in your own library.&lt;br /&gt;&lt;pre&gt;//===============================================================================
// Microsoft patterns &amp;amp; practices
// CompositeUI Application Block
//===============================================================================
// Copyright &amp;copy; Microsoft Corporation.  All rights reserved.
// THIS CODE AND INFORMATION IS PROVIDED &amp;quot;AS IS&amp;quot; WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE.
//===============================================================================

using System;
using System.Collections.Generic;
using System.Text;

namespace Microsoft.Practices.CompositeUI.Utility
{
    public class DataEventArgs&amp;lt;TData&amp;gt; : EventArgs
    {
        TData data;

        public DataEventArgs(TData data)
        {
            if (data == null)
            {
                throw new ArgumentNullException(&amp;quot;data&amp;quot;);
            }
            this.data = data;
        }

        public TData Data
        {
            get { return data; }
        }

        public override string ToString()
        {
            return data.ToString();
        }
    }
}
&lt;/pre&gt;&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;//===============================================================================
// Microsoft patterns &amp;amp; practices
// CompositeUI Application Block
//===============================================================================
// Copyright &amp;copy; Microsoft Corporation.  All rights reserved.
// THIS CODE AND INFORMATION IS PROVIDED &amp;quot;AS IS&amp;quot; WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE.
//===============================================================================

using System;
using System.Collections.Generic;
using System.Text;

namespace Microsoft.Practices.CompositeUI.Utility
{
    public class DataEventArgs&amp;lt;TData&amp;gt; : EventArgs
    {
        TData data;

        public DataEventArgs(TData data)
        {
            if (data == null)
            {
                throw new ArgumentNullException(&amp;quot;data&amp;quot;);
            }
            this.data = data;
        }

        public TData Data
        {
            get { return data; }
        }

        public override string ToString()
        {
            return data.ToString();
        }
    }
}
&lt;/pre&gt;&lt;pre&gt;
&lt;/pre&gt;&lt;/font&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=590" width="1" height="1"&gt;</description></item><item><title>Workaround for Injecting menu items into CAB Shell MenuStrip</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/08/30/Workaround-for-Injecting-menu-items-into-CAB-Shell-MenuStrip.aspx</link><pubDate>Wed, 30 Aug 2006 17:52:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:463</guid><dc:creator>dfoderick</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Anyone who has worked with CAB for a while has probably been bitten by a limitation of the UIExtensionSite when adding menu items into the shell from a module. The limitiation is that the UIExtensionSite only supports the Add method to add additional items to a UI element. Translated to a MenuStrip example, that means that you can only add menu items to the shell&amp;#39;s menu. For example, in your shell you define the File menu with an Exit item. Registering the File menu as an extension site, you can now add menu items to the File menu and they will be added after the Exit item. The results are probably not what you want. What can you do if you want to insert new items before the Exit item? Read on.&lt;/p&gt;&lt;p&gt;&amp;nbsp;The key to working around the problem is to realize that you have a great deal of flexibility in which UI elements you expose as extension sites. For a MenuStrip in the shell there are three basic choices for what to expose. I will call them Top level, Detail level and Individual item.&lt;/p&gt;&lt;p&gt;Expose the Top level menu items if you want to add more top level menu items from a module. For example if you have File and Edit menu itmes and you want to add a top level menu called &amp;quot;My Menu&amp;quot; then register the top level like this:&lt;/p&gt;&lt;p&gt;RootWorkItem.UIExtensionSites.RegisterSite(UIExtensionSiteNames.MainMenu, this.Shell.MainMenuStrip.Items);&lt;/p&gt;&lt;p&gt;In your module, add the new top level menu item.&lt;/p&gt;&lt;p&gt;UIExtensionSites[UIExtensionSiteNames.MainMenu].Add(new ToolStripMenuItem(&amp;quot;My Menu&amp;quot;));&lt;/p&gt;&lt;p&gt;&amp;quot;My Menu&amp;quot;&amp;nbsp; will appear as the rightmost top level menu.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Expose a detail level menu collection to add additional menu items after any items that are already defined in the shell. For example if you have a File menu with an Exit item then registering it like this&lt;/p&gt;&lt;p&gt;ToolStripMenuItem fileItem = (ToolStripMenuItem)Shell.MainMenuStrip.Items[0];&lt;br /&gt;RootWorkItem.UIExtensionSites.RegisterSite(UIExtensionSiteNames.FileMenu, fileItem.DropDownItems);&lt;/p&gt;&lt;p&gt;and adding a menu item like this&lt;/p&gt;&lt;p&gt;UIExtensionSites[UIExtensionSiteNames.FileMenu].Add(new ToolStripMenuItem(&amp;quot;New&amp;quot;));&lt;/p&gt;&lt;p&gt;will yield a File menu with Exit then New.&lt;/p&gt;&lt;p&gt;So it seems you can only add items to the end of the list! What if you wanted that New menu item to be placed before the Exit item? Ok, here the trick. The third option is to register an invisible individual menu item as the first menu item in the File menu. When you register this individual item and Add to it, items will appear after it in the list. So the registration code looks like this:&lt;/p&gt;&lt;p&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; //need a placeholder menu item to add items after&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; ToolStripSeparator placeHolderTool = new ToolStripSeparator();&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; placeHolderTool.Visible = false;&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; fileItem.DropDownItems.Insert(0,placeHolderTool);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; RootWorkItem.UIExtensionSites.RegisterSite(UIExtensionSiteNames.FileMenu, placeHolderTool);&lt;/p&gt;&lt;p&gt;Now when you add the New menu item&lt;/p&gt;&lt;p&gt;UIExtensionSites[UIExtensionSiteNames.FileMenu].Add(new ToolStripMenuItem(&amp;quot;New&amp;quot;));&lt;/p&gt;&lt;p&gt;You get a File menu with with New then Exit as a result.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The little magic that makes this possible is in the ToolStripUIAdapterFactory. It looks at what kind of ui element you are exposing and creates the correct adapter for it. The adapter knows how to handle each situation and performs the correct implementation for you.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class ToolStripUIAdapterFactory : IUIElementAdapterFactory&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /// See &amp;lt;see cref=&amp;quot;IUIElementAdapterFactory.GetAdapter&amp;quot;/&amp;gt; for more information.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public IUIElementAdapter GetAdapter(object uiElement)&lt;br /&gt;&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; if (uiElement is ToolStrip)&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; return new ToolStripItemCollectionUIAdapter(((ToolStrip)uiElement).Items);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (uiElement is ToolStripItem)&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; return new ToolStripItemOwnerCollectionUIAdapter((ToolStripItem)uiElement);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (uiElement is ToolStripItemCollection)&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; return new ToolStripItemCollectionUIAdapter((ToolStripItemCollection)uiElement);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentException(&amp;quot;uiElement&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;... &lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=463" width="1" height="1"&gt;</description><category domain="http://www.foderick.com/blogs/onmaterialize/archive/tags/Composite+UI+Application+Block+_2800_CAB_2900_/default.aspx">Composite UI Application Block (CAB)</category></item><item><title>What is a WorkItemExtension?</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/08/25/What-is-a-WorkItemExtension_3F00_.aspx</link><pubDate>Fri, 25 Aug 2006 17:41:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:422</guid><dc:creator>dfoderick</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;The Composite UI Application Block (CAB) is all about writing loosely coupled plug-in modules for Smart Client apps. What happens when someone has written a module and you want to enhance its behavior without modifying the original code? You write a WorkItemExtension.&lt;/p&gt;&lt;p&gt;First a little background. A WorkItem represents a particular use case, like editing a customer, for example. As a container for the use case, it contains a view and a presenter. In the bank teller sample, the CustomerWorkItem displays a CustomerView that allows the user to edit customer data. Now someone else comes along and they want to display additional information to extend the original use case. Of course, subclassing the CustomerWorkItem would not work because
there would be no way to tell the original caller of the work item
(probably a ModuleInit) to run your subclass instead of the parent. Instead, they would write a CustomerWorkItemExtension to extend the CustomerWorkItem without modifying original CustomerWorkItem code. The WorkItemExtension hooks into all the events of the extended WorkItem (Initialized, Activated, Deactivated, Terminated). The code looks like this:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [WorkItemExtension(typeof(CustomerWorkItem))]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public class CustomerWorkItemExtension : WorkItemExtension&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void OnActivated()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WorkItem.Workspaces[workspace].Show(aditionalView);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Notice that the attribute defines which workitem we are extending and that the WorkItem member variable in this code snippet is the extended WorkItem (CustomerWorkItem in our example).&lt;/p&gt;&lt;p&gt;Another cool trick is to extend your work item base class and include logging or performance metrics for all your work items. The Smart Client Software Factory does this for infrastucture testing.This is a simple example of Aspect Oriented Programming.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=422" width="1" height="1"&gt;</description></item><item><title>Entity SQL Quick Reference Guide: Get your copy</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/08/24/Entity-SQL-Quick-Reference-Guide_3A00_-Get-your-copy.aspx</link><pubDate>Thu, 24 Aug 2006 21:15:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:417</guid><dc:creator>dfoderick</dc:creator><slash:comments>1</slash:comments><description>After you install the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=B68F6F53-EC87-4122-B1C8-EE24A043BF72&amp;amp;displaylang=en"&gt;ADO.NET vNext August 2006 CTP&lt;/a&gt;, check out the eSQL quick reference guide in C:\Program Files\Microsoft SDKs\ADO.NET vNext CTP\Docs. It lists some of the more common keywords for building entity queries.&lt;br /&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=417" width="1" height="1"&gt;</description><category domain="http://www.foderick.com/blogs/onmaterialize/archive/tags/Entity+Framework/default.aspx">Entity Framework</category></item><item><title>Fixing Smart Tags after installing LINQ/Entity Framework preview</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/08/24/416.aspx</link><pubDate>Thu, 24 Aug 2006 20:34:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:416</guid><dc:creator>dfoderick</dc:creator><slash:comments>0</slash:comments><description>If you're going to play around with the new &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=B68F6F53-EC87-4122-B1C8-EE24A043BF72&amp;amp;displaylang=en"&gt;Entity Framework August 2006 CPT&lt;/a&gt;, you'll have to install the May CTP of LINQ. A nasty side affect of that installation is that it wipes out some of your smart tags. To get your VS 2005 environment back in order, you should see the &lt;a href="http://msdn.microsoft.com/netframework/future/linqissues/"&gt;list of known issues&lt;/a&gt; and this &lt;a href="http://blogs.msdn.com/hartmutm/archive/2006/05/23/604978.aspx#614301"&gt;blog entry from Harmut&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One additional snag that you might encounter is getting a Visual Studio error message when running the devenv /setup /resetuserdata /resetsettings command.The reset does not complete and smart tags are still stunted. In my case, the error was caused by an unruly addin (&lt;a href="http://www.testdriven.net/"&gt;TestDriven .NET&lt;/a&gt;). Uninstalling the addin before resetting Visual Studio should fix it.&lt;br /&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=416" width="1" height="1"&gt;</description></item><item><title>Installing HP 6310 All-in-one on a server</title><link>http://www.foderick.com/blogs/onmaterialize/archive/2006/07/22/239.aspx</link><pubDate>Sat, 22 Jul 2006 19:14:00 GMT</pubDate><guid isPermaLink="false">0030216b-99b5-4f58-a945-d7865781a18e:239</guid><dc:creator>dfoderick</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Although intended for a desktop environment, the software for the &lt;a href="http://search.hp.com/query.html?charset=iso-8859-1&amp;amp;hpvc=sitewide&amp;amp;la=en&amp;amp;qs=&amp;amp;lk=1&amp;amp;rf=0&amp;amp;uf=1&amp;amp;nh=10&amp;amp;st=1&amp;amp;qt=HP+Officejet+6310xi+All-in-One&amp;amp;ocoldqt=6310&amp;amp;oc=1120062"&gt;HP 6310 Printer&lt;/a&gt;&amp;nbsp;can be installed on a server machine (win2k or win2k3). Just follow these instructions:&lt;/p&gt;
&lt;p&gt;&lt;font face=Arial color=#0066ff size=2&gt;1. Copy all the contents of the CD to the computer. &lt;br /&gt;&lt;br /&gt;2. Locate autorun.inf file and open it in notepad. &lt;br /&gt;&lt;br /&gt;3. Scroll down the notepad until you find "Overide" (sic) parameter under "[SystemRequirements]" and change it from "No" to "Yes", then save. &lt;br /&gt;&lt;br /&gt;4. " OSList=410, 490, 500, 501 " ----------------&amp;gt; "OSList=410, 490, 500, 501,502" &lt;br /&gt;&lt;br /&gt;5.Now run Setup.exe.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;And, if you have other issues installing the software for reasons that appear to have something to do with minimum requirements, just remove the lines from autorun.inf that refer to "warnproduct" or "blockproduct".&amp;nbsp;As always, do this at your own risk!&lt;/p&gt;&lt;img src="http://www.foderick.com/aggbug.aspx?PostID=239" width="1" height="1"&gt;</description></item></channel></rss>
