<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Jerry Dixon's Blog</title><subtitle type="html">A dumping ground for tips and information about .NET, SQL Server, and technology in general.</subtitle><id>http://blogs.msdn.com/jerrydixon/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/jerrydixon/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2007-08-16T20:06:00Z</updated><entry><title>Windows Vista cannot obtain an IP address from certain routers or from certain non-Microsoft DHCP servers</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2008/08/12/windows-vista-cannot-obtain-an-ip-address-from-certain-routers-or-from-certain-non-microsoft-dhcp-servers.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2008/08/12/windows-vista-cannot-obtain-an-ip-address-from-certain-routers-or-from-certain-non-microsoft-dhcp-servers.aspx</id><published>2008-08-12T23:36:32Z</published><updated>2008-08-12T23:36:32Z</updated><content type="html">&lt;p&gt;I recently had a need to prove that my home router was not the cause of some networking issues.&amp;#160; So, I pulled an older router out of the closet and hooked it up.&amp;#160; I quickly noticed that there was a problem.&amp;#160; My Windows XP machine could obtain an IP address, but my Windows Vista machine could not.&amp;#160; I replaced the old router with the original one, and both machines started working again.&amp;#160; However, I needed to get the OLD router to work, so I had to do some digging.&lt;/p&gt;  &lt;p&gt;I quickly found KB 928233 (&lt;a title="http://support.microsoft.com/kb/928233/en-us" href="http://support.microsoft.com/kb/928233/en-us"&gt;http://support.microsoft.com/kb/928233/en-us&lt;/a&gt;).&amp;#160; This article discusses a difference in the way that XP and Vista handle the DHCP BROADCAST flag.&amp;#160; In XP, this flag is disabled by default.&amp;#160; In Vista, however, it is enabled by default.&amp;#160; My old router couldn't properly handle this flag, so it wouldn't give my Vista box an IP address.&amp;#160; I followed the instructions in the KB article, and everything started working.&lt;/p&gt;  &lt;p&gt;Later on, and for other reasons, I decided to purchase a newer router.&amp;#160; Just for fun, I decided to set Vista back to its default behavior.&amp;#160; Sure enough, Vista had no problem with the new router.&amp;#160; This problem seems to occur only with older routers that cannot process the BROADCAST flag.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8853453" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author></entry><entry><title>Password-protecting Compressed Folders in Windows XP</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2008/06/12/password-protecting-compressed-folders-in-windows-xp.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2008/06/12/password-protecting-compressed-folders-in-windows-xp.aspx</id><published>2008-06-13T04:54:41Z</published><updated>2008-06-13T04:54:41Z</updated><content type="html">&lt;p&gt;During a conversation today, a colleague of mine pointed out something that I didn't know:&amp;#160; A Compressed Folder in Windows XP can be protected with a password.&amp;#160; Like many of you, I've been using XP for years, and yet I somehow missed this.&amp;#160; Therefore, I'm going to write it down!&lt;/p&gt;  &lt;p&gt;You can read all about it in &lt;a href="http://support.microsoft.com/default.aspx/kb/306531" target="_blank"&gt;How To Use Compressed (Zipped) Folders in Windows XP&lt;/a&gt;.&amp;#160; Check out the section entitled &amp;quot;How to Use Password Protection&amp;quot;.&lt;/p&gt;  &lt;p&gt;I've been using Vista for over a year now, so I immediately tried this there.&amp;#160; Interestingly, I couldn't find a way to do it.&amp;#160; You can encrypt the Compressed Folder, but you can't simply password-protect it.&amp;#160; Of course, encryption is much more secure, and Vista emphasizes security.&amp;#160; Still, it's good to know.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8593924" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term="Windows" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/Windows/default.aspx" /><category term="Vista" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/Vista/default.aspx" /></entry><entry><title>Social Bookmarks</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2008/05/30/social-bookmarks.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2008/05/30/social-bookmarks.aspx</id><published>2008-05-30T21:11:50Z</published><updated>2008-05-30T21:11:50Z</updated><content type="html">&lt;p&gt;Microsoft has launched a new &lt;a href="http://social.msdn.microsoft.com/Bookmarks/Default.aspx" target="_blank"&gt;web site&lt;/a&gt; where IT Professionals can store and share Internet bookmarks.&amp;#160; Each bookmark can be tagged and given a friendly name and description, which makes it pretty easy for others to search through the list of bookmarks and find the information that they need.&amp;#160; You can read the &lt;a href="http://social.msdn.microsoft.com/bookmarks/en-US/FAQ/" target="_blank"&gt;official FAQ&lt;/a&gt; here, but the hope is that this will become a valuable resource for those needing good, reliable information about various technologies.&lt;/p&gt;  &lt;p&gt;(By the way, I've given you the links for MSDN.&amp;#160; However, TechNet is doing this too.&amp;#160; You can visit their &lt;a href="http://social.technet.microsoft.com/bookmarks/default.aspx" target="_blank"&gt;web site&lt;/a&gt; and &lt;a href="http://social.technet.microsoft.com/bookmarks/en-US/FAQ/" target="_blank"&gt;FAQ&lt;/a&gt;, but the information seems to be identical.)&lt;/p&gt;  &lt;p&gt;Since I work in Premier Support, I am always hitting various MSDN and TechNet pages. As you might expect, I've found that there are some pages that I hit over and over again.&amp;#160; Therefore, I'm going to start migrating some of my private browser-based bookmarks over to &lt;a href="http://social.msdn.microsoft.com/bookmarks/en-US/user/Jerry%20Dixon/" target="_blank"&gt;my public MSDN bookmark page&lt;/a&gt;.&amp;#160; You are welcome to take a peek, and I hope that you find this useful.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8563878" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term="General" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/General/default.aspx" /></entry><entry><title>Running SQL Reporting Services on Vista</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2008/04/21/running-sql-reporting-services-on-vista.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2008/04/21/running-sql-reporting-services-on-vista.aspx</id><published>2008-04-21T18:33:00Z</published><updated>2008-04-21T18:33:00Z</updated><content type="html">&lt;P&gt;I recently decided to fire up SQL Server 2005 Reporting Services on my Vista laptop.&amp;nbsp; I installed SQL Server 2005 (with SP2 of course!) and made sure that I used the SQL Server User Provisioning tool to give myself full rights.&amp;nbsp; I then launched the Report Manager, and stopped dead in my tracks.&amp;nbsp; I couldn't access the Report Manger.&amp;nbsp; Hmm.&lt;/P&gt;
&lt;P&gt;I am running Vista with ALL of the security features enabled.&amp;nbsp; I do this for two reasons.&amp;nbsp; First, it is more secure.&amp;nbsp; Second, I want to learn how to work in the new environment &lt;EM&gt;without&lt;/EM&gt; turning security features off.&amp;nbsp; I knew that I had a security issue, but I didn't want to "fix" the problem by removing security.&amp;nbsp; Therefore, I launched an elevated IE instance and added my credentials to the Report Manager.&amp;nbsp; I gave myself full rights to everything.&amp;nbsp; That should do it, right?&amp;nbsp; Nope!&amp;nbsp; I still couldn't access Report Manager from a standard IE instance.&amp;nbsp; Hmm.&lt;/P&gt;
&lt;P&gt;I did some more research and found this blog post:&lt;/P&gt;
&lt;P&gt;&lt;A class="" title=http://www.jameskovacs.com/blog/ReportingServicesOnWindowsVistaRedux.aspx href="http://www.jameskovacs.com/blog/ReportingServicesOnWindowsVistaRedux.aspx" target=_blank mce_href="http://www.jameskovacs.com/blog/ReportingServicesOnWindowsVistaRedux.aspx"&gt;http://www.jameskovacs.com/blog/ReportingServicesOnWindowsVistaRedux.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;My problem was solved.&amp;nbsp; All I needed to do was to add the SSRS site to my trusted sites list.&amp;nbsp; This allowed the Report Manager to run in an un-elevated browser instance, but with protected mode turned off.&amp;nbsp; That was the trick, and it all works now.&lt;/P&gt;
&lt;P&gt;I hope this helps!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8414831" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term="SQL" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/SQL/default.aspx" /><category term="Vista" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/Vista/default.aspx" /></entry><entry><title>Microsoft SQL Server Data Services</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2008/03/05/microsoft-sql-server-data-services.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2008/03/05/microsoft-sql-server-data-services.aspx</id><published>2008-03-05T23:14:36Z</published><updated>2008-03-05T23:14:36Z</updated><content type="html">&lt;p&gt;Today at MIX, Microsoft unveiled Microsoft SQL Server&amp;#8482; Data Services (SSDS), a Web-facing utility-based service designed for businesses and developers that need scalable, highly available, secure and easily programmable on-demand data storage with robust database query capabilities. &lt;/p&gt;  &lt;p&gt;What SSDS offers:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Virtually limitless, on-demand scalability. Customers pay only for the resources actually consumed&lt;/li&gt;    &lt;li&gt;Reduced costs.&amp;#160; Customers use the service with minimal up-front infrastructure and operational cost. Businesses can minimize their initial investment in hardware and software and the on-going cost for storage administration, scale maintenance. &lt;/li&gt;    &lt;li&gt;Universal access.&amp;#160; SSDS supports simple web-programming interfaces like SOAP and REST for quick provisioning of web applications. Primary wire format is XML for data interchange.These easy to use, standards-based interfaces enable developers to focus on innovating with data quickly.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Microsoft SSDS is built upon existing Microsoft SQL Server relational database technologies, and will include a strong service level agreement (SLA) for business continuity. This will cover high availability, performance, and protection against data loss. &lt;/p&gt;  &lt;p&gt;For more information, check out the &lt;a href="http://www.microsoft.com/sql/dataservices/default.mspx" target="_blank"&gt;SSDS Home Page&lt;/a&gt;, or &lt;a href="http://blogs.technet.com/dataplatforminsider/default.aspx" target="_blank"&gt;The Data Platform Insider&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8054582" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term="SQL" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/SQL/default.aspx" /></entry><entry><title>The data provider required to connect to the local data file cannot be found</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2008/01/25/the-data-provider-required-to-connect-to-the-local-data-file-cannot-be-found.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2008/01/25/the-data-provider-required-to-connect-to-the-local-data-file-cannot-be-found.aspx</id><published>2008-01-26T01:25:00Z</published><updated>2008-01-26T01:25:00Z</updated><content type="html">&lt;P&gt;I've been trying to get SQL Compact 3.5 working in Visual Studio 2008.&amp;nbsp; Since SQL Compact 3.5 ships with Visual Studio 2008, I thought that this wouldn't be a problem.&amp;nbsp; All I needed to do was to create a new Windows Forms project and add a Local Database item.&amp;nbsp; Sadly, this didn't work.&amp;nbsp; After added the local database, I received an error:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;The data provider required to connect to the local data file cannot be found&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;I couldn't find any reference to this exact message anywhere, but I did find &lt;A href="http://support.microsoft.com/kb/945371" target=_blank mce_href="http://support.microsoft.com/kb/945371"&gt;KB 945371&lt;/A&gt;.&amp;nbsp; Although the article refers to a different problem, it provided a solution to this one as well.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;It seems that when you install VS 2005 and VS 2008 side-by-side, some file paths are incorrectly specified.&amp;nbsp; The solution is to reinstall the SQL Compact Design tools from the installation DVD.&amp;nbsp; (I also reinstalled the Desktop and Device runtimes as well, as I had uninstalled these while trying to solve the problem.) &lt;/P&gt;
&lt;P&gt;After reinstalling these bits, SQL Compact works just fine.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7247754" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term=".NET" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/.NET/default.aspx" /><category term="SQL" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/SQL/default.aspx" /></entry><entry><title>VB 6 Support is Winding Down</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2007/12/14/vb-6-support-is-winding-down.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2007/12/14/vb-6-support-is-winding-down.aspx</id><published>2007-12-15T05:53:07Z</published><updated>2007-12-15T05:53:07Z</updated><content type="html">&lt;p&gt;Ah.... VB 6.&amp;#160; It's been one of my favorite languages.&amp;#160; Over the years, I've created all kinds of programs with it; games, business applications, hardware control systems, etc.&amp;#160; Although I was among the first to admit its faults, I was also one of the first to proclaim its strengths and to defend its value.&amp;#160; Even after moving to .NET, I've always kept VB 6 close at hand.&amp;#160; Sometimes I did this because of necessity, such as when working for companies running multiple large VB6 applications.&amp;#160; At other times, I did it because it was a familiar and trusted tool.&amp;#160; Mostly, though, I think I kept it around because it had always been there, and it just felt right.&lt;/p&gt;  &lt;p&gt;Looking back, I can't help but notice that I've been using it less and less.&amp;#160; In fact, I haven't written any new VB 6 programs in 3 or 4 years.&amp;#160; Instead, I've been been using C# and VB.NET.&amp;#160; However, many developers HAVE continued to use VB 6, as have many companies. It is for those developers and companies that I write this post.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Support for the Visual Basic 6 IDE will cease in April 2008.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;After this date, Microsoft will no longer support issues dealing with the IDE or with Visual Basic source code.&amp;#160; Runtime issues will still be supported, as the VB 6 runtime is supported along with the operating system with which it shipped.&amp;#160; However, for most practical purposes, April marks the beginning of the end for VB 6.&amp;#160; Developers should seriously consider migrating their applications to another supported environment, probably .NET. &lt;/p&gt;  &lt;p&gt;Obviously, this cannot be done overnight, so you should start making your plans now.&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6774409" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term="Support" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/Support/default.aspx" /></entry><entry><title>Web Part Connections in WSS 3.0 (Part 4)</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2007/11/08/web-part-connections-in-wss-3-0-part-4.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2007/11/08/web-part-connections-in-wss-3-0-part-4.aspx</id><published>2007-11-09T03:32:00Z</published><updated>2007-11-09T03:32:00Z</updated><content type="html">&lt;P&gt;In &lt;A title="Part 1" href="http://blogs.msdn.com/jerrydixon/archive/2007/08/31/web-part-connections-in-wss-3-0.aspx" target=_blank mce_href="http://blogs.msdn.com/jerrydixon/archive/2007/08/31/web-part-connections-in-wss-3-0.aspx"&gt;&lt;FONT color=#003399&gt;part 1&lt;/FONT&gt;&lt;/A&gt; of this series, I showed how to make one web part accept data from another.&amp;nbsp; In &lt;A title="Part 2" href="http://blogs.msdn.com/jerrydixon/archive/2007/09/01/web-part-connections-in-wss-3-0-part-2.aspx" target=_blank mce_href="http://blogs.msdn.com/jerrydixon/archive/2007/09/01/web-part-connections-in-wss-3-0-part-2.aspx"&gt;&lt;FONT color=#003399&gt;part 2&lt;/FONT&gt;&lt;/A&gt;, I showed that this can be extended so that one web part can provide data for many.&amp;nbsp; In &lt;A href="http://blogs.msdn.com/jerrydixon/archive/2007/09/02/web-part-connections-in-wss-3-0-part-3.aspx" target=_blank mce_href="http://blogs.msdn.com/jerrydixon/archive/2007/09/02/web-part-connections-in-wss-3-0-part-3.aspx"&gt;part 3&lt;/A&gt;, which I thought was going to be the last part, I&amp;nbsp;showed how a single web part can accept data from multiple web parts.&amp;nbsp; Now, in the fourth part of my three-part series, I'm going to show how data can be passed from one web part to another in a sort of chain.&lt;/P&gt;
&lt;P mce_keep="true"&gt;I have three web parts; NumberPicker, NumberDoubler, and NumberTripler.&amp;nbsp; I want the data to flow like this:&lt;/P&gt;
&lt;P mce_keep="true"&gt;NumberPicker --&amp;gt; NumberDoubler --&amp;gt; NumberTripler&lt;/P&gt;
&lt;P mce_keep="true"&gt;The user will use NumberPicker to select a number from one to five.&amp;nbsp; This number is passed to NumberDoubler, which doubles the number and displays it.&amp;nbsp; This doubled number is then passed to NumberTripler, which triples the number and displays the final result.&amp;nbsp; The important point here is that&amp;nbsp;data is received from one part and provided to the next, and specifically that the data provided depends upon the data recieved.&amp;nbsp;Here's the code that I used:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;INumber&lt;/STRONG&gt;&lt;BR&gt;Public Interface INumber&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly Property Number() As Integer&lt;/P&gt;
&lt;P mce_keep="true"&gt;End Interface&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;NumberPicker&lt;BR&gt;&lt;/STRONG&gt;Imports System&lt;BR&gt;Imports System.ComponentModel&lt;BR&gt;Imports System.Web.UI.HtmlControls&lt;BR&gt;Imports System.Web.UI.WebControls&lt;BR&gt;Imports System.Web.UI.WebControls.WebParts&lt;/P&gt;
&lt;P mce_keep="true"&gt;Public Class NumberPicker&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits WebPart&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Implements INumber&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private _NumberList As DropDownList&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub New()&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.ExportMode = WebPartExportMode.All&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub CreateChildControls()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.CreateChildControls()&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim t As Table = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim tr As TableRow = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim td As TableCell = Nothing&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&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; _NumberList = New DropDownList&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; With _NumberList&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; .AutoPostBack = True&lt;/P&gt;
&lt;P mce_keep="true"&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; .Items.Clear()&lt;/P&gt;
&lt;P mce_keep="true"&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; .Items.Add(New ListItem("One", 1))&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; .Items.Add(New ListItem("Two", 2))&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; .Items.Add(New ListItem("Three", 3))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Items.Add(New ListItem("Four", 4))&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; .Items.Add(New ListItem("Five", 5))&lt;/P&gt;
&lt;P mce_keep="true"&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; .SelectedIndex = 0&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; End With&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t = New Table&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; tr = New TableRow&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; td = New TableCell&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; td.Text = "Number: "&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; tr.Controls.Add(td)&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; td = New TableCell&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; td.Controls.Add(_NumberList)&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; tr.Controls.Add(td)&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.Controls.Add(tr)&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.Controls.Add(t)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&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; Me.Controls.Clear()&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim msg As New Literal()&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; msg.Text = ex.Message&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; Me.Controls.Add(msg)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConnectionProvider("Selected Number")&amp;gt; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function GetNumberInterface() As INumber&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return Me&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public ReadOnly Property Number() As Integer Implements INumber.Number&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return _NumberList.SelectedValue&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;/P&gt;
&lt;P mce_keep="true"&gt;End Class&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;NumberDoubler&lt;/STRONG&gt;&lt;BR&gt;Imports System&lt;BR&gt;Imports System.ComponentModel&lt;BR&gt;Imports System.Web.UI.HtmlControls&lt;BR&gt;Imports System.Web.UI.WebControls&lt;BR&gt;Imports System.Web.UI.WebControls.WebParts&lt;/P&gt;
&lt;P mce_keep="true"&gt;Public Class NumberDoubler&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits WebPart&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Implements INumber&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _numberInterface As INumber = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _number As Integer = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _result As Integer = 0&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _headerMessage As Literal = Nothing&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub New()&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.ExportMode = WebPartExportMode.All&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub CreateChildControls()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.CreateChildControls()&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&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; _headerMessage = New Literal&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; Me.Controls.Add(_headerMessage)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&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; Me.Controls.Clear()&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim msg As New Literal()&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; msg.Text = ex.Message&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; Me.Controls.Add(msg)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnPreRender(e)&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If _numberInterface IsNot Nothing Then&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; _number = _numberInterface.Number&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; _result = 2 * _number&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter)&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If _headerMessage IsNot Nothing AndAlso _number &amp;gt; 0 Then&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; _headerMessage.Text = _result&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.RenderContents(writer)&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConnectionConsumer("Selected Number", "1")&amp;gt; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub AcceptNumberInterface(ByVal numberInterface As INumber)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _numberInterface = numberInterface&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConnectionProvider("Doubled Number", "2")&amp;gt; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function GetNumberInterface() As INumber&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return Me&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public ReadOnly Property Number() As Integer Implements INumber.Number&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return _result&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;BR&gt;End Class&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;NumberTripler&lt;/STRONG&gt;&lt;BR&gt;Imports System&lt;BR&gt;Imports System.ComponentModel&lt;BR&gt;Imports System.Web.UI.HtmlControls&lt;BR&gt;Imports System.Web.UI.WebControls&lt;BR&gt;Imports System.Web.UI.WebControls.WebParts&lt;/P&gt;
&lt;P mce_keep="true"&gt;Public Class NumberTripler&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits WebPart&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _numberInterface As INumber = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _number As Integer = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _result As Integer = 0&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _headerMessage As Literal = Nothing&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub New()&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.ExportMode = WebPartExportMode.All&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub CreateChildControls()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.CreateChildControls()&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&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; _headerMessage = New Literal&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; Me.Controls.Add(_headerMessage)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&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; Me.Controls.Clear()&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim msg As New Literal()&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; msg.Text = ex.Message&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; Me.Controls.Add(msg)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnPreRender(e)&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If _numberInterface IsNot Nothing Then&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; _number = _numberInterface.Number&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; _result = 3 * _number&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter)&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If _headerMessage IsNot Nothing AndAlso _number &amp;gt; 0 Then&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; _headerMessage.Text = _result&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.RenderContents(writer)&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConnectionConsumer("Doubled Number", "3")&amp;gt; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub AcceptNumberInterface(ByVal numberInterface As INumber)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _numberInterface = numberInterface&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P mce_keep="true"&gt;End Class&lt;/P&gt;
&lt;P mce_keep="true"&gt;The real trick here is that the numbers are calculated during the OnPreRender event.&amp;nbsp; We have to wait long enough to ensure that&amp;nbsp;the NumberPicker web&amp;nbsp;part has created its internal controls, which is where the original data resides.&amp;nbsp; We also need to act early enough to allow the data to be passed along from part to part.&amp;nbsp;&amp;nbsp;If you are not careful, one of the web parts may be rendered before the data has been passed to it.&lt;/P&gt;
&lt;P mce_keep="true"&gt;I hope this helps.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6001233" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term="WSS" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/WSS/default.aspx" /><category term=".NET" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/.NET/default.aspx" /></entry><entry><title>Virus Scanners and ASP.NET apps don't always mix</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2007/09/28/virus-scanners-and-asp-net-apps-don-t-always-mix.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2007/09/28/virus-scanners-and-asp-net-apps-don-t-always-mix.aspx</id><published>2007-09-29T00:45:00Z</published><updated>2007-09-29T00:45:00Z</updated><content type="html">&lt;P&gt;In&amp;nbsp;a &lt;A class="" href="http://blogs.msdn.com/jerrydixon/archive/2007/09/20/alternate-data-streams.aspx" mce_href="http://blogs.msdn.com/jerrydixon/archive/2007/09/20/alternate-data-streams.aspx"&gt;previous post&lt;/A&gt;, I talked about Alternate Data Streams and how some virus-scanning engines use them for tracking purposes.&amp;nbsp; When this happens, the file is changed.&amp;nbsp; It doesn't matter that the "real" data hasn't changed.&amp;nbsp; The system still knows that a change has occurred.&amp;nbsp;&amp;nbsp;When this happens to a file inside an ASP.NET web site, this can cause some interesting side effects.&lt;/P&gt;
&lt;P&gt;First, let's review File&amp;nbsp;Change Notification in ASP.NET 2.0.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ASP.NET receives a notification whenever a file in a virtual folder is changed.&amp;nbsp; This includes updates, inserts, and deletions.&amp;nbsp; When a change occurs, the application is restarted.&amp;nbsp; This causes a loss of application state, including session variables, cached data, and so on.&amp;nbsp; See these&amp;nbsp;sites for more info:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/toddca/archive/2006/07/17/update-deleting-asp-net-2-0-application-sub-directories-shuts-down-the-appdomain.aspx"&gt;http://blogs.msdn.com/toddca/archive/2006/07/17/update-deleting-asp-net-2-0-application-sub-directories-shuts-down-the-appdomain.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://weblogs.asp.net/owscott/archive/2006/02/21/ASP.NET-v2.0-_2D00_-AppDomain-recycles_2C00_-more-common-than-before.aspx"&gt;http://weblogs.asp.net/owscott/archive/2006/02/21/ASP.NET-v2.0-_2D00_-AppDomain-recycles_2C00_-more-common-than-before.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Now, let's add virus scanning to the mix.&amp;nbsp; Since some scanning engines insert tracking information inside a file's alternate data stream, and since this action can be considered a change to the file, this can cause an application restart.&amp;nbsp; Yes, that's right.&amp;nbsp; Using a virus scanner to scan your application files for viruses can cause your web application to restart.&amp;nbsp; Refer to this KB article: &lt;A href="http://support.microsoft.com/kb/312592"&gt;http://support.microsoft.com/kb/312592&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;I'm seeing more of this lately, so I though I'd put the word out.&amp;nbsp; Test your virus scanner against your web applications before you place them in production.&amp;nbsp; If you have this problem, you can exclude the application folders from scanning or you can try the steps listed in this KB article: &lt;A href="http://support.microsoft.com/kb/911272"&gt;http://support.microsoft.com/kb/911272&lt;/A&gt;.&amp;nbsp; I'm not really happy with either solution, so I'm not making any recommendations.&amp;nbsp; However, I do urge you to perform a test before you go live.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5192973" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term="Windows" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/Windows/default.aspx" /><category term=".NET" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/.NET/default.aspx" /></entry><entry><title>Alternate Data Streams</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2007/09/20/alternate-data-streams.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2007/09/20/alternate-data-streams.aspx</id><published>2007-09-21T01:00:00Z</published><updated>2007-09-21T01:00:00Z</updated><content type="html">&lt;P&gt;I want to recap a topic that has been around for a while:&amp;nbsp; Alternate Data Streams.&amp;nbsp; This topic has resurfaced again in an interesting way.&amp;nbsp; I'm going to tell you about it in later&amp;nbsp;post.&amp;nbsp; However, I thought I'd explain Alternate Data Streams again, just in case some of you don't know what they are.&amp;nbsp; The later post will then make more sense.&lt;/P&gt;
&lt;P&gt;So, what are&amp;nbsp;Alternate Data Streams?&amp;nbsp; Well, it happens that NTFS files can have more than one set of&amp;nbsp;data&amp;nbsp;stored inside them.&amp;nbsp; (You cross-platform guys might know about "resource forks."&amp;nbsp; This is a similar concept.)&amp;nbsp; Everyone knows about the primary stream.&amp;nbsp; This is the data that we normally associate with files.&amp;nbsp; It is the data that we see when we open the file, and it accounts for the file size numbers that we see in file listings.&amp;nbsp; However, we can "hide" other sets of data in a file too.&amp;nbsp; Let's look at a simple example. (It is very important that you use the same commands that I do.&amp;nbsp; Not all console commands are aware of alternate data streams.)&lt;/P&gt;
&lt;P&gt;Open a command window and try the following:&lt;/P&gt;
&lt;P&gt;Create a file called "names.txt" that contains my name:&lt;BR&gt;&lt;FONT face="courier new,courier"&gt;echo Jerry &amp;gt; names.txt&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Prove that the file contains my name:&lt;BR&gt;&lt;FONT face="courier new,courier"&gt;more &amp;lt;&amp;nbsp;names.txt&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Get the size of the file:&lt;BR&gt;&lt;FONT face="courier new,courier"&gt;dir names.txt&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;You should see that the file contains 8 bytes.&amp;nbsp; That's 5 bytes for my name, 2 bytes for the CRLF, and 1 byte for the space.&amp;nbsp; (Look closely at the command.&amp;nbsp; There's a space between my name and the "&amp;gt;" character.)&amp;nbsp; This is all very normal.&amp;nbsp; Now let's mess with some alternate streams.&lt;/P&gt;
&lt;P&gt;Add my wife's name to the file, in an alternate data stream:&lt;BR&gt;&lt;FONT face="courier new,courier"&gt;echo Tammy &amp;gt; names.txt:wife&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Prove that the file contains&amp;nbsp;both names:&lt;BR&gt;&lt;FONT face="courier new,courier"&gt;more &amp;lt; names.txt&lt;BR&gt;more &amp;lt; names.txt:wife&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Get the size of the file:&lt;BR&gt;&lt;FONT face="courier new,courier"&gt;dir names.txt&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;There are now two separate sets of data in this one file.&amp;nbsp; One, the default, contains my name.&amp;nbsp; The alternate stream contains my wife's name.&amp;nbsp; However, the directory listing shows 8 bytes, not the 16 that are actually there.&amp;nbsp; The &lt;FONT face="courier new,courier"&gt;dir&lt;/FONT&gt; command is not aware of alternate data streams, so it doesn't account for them in its listing.&amp;nbsp; Some of the file's data is now hidden.&lt;/P&gt;
&lt;P&gt;Let go one step further.&amp;nbsp; Add my son's name:&lt;BR&gt;&lt;FONT face="courier new,courier"&gt;echo &amp;gt; Evan names.txt:son&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Check out the results as we did before.&amp;nbsp; You now have&amp;nbsp;23 bytes of data contained in three steams, but the directory listing still shows 8.&lt;/P&gt;
&lt;P&gt;Neat, huh?&lt;/P&gt;
&lt;P&gt;I'll leave the rest to you.&amp;nbsp; Remember that we are talking data streams here, not text.&amp;nbsp; There is a demo on the web that shows how to hide calc.exe inside sol.exe.&amp;nbsp; You can execute either program, too.&amp;nbsp; The possibilities run deep.&lt;/P&gt;
&lt;P&gt;Now, why did I bring this up?&amp;nbsp; I'll tell you more in another post.&amp;nbsp; However, for right now, you should know that many programs take advantage of these streams.&amp;nbsp; For example, some&amp;nbsp;virus scanners hide tracking data in the files that they scan.&amp;nbsp; Some viruses hide themselves in there too.&amp;nbsp; Stay turned for more.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5020384" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term="Windows" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/Windows/default.aspx" /></entry><entry><title>Web Part Connections in WSS 3.0 (Part 3)</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2007/09/02/web-part-connections-in-wss-3-0-part-3.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2007/09/02/web-part-connections-in-wss-3-0-part-3.aspx</id><published>2007-09-02T23:34:00Z</published><updated>2007-09-02T23:34:00Z</updated><content type="html">&lt;P&gt;In &lt;A title="Part 1" href="http://blogs.msdn.com/jerrydixon/archive/2007/08/31/web-part-connections-in-wss-3-0.aspx" target=_blank mce_href="http://blogs.msdn.com/jerrydixon/archive/2007/08/31/web-part-connections-in-wss-3-0.aspx"&gt;&lt;FONT color=#003399&gt;part 1&lt;/FONT&gt;&lt;/A&gt; of this series, I showed how to make one web part accept data from another.&amp;nbsp; In &lt;A title="Part 2" href="http://blogs.msdn.com/jerrydixon/archive/2007/09/01/web-part-connections-in-wss-3-0-part-2.aspx" target=_blank mce_href="http://blogs.msdn.com/jerrydixon/archive/2007/09/01/web-part-connections-in-wss-3-0-part-2.aspx"&gt;part 2&lt;/A&gt;, I showed that this can be extended so that one web part can provide data for many.&amp;nbsp; Now, in this final post of the series, I'll show how a single web part can accept data from multiple web parts.&amp;nbsp; As you will see, we need to make only a few changes for this to happen.&lt;/P&gt;
&lt;P&gt;Let's continue from where we left off.&amp;nbsp; Our page now has three web parts.&amp;nbsp; The first, HanoiDisks, allows the user to select the number of disks that should be used for our Towers of Hanoi puzzle.&amp;nbsp; The second web part, HanoiSteps, displays the steps needed to solve the puzzle.&amp;nbsp; The third web part, HanoiCount, displays the number of steps that will be needed to complete the puzzle.&amp;nbsp; Now we'll add a fourth web part.&amp;nbsp; This web part, HanoiColor, will allow the user to select the font color used by the HanoiCount web part.&amp;nbsp; HanoiCount will then be using data from both the the HanoiColor and the HanoiDisk web parts.&lt;/P&gt;
&lt;P&gt;So far, we've been passing around instances of the IDisks interface.&amp;nbsp; We're now going to pass color information, so we need a new interface:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;IColor.cb&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;Public Interface IColor&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly Property Color() As Integer&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;End Interface&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;This interface will allow a color number to be passed from HanoiColor to HanoiCount.&amp;nbsp; First, lets look at the new HanoiColor web part:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;HanoiColor.vb&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;Imports System&lt;BR&gt;Imports System.Drawing&lt;BR&gt;Imports System.ComponentModel&lt;BR&gt;Imports System.Web.UI.HtmlControls&lt;BR&gt;Imports System.Web.UI.WebControls&lt;BR&gt;Imports System.Web.UI.WebControls.WebParts&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;Public Class HanoiColor&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits WebPart&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Implements IColor&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _colorList As DropDownList = Nothing&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub CreateChildControls()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.CreateChildControls()&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&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; _colorList = New DropDownList&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; With _colorList&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; .AutoPostBack = True&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&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; .Items.Clear()&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&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; .Items.Add(New ListItem("Black", 0))&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; .Items.Add(New ListItem("Blue", 1))&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; .Items.Add(New ListItem("Green", 2))&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; .Items.Add(New ListItem("Red", 3))&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&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; .SelectedIndex = 0&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; End With&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim lit As New Literal()&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; lit.Text = "Text Color: "&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; Me.Controls.Add(lit)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.Controls.Add(_colorList)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&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; Me.Controls.Clear()&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim msg As New Literal()&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; msg.Text = ex.Message&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; Me.Controls.Add(msg)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConnectionProvider("Text Color")&amp;gt; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function GetColorInterface() As IColor&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return Me&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public ReadOnly Property Color() As Integer Implements IColor.Color&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return _colorList.SelectedValue&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;BR&gt;End Class&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;By now, you should recognize all of the features of this code.&amp;nbsp; The GetColorInterface method provides an instance of the&amp;nbsp;IColor interface, and uses the ConnectionProvider attribute to communicate this fact to WSS.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Now, let's look at the HanoiCount web part.&amp;nbsp; It now needs to accept data from two different sources, so some code changes are needed:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;HanoiCount.vb&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;Imports System&lt;BR&gt;Imports System.Drawing&lt;BR&gt;Imports System.ComponentModel&lt;BR&gt;Imports System.Web.UI.HtmlControls&lt;BR&gt;Imports System.Web.UI.WebControls&lt;BR&gt;Imports System.Web.UI.WebControls.WebParts&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;Public Class HanoiCount&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits WebPart&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _diskInterface As IDisks = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _disks As Integer = 0&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _colorInterface As IColor = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _color As String = "#000000;"&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _headerMessage As Literal = Nothing&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub CreateChildControls()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.CreateChildControls()&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&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; _headerMessage = New Literal&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; Me.Controls.Add(_headerMessage)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&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; Me.Controls.Clear()&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim msg As New Literal()&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; msg.Text = ex.Message&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; Me.Controls.Add(msg)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnPreRender(e)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If _diskInterface IsNot Nothing Then&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; _disks = _diskInterface.NumberOfDisks&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If _colorInterface IsNot Nothing Then&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; _color = GetColorFromNumber(_colorInterface.Color)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Function GetColorFromNumber(ByVal colorNumber As Integer) As String&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim selectedColor As String = "#000000;"&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Select Case colorNumber&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; Case 0&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; selectedColor = "#000000;"&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; Case 1&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; selectedColor = "#0000FF;"&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; Case 2&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; selectedColor = "#00FF00;"&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; Case 3&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; selectedColor = "#FF0000;"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Select&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return selectedColor&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If _headerMessage IsNot Nothing AndAlso _disks &amp;gt; 1 Then&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; Dim steps As Integer = 2 ^ _disks - 1&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; With _headerMessage&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; .Text = "&amp;lt;span style=""color:" &amp;amp; _color &amp;amp; """&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; .Text &amp;amp;= "There are " &amp;amp; steps &amp;amp; " steps for " &amp;amp; _disks &amp;amp; " disks."&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; .Text &amp;amp;= "&amp;lt;/span&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; End With&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.RenderContents(writer)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConnectionConsumer("Number of Disks", "1")&amp;gt; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub AcceptDiskInterface(ByVal diskInterface As IDisks)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _diskInterface = diskInterface&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConnectionConsumer("Text Color", "2")&amp;gt; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub AcceptColorInterface(ByVal colorInterface As IColor)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _colorInterface = colorInterface&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;End Class&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;Notice that two interfaces are used here.&amp;nbsp; This fact is reflected throughout most of the code.&amp;nbsp; Also notice that there are two methods that accept interfaces; AcceptDiskInterface and AcceptColorInterface.&amp;nbsp; Look closely at the ConnectionConsumer attributes.&amp;nbsp; Up until now, I've&amp;nbsp;supplied only one parameter to the attribute constructor.&amp;nbsp; This works just fine when there is only one ConnectionConsumer or ConnectionProvider attribute used by a web part.&amp;nbsp; When you have more than one, however, you need to also supply a unique identifier for each attribute.&amp;nbsp; This is the real trick to using multiple web part connections.&lt;/P&gt;
&lt;P mce_keep="true"&gt;At this point, we've written four web parts that communicate with each other in various ways:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;HanoiCount - provides an instance of the IColor interface to the HanoiCount web part&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;HanoiDisks - provides an instance of the IDisks interface to the HanoiCount and HanoiSteps web parts&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;HanoiCount - accepts an instance of the IColor interface from the HanoiColor web part, and an instance of the IDisks interface from the HanoiDisks web part&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;HanoiSteps - accepts an instance of the IDisks interface from the HanoiDisks web part&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;I leave it to the reader to create a final web part; one&amp;nbsp;that&amp;nbsp;is both a provider and a consumer of data.&amp;nbsp; The can be accomplished by using the same&amp;nbsp;techniques presented in this series of posts.&lt;/P&gt;
&lt;P mce_keep="true"&gt;I hope these posts have helped you get started with web part communication.&amp;nbsp; This can be a very useful feature of WSS 3.0.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4710747" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term="WSS" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/WSS/default.aspx" /><category term=".NET" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/.NET/default.aspx" /></entry><entry><title>Web Part Connections in WSS 3.0 (Part 2)</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2007/09/01/web-part-connections-in-wss-3-0-part-2.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2007/09/01/web-part-connections-in-wss-3-0-part-2.aspx</id><published>2007-09-02T03:23:00Z</published><updated>2007-09-02T03:23:00Z</updated><content type="html">&lt;P&gt;In &lt;A title="Part 1" href="http://blogs.msdn.com/jerrydixon/archive/2007/08/31/web-part-connections-in-wss-3-0.aspx" target=_blank mce_href="http://blogs.msdn.com/jerrydixon/archive/2007/08/31/web-part-connections-in-wss-3-0.aspx"&gt;part 1&lt;/A&gt; of this series, I showed how to make one web part accept data from another.&amp;nbsp; In this part, I'll show how one web part can send data to two different web parts.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Let's add another web part.&amp;nbsp; We already have a web part that allows the user to select the number of disks to use in our Towers of Hanoi puzzle.&amp;nbsp; We also have a web part that displays the steps needed to solve the puzzle for that number of disks.&amp;nbsp; Now, let's add a web part that displays the number of steps the are needed.&amp;nbsp; This part will get it's data from&amp;nbsp;the HanoiDisks web part, just like the HanoiSteps web part does.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;HanoiCount.vb&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;Imports System&lt;BR&gt;Imports System.Drawing&lt;BR&gt;Imports System.ComponentModel&lt;BR&gt;Imports System.Web.UI.HtmlControls&lt;BR&gt;Imports System.Web.UI.WebControls&lt;BR&gt;Imports System.Web.UI.WebControls.WebParts&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;Public Class HanoiCount&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits WebPart&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _diskInterface As IDisks = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _disks As Integer = 0&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _headerMessage As Literal = Nothing&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub CreateChildControls()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.CreateChildControls()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&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; _headerMessage = New Literal&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; Me.Controls.Add(_headerMessage)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&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; Me.Controls.Clear()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim msg As New Literal()&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; msg.Text = ex.Message&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; Me.Controls.Add(msg)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnPreRender(e)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If _diskInterface IsNot Nothing Then&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; _disks = _diskInterface.NumberOfDisks&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If _headerMessage IsNot Nothing AndAlso _disks &amp;gt; 1 Then&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; Dim steps As Integer = 2 ^ _disks - 1&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; With _headerMessage&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; .Text = "There are " &amp;amp; steps &amp;amp; " steps for " &amp;amp; _disks &amp;amp; " disks."&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; End With&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.RenderContents(writer)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConnectionConsumer("Number of Disks")&amp;gt; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub AcceptDiskInterface(ByVal diskInterface As IDisks)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _diskInterface = diskInterface&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;End Class&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;If you read part 1, then this should look very familiar.&amp;nbsp; In fact, there is no real difference between a web part providing data to&amp;nbsp;one web part, and a web part providing data to many web parts.&amp;nbsp; Add this web part to the same page as the HanoiDisks and HanoiSteps web parts from part 1, and you see what I mean.&lt;/P&gt;
&lt;P mce_keep="true"&gt;In my next post, I'll show you how to do something that IS a bit different.&amp;nbsp; I'll show you how one web part can accept data from two different web parts.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4696201" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term="WSS" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/WSS/default.aspx" /><category term=".NET" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/.NET/default.aspx" /></entry><entry><title>Web Part Connections in WSS 3.0</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2007/08/31/web-part-connections-in-wss-3-0.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2007/08/31/web-part-connections-in-wss-3-0.aspx</id><published>2007-09-01T01:49:00Z</published><updated>2007-09-01T01:49:00Z</updated><content type="html">&lt;P&gt;&lt;A title="Josh Holmes" href="http://www.joshholmes.com/" target=_blank mce_href="http://www.joshholmes.com"&gt;Josh Holmes&lt;/A&gt; recently asked me to present a couple of small demos for an &lt;A title=ArcReady href="http://www.arcready.com/" target=_blank mce_href="http://www.arcready.com/"&gt;ArcReady&lt;/A&gt; event in Memphis.&amp;nbsp; While looking through my material, I discovered a couple of web parts that I had written a while ago.&amp;nbsp; I wrote these web parts in order to investigate how to send data from one part to another.&amp;nbsp;&amp;nbsp;They illustrate how easy it is to set up Web Part Connections in WSS 3.0, so I thought I'd share them here.&lt;/P&gt;
&lt;P&gt;In this post, I'll show how to send data from one web part to another.&amp;nbsp; Later posts will&amp;nbsp;demonstrate how&amp;nbsp;one web part can provide data to&amp;nbsp;multiple web parts, how one&amp;nbsp;web part can consume data from multiple parts, and how a web part can be a provider and a consumer at the same time.&amp;nbsp; As you will see, with WSS 3.0, this is very easy to do.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Now, programs need a purpose, and web parts are no different.&amp;nbsp;&amp;nbsp;These web parts&amp;nbsp;provide different types of information about the &lt;A title="Towers of Hanoi on Wikipedia" href="http://en.wikipedia.org/wiki/Tower_of_Hanoi" target=_blank mce_href="http://en.wikipedia.org/wiki/Tower_of_Hanoi"&gt;Towers of Hanoi puzzle&lt;/A&gt;.&amp;nbsp; In this post, I'll use two web parts.&amp;nbsp; One web part contains a drop-down list that can be used to specify the number of disks used for the puzzle.&amp;nbsp; The second web part contains a list box that enumerates the steps needed to solve the puzzle with the number of disks specified in the first web part.&amp;nbsp; For this to work properly, the second web part must obtain data from the first web part.&amp;nbsp; So, how does this work?&lt;/P&gt;
&lt;P mce_keep="true"&gt;First, data is exchanged via interfaces. In this case, the interface is called IDisks:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;IDisks.vb&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;Public Interface IDisks&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadOnly Property NumberOfDisks() As Integer&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;End Interface&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;This interface will be used to pass the selected number of disks from one web part to the other.&lt;/P&gt;
&lt;P mce_keep="true"&gt;The first web part will allow the user to select the number of disks that should be used for the puzzle.&amp;nbsp; It is called HanoiDisks:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;HanoiDisks.vb&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;Imports System&lt;BR&gt;Imports System.ComponentModel&lt;BR&gt;Imports System.Web.UI.HtmlControls&lt;BR&gt;Imports System.Web.UI.WebControls&lt;BR&gt;Imports System.Web.UI.WebControls.WebParts&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;Public Class HanoiDisks&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits WebPart&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Implements IDisks&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected diskList As DropDownList = Nothing&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub CreateChildControls()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.CreateChildControls()&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim t As Table = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim tr As TableRow = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim td As TableCell = Nothing&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&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; diskList = New DropDownList&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; With diskList&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; .AutoPostBack = True&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&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; .Items.Clear()&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&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; .Items.Add(New ListItem("Three", 3))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Items.Add(New ListItem("Four", 4))&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; .Items.Add(New ListItem("Five", 5))&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; .Items.Add(New ListItem("Six", 6))&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; .Items.Add(New ListItem("Seven", 7))&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; .Items.Add(New ListItem("Eight", 8))&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&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; .SelectedIndex = 0&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; End With&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t = New Table&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; tr = New TableRow&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; td = New TableCell&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; td.Text = "Number of Disks: "&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; tr.Controls.Add(td)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; td = New TableCell&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; td.Controls.Add(diskList)&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; tr.Controls.Add(td)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.Controls.Add(tr)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.Controls.Add(t)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&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; Me.Controls.Clear()&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim msg As New Literal()&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; msg.Text = ex.Message&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; Me.Controls.Add(msg)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConnectionProvider("Number of Disks")&amp;gt; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function GetDiskInterface() As IDisks&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return Me&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public ReadOnly Property NumberOfDisks() As Integer Implements IDisks.NumberOfDisks&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return diskList.SelectedValue&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;End Class&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;Notice that HanoiDisks inherits from WebPart.&amp;nbsp; This is the standard .NET 2.0 WebPart class, and it performs most of the work for us.&amp;nbsp; All we have to do is override&amp;nbsp;CreateChildControls to&amp;nbsp;add our UI.&amp;nbsp; The HanoiDisks class also&amp;nbsp;implements the IDisks interface that was mentioned earlier.&amp;nbsp; It returns the value of the selected item in the dropdown list in our UI.&lt;/P&gt;
&lt;P mce_keep="true"&gt;The GetDiskInterface method is the key to the web part communication.&amp;nbsp; It returns the HanoiDisks class as an instance of the IDisks interface.&amp;nbsp; It uses the ConnectionProvider attribute to inform WSS that this method provides data for another web part.&amp;nbsp; WSS does the rest.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Now let's look at the HanoiSteps web part, which lists the steps needed to solve the puzzle.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;HanoiSteps.vb&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;Imports System&lt;BR&gt;Imports System.ComponentModel&lt;BR&gt;Imports System.Web.UI.HtmlControls&lt;BR&gt;Imports System.Web.UI.WebControls&lt;BR&gt;Imports System.Web.UI.WebControls.WebParts&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;Public Class HanoiSteps&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits WebPart&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _diskInterface As IDisks = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _disks As Integer = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _stepList As ListBox = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected _headerMessage As Literal = Nothing&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub CreateChildControls()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.CreateChildControls()&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&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; _headerMessage = New Literal&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; Me.Controls.Add(_headerMessage)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim br As New HtmlGenericControl("br")&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; Me.Controls.Add(br)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _stepList = New ListBox&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; With _stepList&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; .SelectionMode = ListSelectionMode.Single&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; .Rows = 7&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; End With&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.Controls.Add(_stepList)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&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; Me.Controls.Clear()&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim msg As New Literal()&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; msg.Text = ex.Message&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; Me.Controls.Add(msg)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnPreRender(e)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If _diskInterface IsNot Nothing Then&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; _disks = _diskInterface.NumberOfDisks&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If _headerMessage IsNot Nothing Then&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; _headerMessage.Text = "Here are the steps for " &amp;amp; _disks &amp;amp; " disks:"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If _stepList IsNot Nothing AndAlso _disks &amp;gt; 1 Then&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; FillListWithSteps(_stepList, _disks)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.RenderContents(writer)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConnectionConsumer("Number of Disks")&amp;gt; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub AcceptDiskInterface(ByVal diskInterface As IDisks)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _diskInterface = diskInterface&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub FillListWithSteps(ByVal list As ListBox, ByVal disks As Integer)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Items.Clear()&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Towers(list, disks, 1, 3, 2)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub Towers(ByVal list As ListBox, ByVal disks As Integer, ByVal fromPole As Integer, ByVal toPole As Integer, ByVal usingPole As Integer)&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If disks = 1 Then&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; list.Items.Add(String.Format("Move a disk from pole {0} to pole {1}", fromPole, toPole))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&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; Towers(list, disks - 1, fromPole, usingPole, toPole)&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; Towers(list, 1, fromPole, toPole, usingPole)&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; Towers(list, disks - 1, usingPole, toPole, fromPole)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT face="courier new,courier"&gt;End Class&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;Most of this code is needed just to make this web part work.&amp;nbsp; That is, to create&amp;nbsp;UI controls that list the steps needed to solve the puzzle.&amp;nbsp; The AcceptDiskInterface method is the key to accepting data from the first web part.&amp;nbsp; It accepts an instance of the IDisks interface and stores it for later use.&amp;nbsp; The ConnectionConsumer attribute is used to tell WSS that this method will consume data.&amp;nbsp; The OnPreRender method checks to see if the interface has been received.&amp;nbsp; If so, it stores the number of disks in a variable.&amp;nbsp; The RenderContents method uses this variable to determine how many disks have been specified, and what steps are needed to solve the puzzle.&lt;/P&gt;
&lt;P mce_keep="true"&gt;All that's left is to edit one of the web parts, select the connections menu, and link the parts together.&lt;/P&gt;
&lt;P mce_keep="true"&gt;This completes the first post.&amp;nbsp; We've seen how one web part can pass data to another.&amp;nbsp; Look for another post soon,&amp;nbsp;where I'll expand on this topic.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;EM&gt;Note that, while you are free to use this code as you wish, it comes with no guarantees.&amp;nbsp; I wrote it simply for illustration purposes, not for actual use.&lt;/EM&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4679548" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term="WSS" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/WSS/default.aspx" /><category term=".NET" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/.NET/default.aspx" /></entry><entry><title>Subscribe to the Lifecycle Newsletter</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2007/08/27/subscribe-to-the-lifecycle-newsletter.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2007/08/27/subscribe-to-the-lifecycle-newsletter.aspx</id><published>2007-08-28T01:12:00Z</published><updated>2007-08-28T01:12:00Z</updated><content type="html">&lt;P&gt;In my last &lt;A href="http://blogs.msdn.com/jerrydixon/archive/2007/08/16/check-your-service-pack-lifecycle.aspx" target=_blank mce_href="http://blogs.msdn.com/jerrydixon/archive/2007/08/16/check-your-service-pack-lifecycle.aspx"&gt;post&lt;/A&gt;, I discussed the Microsoft product lifecycle site, and how you should use it to ensure that your products remain supported.&amp;nbsp; If you have a lot of products, this can be pretty time-cosuming.&amp;nbsp; There is a better way.&amp;nbsp; Simply subscribe the the quarterly newsletter.&amp;nbsp; Each quarter, you'll receive an email update of all of the products that are undergoing a change in their support status.&amp;nbsp; This includes any change in support, including support phase transitions or a complete loss of support.&lt;/P&gt;
&lt;P&gt;Check it out &lt;A href="https://profile.microsoft.com/RegSysProfileCenter/subscriptionwizard.aspx?wizid=98973176-f0b1-4f60-957d-5936c3b933c0&amp;amp;lcid=1033" target=_blank mce_href="https://profile.microsoft.com/RegSysProfileCenter/subscriptionwizard.aspx?wizid=98973176-f0b1-4f60-957d-5936c3b933c0&amp;amp;lcid=1033"&gt;here&lt;/A&gt;.&amp;nbsp; It can save you a lot of time and trouble.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4598488" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term="Support" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/Support/default.aspx" /></entry><entry><title>Check Your Service Pack Lifecycle</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jerrydixon/archive/2007/08/16/check-your-service-pack-lifecycle.aspx" /><id>http://blogs.msdn.com/jerrydixon/archive/2007/08/16/check-your-service-pack-lifecycle.aspx</id><published>2007-08-17T04:06:00Z</published><updated>2007-08-17T04:06:00Z</updated><content type="html">&lt;P&gt;Many people know about the &lt;A href="http://www.microsoft.com/lifecycle" target=_blank mce_href="http://www.microsoft.com/lifecycle"&gt;support lifecycle site&lt;/A&gt; at Microsoft.&amp;nbsp; It contains information about the support policy for Microsoft products.&amp;nbsp; It&amp;nbsp;allows you to look up a specific version of a Microsoft product and to see when support for that product ends.&amp;nbsp; It also explains the support phases that a product can travel through, and how these phases affect support for different customers. (You can read about the support phases &lt;A href="http://support.microsoft.com/?LN=en-us&amp;amp;scid=gp%3B%5Bln%5D%3Blifecycle&amp;amp;x=14&amp;amp;y=14#Phases%20of%20the%20Support%20Lifecycle" target=_blank mce_href="http://support.microsoft.com/?LN=en-us&amp;amp;scid=gp%3B%5Bln%5D%3Blifecycle&amp;amp;x=14&amp;amp;y=14#Phases%20of%20the%20Support%20Lifecycle"&gt;here&lt;/A&gt;.)&lt;/P&gt;
&lt;P&gt;Now that I work for Microsoft Services, this support page has become very important to me.&amp;nbsp; I've discovered that many people DO NOT know that Service Packs also have a support lifecycle.&amp;nbsp; Even though a&amp;nbsp;product has support, a particular&amp;nbsp;Service Pack may not.&amp;nbsp; Let's look at an example.&lt;/P&gt;
&lt;P&gt;Supposed that I am using SQL Server 2005.&amp;nbsp; If we look this up on the lifecycle site, we'll see that SQL Server 2005 will be&amp;nbsp;Mainstream support until 4/12/2011.&amp;nbsp; We'll also see that it will be in Extended support until 4/12/2016.&amp;nbsp; Looks like I'm covered, right?&lt;/P&gt;
&lt;P&gt;Maybe not.&lt;/P&gt;
&lt;P&gt;What if I haven't installed any Service Pack?&amp;nbsp; This is known as the RTM or SP0 release.&amp;nbsp; Support for this release expired on 7/10/2007.&amp;nbsp; Oops!&amp;nbsp; No support!&amp;nbsp; I could be in trouble.&amp;nbsp; If I install Service Pack 1, then I'm a bit better off.&amp;nbsp; I will have support until 4/8/2008.&amp;nbsp;&amp;nbsp;Service Pack 2 woud be even better.&amp;nbsp; Since it is the most current release, it doesn't yet have an expiration date. (Other than the expiration date of the product itself, of course.)&amp;nbsp; You can read about Service Pack support &lt;A href="http://support.microsoft.com/?LN=en-us&amp;amp;scid=gp%3B%5Bln%5D%3Blifecycle&amp;amp;x=14&amp;amp;y=14#Service%20Pack%20Support" target=_blank mce_href="http://support.microsoft.com/?LN=en-us&amp;amp;scid=gp%3B%5Bln%5D%3Blifecycle&amp;amp;x=14&amp;amp;y=14#Service%20Pack%20Support"&gt;here&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;So, as you can see, product support is determined not only by the&amp;nbsp;product itself, but also by the installed Service Pack.&amp;nbsp; Because no one should install a Service Pack without appropriate testing, it pays to use the lifecycle site and to&amp;nbsp;plan your testing accordingly.&amp;nbsp; Do let yourself get caught with an out-of-date Service Pack!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4423916" width="1" height="1"&gt;</content><author><name>Jerry.Dixon</name><uri>http://blogs.msdn.com/members/Jerry.Dixon.aspx</uri></author><category term="Support" scheme="http://blogs.msdn.com/jerrydixon/archive/tags/Support/default.aspx" /></entry></feed>