<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jon from Proactive Logic &#187; .Net</title>
	<atom:link href="http://proactivelogic.com/blog/index.php/category/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://proactivelogic.com/blog</link>
	<description>A place for Proactive Logic news and articles</description>
	<lastBuildDate>Wed, 14 Jan 2009 11:40:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Extending Community Server 2007 User Profiles and Vista Setup</title>
		<link>http://proactivelogic.com/blog/index.php/2007/11/03/extending-community-server-2007-user-profiles-and-vista-setup/</link>
		<comments>http://proactivelogic.com/blog/index.php/2007/11/03/extending-community-server-2007-user-profiles-and-vista-setup/#comments</comments>
		<pubDate>Sun, 04 Nov 2007 00:10:00 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Community Server]]></category>

		<guid isPermaLink="false">http://proactivelogic.com/blog/index.php/2007/11/03/extending-community-server-2007-user-profiles-and-vista-setup/</guid>
		<description><![CDATA[Note:&#160; The pdf version of this post has&#160;been removed since I cleaned up the code formatting below.
This post will go over my notes on how I accomplished extending the CS schema and code base in order to: acquire additional user&#160;fields on user registration, enable modification of these fields in the user control panel, display the [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Note:&nbsp;</strong> The pdf version of this post has&nbsp;been removed since I cleaned up the code formatting below.</p>
<p><strong>This post will go over my notes on how I accomplished extending the CS schema and code base in order to: acquire additional user&nbsp;fields on user registration, enable modification of these fields in the user control panel, display the new fields in the public view of the user&#8217;s profile, and display the&nbsp;new fields&nbsp;for the user in forum posts.</strong>&nbsp; This post should be useful for developers that want to extend their CS schema and also contains content relevant for users just sticking with extended attributes (for example extending&nbsp;a theme with SubForms is useful for both scenarios).</p>
<p>I have just started digging into Community Server 2007 as a pet project of mine. One thing that I wanted to do was link Community Server users with a set of tables that I already have in place. It appears that CS allows users and other objects to be extended by using extended attributes that save as name value pairs to the database. This did not meet my needs so I needed to dig in and extend CS without much documentation on how to do this.&nbsp;&nbsp;Following this post will require that you are a fairly proficient .Net developer. The examples that I give here assumes that I have <strong>users that are linked to a store</strong> and they also have a defined&nbsp;affiliation type to that store.&nbsp; The stores themselves will be filtered by their US state.&nbsp;<strong>For example a user can be a Manager of Acme Markets (and Acme markets only exists in 30 states).</strong>&nbsp; I&#8217;m actually developing a different community than this, but I changed to code to make it easier to understand for a blog post. This is also the reason I do not include any screen shots, but trust me, it works! </p>
<p>The first thing I did was to install the Community Server 2007 SDK and install the CS schema as per their directions. I am doing this development on a Windows Vista Ultimate based Virtual PC, so I had to do a few things to get CS up and running after downloading the SDK. </p>
<h2>My Windows Vista Specific Development Setup </h2>
<ul style="MARGIN: 10px 10px 10px 30px">
<li>Created Virtual directory &#8211; classic pipeline .net 2.0 and pointed it at the location of my CommunityServerWeb20 project </li>
<li>Updated CommunityServerWeb20 (Internal).csproj in notepad
<ul>
<li>I changed the IISUrl from &#8220;http://cs2007&#8243; to point to my virtual directory http://localhost/cs </li>
<li>In hindsight, I probably could have just created a host entry for http://cs2007 to point to my virtual directory </li>
</ul>
</li>
<li>Followed additional IIS 7 setup instructions for Visual Studio from the following post: <a href="http://mvolo.com/blogs/serverside/archive/2006/12/28/Fix-problems-with-Visual-Studio-F5-debugging-of-ASP.NET-applications-on-IIS7-Vista.aspx" target="_blank">http://mvolo.com/blogs/serverside/archive/2006/12/28/Fix-problems-with-Visual-Studio-F5-debugging-of-ASP.NET-applications-on-IIS7-Vista.aspx</a> </li>
<li>Disabled ping / keep alive in IIS7 &ndash; This setting caused debugger to hang because its purpose is to recycle the ASP.net worker process if it does not respond to a ping, which can happen if you are sitting on a breakpoint for too long. </li>
<li>Updated web.config to have debug=&#8221;true&#8221; </li>
<li>Configured the connection strings to point to my CS database </li>
</ul>
<h2>Updating the Data Layer </h2>
<p>Once I had the code running I looked at the CS tables and I saw that there were two tables that&nbsp;were candidates for me to extend: <strong>cs_Users</strong> and <strong>cs_UserProfile</strong>. As I got further into the code base, I could not see any compelling reason to choose one table over the other since the data access layer seems to always load from both of these tables in order to get the data. I originally extended the <strong>cs_Users</strong> table, but then I backed out my changes and went with the <strong>cs_UserProfile</strong> as it just feels more appropriate for the data I was adding. </p>
<h3>The User Entity Object </h3>
<p>The first thing you should do is add your new properties to the user object which can be found in <em>&#8220;\Components\Components\User.cs&#8221;</em> file. Theoretically, you probably can stick with extended attributes, and pull off those values later.&nbsp; I chose to extend the actual user object&nbsp;for my project.&nbsp;</p>
<p><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><?xml:namespace prefix ="" o /><o:p></o:p></span></p>
<blockquote>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">[<span style="COLOR: #2b91af">Serializable</span>]<o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"><span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">public</span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"> <span style="COLOR: blue">class</span> <span style="COLOR: #2b91af">User</span> : <span style="COLOR: #2b91af">ExtendedAttributes<o:p></o:p></span></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 10pt"><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">{<br /></span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">&nbsp;&nbsp;&nbsp; {Some CS code here}</p>
<p></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: gray">///</span><span style="COLOR: green"> </span><span style="COLOR: gray">&lt;summary&gt;<br /></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: gray">///</span><span style="COLOR: green"> Store that the user is tied to<br /></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: gray">///</span><span style="COLOR: green"> </span><span style="COLOR: gray">&lt;/summary&gt;<br /></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">private</span> <span style="COLOR: blue">int</span> _StoreAffiliatedToId;</p>
<p></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">public</span> <span style="COLOR: blue">int</span> StoreAffiliatedToId<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>{<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">get</span> { <span style="COLOR: blue">return</span> _StoreAffiliatedToId; }<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">set<br /></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>_StoreAffiliatedToId = <span style="COLOR: blue">value</span>;<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><o:p>&nbsp;<br /></o:p></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: gray">///</span><span style="COLOR: green"> </span><span style="COLOR: gray">&lt;summary&gt;<br /></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: gray">///</span><span style="COLOR: green"> Store affiliation type &#8211; Manager, Sales, etc<br /></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: gray">///</span><span style="COLOR: green"> </span><span style="COLOR: gray">&lt;/summary&gt;<br /></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">private</span> <span style="COLOR: blue">int</span> _StoreAffiliationTypeId;<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">public</span> <span style="COLOR: blue">int</span> StoreAffiliationTypeId<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>{<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">get</span> { <span style="COLOR: blue">return</span> _StoreAffiliationTypeId; }<br />&nbsp;</span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">set<br /></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>_StoreAffiliationTypeId = <span style="COLOR: blue">value</span>;<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}</span></p>
</blockquote>
<p class="MsoNormal" style="MARGIN: 0in 0in 10pt"></span></p>
<h3>Create Update Delete </h3>
<p>Searching the CS code base for <strong>cs_UserProfile</strong> lands you in the <em>&#8220;Data Providers\SqlDataProvider\SqlCommonDataProvider.cs&#8221;</em> file in the <em>&#8220;CreateUpdateDeleteUser&#8221;</em> method. It is very straight forward code that is adding&nbsp;parameters to call the <em>&#8220;cs_user_CreateUpdateDelete&#8221;</em> stored procedure. So back to the database we go to update that stored procedure. I added two new parameters to the <em>&#8220;cs_user_CreateUpdateDelete&#8221;</em> stored procedure and then updated the Update and Insert statements in that stored procedure to update and insert my new fields into the <strong>cs_UserProfile</strong> table. Back in the C# code we now need to update the <em>&#8220;CreateUpdateDeleteUser&#8221;</em> method mentioned above to take properties off of the user object and put them into parameters to call the updated stored procedure. </p>
<blockquote>
<p><span style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><span style="COLOR: blue">public</span> <span style="COLOR: blue">override</span> <span style="COLOR: #2b91af">User</span> CreateUpdateDeleteUser(<span style="COLOR: #2b91af">User</span> user, <span style="COLOR: #2b91af">DataProviderAction</span> action, <span style="COLOR: blue">bool</span> createLocalUserOnly, <span style="COLOR: blue">out</span> <span style="COLOR: #2b91af">CreateUserStatus</span> status) { </p>
<p>{some CS code here}</p>
<p>&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">myCommand.Parameters.Add(<span style="COLOR: #a31515">&#8220;@StoreAffiliatedToId&#8221;</span>, <span style="COLOR: #2b91af">SqlDbType</span>.Int).Value = upm.CurrentUser.StoreAffiliatedToId;<br />&nbsp;&nbsp;&nbsp; myCommand.Parameters.Add(<span style="COLOR: #a31515">&#8220;@StoreAffiliationTypeId&#8221;</span>, <span style="COLOR: #2b91af">SqlDbType</span>.Int).Value = upm.CurrentUser.StoreAffiliationTypeId; </span></p>
</blockquote>
<h3>Read </h3>
<p>In addition to the<em> &#8220;cs_user_CreateUpdateDelete&#8221;</em> stored procedure you will need to update the view <strong>cs_vw_User_FullUser</strong> to retrieve the new values from the <strong>cs_UserProfile</strong> table to read the new values. </p>
<p>In the C# code you will also need to update the code that takes&nbsp;the fields&nbsp;from the <strong>cs_vw_User_FullUser</strong> view and puts them into the user object. The code that does that is located in the file <em>&#8220;Components\Provider\CommonDataProvider.cs&#8221;</em> in the method <em>&#8220;cs_PopulateUserFromIDataReader&#8221;</em>. It is very simple code that copies values out of a datareader and populates user object properties. </p>
<blockquote>
<p><span style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"><span style="COLOR: blue">public</span> <span style="COLOR: blue">static</span> <span style="COLOR: #2b91af">User</span> PopulateUserFromIDataReader(<span style="COLOR: #2b91af">IDataReader</span> dr, <span style="COLOR: blue">bool</span> isEditable, <span style="COLOR: blue">bool</span> includeAudit) { </p>
<p></span>{some CS code here}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <span style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">user.StoreAffiliatedToId = (<span style="COLOR: blue">int</span>)dr[<span style="COLOR: #a31515">"StoreAffiliatedToID"</span>];&nbsp;</span><br /><span style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">&nbsp;&nbsp; user.StoreAffiliationTypeId = (<span style="COLOR: blue">int</span>) dr[<span style="COLOR: #a31515">"StoreAffiliationTypeID"</span>];</span> </p>
</blockquote>
<p>The next step is really optional depending on how you layout your data.&nbsp;My extended&nbsp;<strong>cs_UserProfile</strong>&nbsp;table contains ID&rsquo;s that are foreign key references into other tables in my system.&nbsp; In my case I have an in memory cache that map these ID&#8217;s to friendly names. You could&nbsp;add another join to the <em>&#8220;cs_vw_User_FullUser&#8221;</em> view to get your friendly names from your own data if you so choose.&nbsp;Since I have this data in memory already, I updated the code in the file <em>&#8220;Controls\User\UserProfileData.cs&#8221;</em> in the method <em>&#8220;GetPropertyValue&#8221;</em>, to lookup the data for these ID&rsquo;s&nbsp;from my in memory cache. This <em>&ldquo;GetPropertyValue&rdquo;</em> method is called from the <strong>Chameleon controls</strong> which I will use later in this post to show these new&nbsp;values on the UI.&nbsp; You&#8217;ll see references to <em>&ldquo;ProactiveLogic.WebFacade&rdquo;</em> which is an external project&nbsp;that manages my cached data.&nbsp; My new code&nbsp;is noted by the &#8220;new code&rdquo; comments.</P><br />
<BLOCKQUOTE><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: gray">///</SPAN><SPAN style="color: green"> </SPAN><SPAN style="color: gray">&lt;summary&gt; <br />///</SPAN><SPAN style="color: green"> Single value control that provides access to a user&#8217;s Profile data and links. </SPAN></SPAN><br /><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: gray">///</SPAN><SPAN style="color: green"> </SPAN><SPAN style="color: gray">&lt;/summary&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">public</SPAN> <SPAN style="color: blue">class</SPAN> <SPAN style="color: #2b91af">UserProfileData</SPAN> : <SPAN style="color: #2b91af">UserData </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new">{ </p>
<p></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">protected</SPAN> <SPAN style="color: blue">override</SPAN> <SPAN style="color: blue">object</SPAN> GetPropertyValue(<SPAN style="color: blue">string</SPAN> property) </SPAN><SPAN style="font-size: 10pt; font-family: courier new">{ <br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: #2b91af">User</SPAN> user = DataSource <SPAN style="color: blue">as</SPAN> <SPAN style="color: #2b91af">User</SPAN>;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">if</SPAN> (user != <SPAN style="color: blue">null</SPAN> &amp;&amp; !<SPAN style="color: blue">string</SPAN>.IsNullOrEmpty(property)) <br />&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new">{&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">switch</SPAN> (property.ToLower()) <br />&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new">{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: gray">//</SPAN><SPAN style="color: green">&nbsp;Existing CS&nbsp;code</SPAN><FONT color=#008000>&nbsp;</FONT></SPAN><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">case</SPAN> <SPAN style="color: #a31515">&#8220;signature&#8221;</SPAN>:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: gray">//</SPAN><SPAN style="color: green">&nbsp;Existing CS&nbsp;code</SPAN><FONT color=#008000>&nbsp;</FONT></SPAN><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">case</SPAN> <SPAN style="color: #a31515">&#8220;signatureformatted&#8221;</SPAN>: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new">{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: #2b91af">CSContext</SPAN> csContext = <SPAN style="color: #2b91af">CSControlUtility</SPAN>.Instance().GetCurrentCSContext(<SPAN style="color: blue">this</SPAN>.Page);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">if</SPAN> (csContext.SiteSettings.AllowUserSignatures &amp;&amp; csContext.SiteSettings.EnableUserSignatures &amp;&amp; csContext.User.EnableUserSignatures) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">return</SPAN> user.Profile.SignatureFormatted.Replace(<SPAN style="color: #a31515">&#8220;\r\n&#8221;</SPAN>, <SPAN style="color: #a31515">&#8220;&lt;br /&gt;&#8221;</SPAN>); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; color: blue; font-family: courier new">else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">return</SPAN> <SPAN style="color: blue">string</SPAN>.Empty;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="font-size: 10pt; font-family: courier new">} </SPAN></P><br />
<P><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: gray">//</SPAN><SPAN style="color: green"> New code</SPAN><FONT color=#008000> </FONT><br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case</SPAN> <SPAN style="color: #a31515">&#8220;storeaffiliation&#8221;</SPAN>: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">if</SPAN> (user.StoreAffiliatedToId == 0)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="font-size: 10pt; font-family: courier new">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">return</SPAN> <SPAN style="color: #a31515">&#8220;No Store&#8221;</SPAN>; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new">}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; color: blue; font-family: courier new">else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new">{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">return</SPAN> ProactiveLogic.WebFacade.<SPAN style="color: #2b91af">CachedData</SPAN>.GetStoreByID(user.StoreAffiliatedToId).Name; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new">} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">break</SPAN>;</SPAN> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: gray">//</SPAN><SPAN style="color: green"> New code</SPAN> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">case</SPAN> <SPAN style="color: #a31515">&#8220;storeaffiliationtype&#8221;</SPAN>: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">if</SPAN> (user.StoreAffiliationTypeId == 0)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="font-size: 10pt; font-family: courier new">{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">return</SPAN> <SPAN style="color: #a31515">&#8220;No Affiliation&#8221;</SPAN>;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="font-size: 10pt; font-family: courier new">} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; color: blue; font-family: courier new">else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new">{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">return</SPAN> ProactiveLogic.WebFacade.<SPAN style="color: #2b91af">CachedData</SPAN>.GetStoreAffiliationTypeById(user.StoreAffiliationTypeId).StoreAffiliationTypeName; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new">} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">break</SPAN>; </SPAN></P><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default</SPAN>: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">return</SPAN> <SPAN style="color: #2b91af">DataBinder</SPAN>.GetPropertyValue(user.Profile, property);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="font-size: 10pt; font-family: courier new">} </SPAN></P><br />
<P><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; color: blue; font-family: courier new">else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">return</SPAN> <SPAN style="color: blue">string</SPAN>.Empty; <br />&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new">} </SPAN></P><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue"><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: gray">//</SPAN><SPAN style="color: green">&nbsp;Existing CS&nbsp;code</SPAN><FONT color=#008000>&nbsp;</FONT></SPAN><br />protected</SPAN> <SPAN style="color: blue">override</SPAN> <SPAN style="color: blue">string</SPAN> GetExtendedAttributeValue(<SPAN style="color: blue">string</SPAN> extendedAttribute) <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">{ <br />&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">throw</SPAN> <SPAN style="color: blue">new</SPAN> <SPAN style="color: #2b91af">InvalidCastException</SPAN>(<SPAN style="color: #a31515">&#8220;CommunityServer.Components.Profile does not support extended attributes.&#8221;</SPAN>); <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">} </SPAN></P><br />
<P><SPAN style="font-size: 10pt; font-family: courier new">}&nbsp;</SPAN>&nbsp;&nbsp;&nbsp;</P></BLOCKQUOTE><br />
<P>Now the data layer is done! That is all you have to do. When you see the code it is very simple. Onto the UI&hellip; </P><br />
<H2>Updating the Default Theme to Acquire and Edit the additional user profile data </H2><br />
<P>I&#8217;m going to cut to the chase and show you the code in that I added to the themes to call my new sub forms to handle this new user data. After that I will show the implementation of the SubForms. I added two new fields one is the store the person is affiliated to, and the second is their affiliation to that store (i.e. Manager, Clerk, etc). My store list needs to be filtered by state, so I wrapped this filtering in an ASP.net Ajax update panel. </P><br />
<H3>Getting the&nbsp;new User Properties&nbsp;on&nbsp;User Registration \&nbsp;Sign Up</H3><br />
<P>In the file <EM>&#8220;Web\Themes\default\User\createuser.aspx&#8221;</EM> I added my two SubForms to the Create User Form CSControl. It is very important that you do not put any spaces in your comma delimited list of SubForms, otherwise they will not be properly processed, as I found out. </P><br />
<BLOCKQUOTE><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">CSControl</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">CreateUserForm</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">SubFormIds</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationSubFormID,StoreAffiliationTypeSubFormID&#8221;</SPAN> <SPAN style="color: blue">&gt;</SPAN></SPAN> </P></BLOCKQUOTE><br />
<P>I then added call outs to my SubForms, and the ASP.net AJAX Update Panel to make SubForms do an Async post pack for the filtering of my dropdown lists. I have cut down quite a bit of existing CS code here to show you only the new code in the context of some of the key CS elements. Keep in mind, the state list drop down is just a filter on my stores, and is not saved. </P><br />
<BLOCKQUOTE><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">ScriptManager</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;ScriptManager1&#8243;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: blue">/&gt;</SPAN></SPAN> </p>
<p><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">CSControl</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">CreateUserForm</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue"><br />&lt;</SPAN><SPAN style="color: #a31515">FormTemplate</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN>{Some existing CS code here} <br />{Call out to&nbsp;my SubForms below&hellip;} </p>
<p><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">tr</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">td</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;CommonFormFieldName&#8221;&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new">I am a: <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">td</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">td</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;CommonFormField&#8221;&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">ProactiveLogicSubForms</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">StoreAffiliationTypeSubForm</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationTypeSubFormID&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">StoreAffiliationTypeId</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationID&#8221;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">FormTemplate</SPAN><SPAN style="color: blue">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">DropDownList</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationID&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: blue">/&gt;&lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">RequiredFieldValidator</SPAN> <SPAN style="color: red">id</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationTypeValidator&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">ControlToValidate</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationID&#8221;</SPAN> <SPAN style="color: red">Cssclass</SPAN><SPAN style="color: blue">=&#8221;validationWarning<font color="#000000">&#8220;&gt;</FONT></SPAN>*<SPAN style="color: blue"><FONT color=#000000>&lt;/</FONT></SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">RequiredFieldValidator</SPAN><SPAN style="color: blue">&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">FormTemplate</SPAN><SPAN style="color: blue">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">ProactiveLogicSubForms</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">StoreAffiliationTypeSubForm</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">td</SPAN><SPAN style="color: blue">&gt;<br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">tr</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">tr</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">td</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;CommonFormFieldName&#8221;&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new">of the Store: <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">td</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">td</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;CommonFormField&#8221;&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">ProactiveLogicSubForms</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">StoreAffiliationSubForm</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationSubFormID&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">StateListID</SPAN><SPAN style="color: blue">=&#8221;StateListID&#8221;</SPAN> <SPAN style="color: red">StoreListID</SPAN><SPAN style="color: blue">=&#8221;StoreListID&#8221;&gt;</SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="color: #a31515">FormTemplate</SPAN><SPAN style="color: blue">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UpdatePanel</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;UpdatePanel1&#8243;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">ContentTemplate</SPAN><SPAN style="color: blue">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></P><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue"></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">DropDownList</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StateListID&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">AutoPostBack</SPAN><SPAN style="color: blue">=&#8221;true&#8221;</SPAN> <SPAN style="color: blue">/&gt;&lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">RequiredFieldValidator</SPAN> <SPAN style="color: red">id</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationStateValidator&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">ControlToValidate</SPAN><SPAN style="color: blue">=&#8221;StateListID&#8221;</SPAN> <SPAN style="color: red">Cssclass</SPAN><SPAN style="color: blue">=&#8221;validationWarning&#8221;&gt;</SPAN>*<SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">RequiredFieldValidator</SPAN><SPAN style="color: blue">&gt; </SPAN></SPAN></P><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UpdateProgress</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;UpdateProgress1&#8243;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">AssociatedUpdatePanelID</SPAN><SPAN style="color: blue">=&#8221;UpdatePanel1&#8243;</SPAN> <SPAN style="color: red">DynamicLayout</SPAN><SPAN style="color: blue">=&#8221;true&#8221;</SPAN> <SPAN style="color: red">DisplayAfter</SPAN><SPAN style="color: blue">=&#8221;0&#8243;</SPAN> <SPAN style="color: red">EnableViewState</SPAN><SPAN style="color: blue">=&#8221;false&#8221;&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="color: #a31515">ProgressTemplate</SPAN><SPAN style="color: blue">&gt;</SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new">Loading Stores <SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">br</SPAN> <SPAN style="color: blue">/&gt;</SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">ProgressTemplate</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UpdateProgress</SPAN><SPAN style="color: blue">&gt;</SPAN> </SPAN></P><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">br</SPAN> <SPAN style="color: blue">/&gt; </SPAN></SPAN></P><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">DropDownList</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StoreListID&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: blue">/&gt;&lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">RequiredFieldValidator</SPAN> <SPAN style="color: red">id</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationValidator1&#8243;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">ControlToValidate</SPAN><SPAN style="color: blue">=&#8221;StoreListID&#8221;</SPAN> <SPAN style="color: red">Cssclass</SPAN><SPAN style="color: blue">=&#8221;validationWarning&#8221;&gt;</SPAN>*<SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">RequiredFieldValidator</SPAN><SPAN style="color: blue">&gt; </SPAN></SPAN></P><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</SPAN><SPAN style="color: #a31515">ContentTemplate</SPAN><SPAN style="color: blue">&gt; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UpdatePanel</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue"></SPAN></SPAN></P><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</SPAN><SPAN style="color: #a31515">FormTemplate</SPAN><SPAN style="color: blue">&gt;&nbsp;<br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</SPAN><SPAN style="color: #a31515">ProactiveLogicSubForms</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">StoreAffiliationSubForm</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">td</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">tr</SPAN><SPAN style="color: blue">&gt;</SPAN></SPAN> </P></BLOCKQUOTE><br />
<H3>Editing the new&nbsp;User Properties in the Control Panel</H3><br />
<P>In order to edit the user, I added a new &ldquo;Store&rdquo; tab to the edit profile page with a call out to my sub forms in the file <EM>&#8220;Web\Themes\default\User\edituser.aspx&#8221;</EM>.&nbsp; The code is pretty much identical to the create user form, with the addition of a tab.&nbsp;</P><br />
<BLOCKQUOTE><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">CSControl</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">EditUserForm </SPAN><SPAN style="color: red">SubFormIds</SPAN><SPAN style="color: blue">=&#8221;AvatarSubForm,StoreAffiliationSubFormID,StoreAffiliationTypeSubFormID&#8221;&gt;&nbsp;</SPAN></SPAN>&nbsp;</p>
<p><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">TWC</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">TabbedPane</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">Tab</SPAN><SPAN style="color: blue">&gt;</SPAN>Store<SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">Tab</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">Content</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">table</SPAN><SPAN style="color: blue">&gt;<br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue"><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">tr</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">td</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;CommonFormFieldName&#8221;&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><FONT color=#000000>I am a:</FONT> <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">td</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">td</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;CommonFormField&#8221;&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">ProactiveLogicSubForms</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">StoreAffiliationTypeSubForm</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationTypeSubFormID&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">StoreAffiliationTypeId</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationID&#8221;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">FormTemplate</SPAN><SPAN style="color: blue">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">DropDownList</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationID&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: blue">/&gt;&lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">RequiredFieldValidator</SPAN> <SPAN style="color: red">id</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationTypeValidator&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">ControlToValidate</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationID&#8221;</SPAN> <SPAN style="color: red">Cssclass</SPAN><SPAN style="color: blue">=&#8221;validationWarning&#8221;&gt;</SPAN>*<SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">RequiredFieldValidator</SPAN><SPAN style="color: blue">&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">FormTemplate</SPAN><SPAN style="color: blue">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">ProactiveLogicSubForms</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">StoreAffiliationTypeSubForm</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">td</SPAN><SPAN style="color: blue">&gt;<br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">tr</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">tr</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">td</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;CommonFormFieldName&#8221;&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><FONT color=#000000>of the Store: </FONT><br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">td</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">td</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;CommonFormField&#8221;&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">ProactiveLogicSubForms</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">StoreAffiliationSubForm</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationSubFormID&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">StateListID</SPAN><SPAN style="color: blue">=&#8221;StateListID&#8221;</SPAN> <SPAN style="color: red">StoreListID</SPAN><SPAN style="color: blue">=&#8221;StoreListID&#8221;&gt;</SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="color: #a31515">FormTemplate</SPAN><SPAN style="color: blue">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UpdatePanel</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;UpdatePanel1&#8243;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">ContentTemplate</SPAN><SPAN style="color: blue">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">DropDownList</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StateListID&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">AutoPostBack</SPAN><SPAN style="color: blue">=&#8221;true&#8221;</SPAN> <SPAN style="color: blue">/&gt;&lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">RequiredFieldValidator</SPAN> <SPAN style="color: red">id</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationStateValidator&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">ControlToValidate</SPAN><SPAN style="color: blue">=&#8221;StateListID&#8221;</SPAN> <SPAN style="color: red">Cssclass</SPAN><SPAN style="color: blue">=&#8221;validationWarning&#8221;&gt;</SPAN>*<SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">RequiredFieldValidator</SPAN><SPAN style="color: blue">&gt;&nbsp;</p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UpdateProgress</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;UpdateProgress1&#8243;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">AssociatedUpdatePanelID</SPAN><SPAN style="color: blue">=&#8221;UpdatePanel1&#8243;</SPAN> <SPAN style="color: red">DynamicLayout</SPAN><SPAN style="color: blue">=&#8221;true&#8221;</SPAN> <SPAN style="color: red">DisplayAfter</SPAN><SPAN style="color: blue">=&#8221;0&#8243;</SPAN> <SPAN style="color: red">EnableViewState</SPAN><SPAN style="color: blue">=&#8221;false&#8221;&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="color: #a31515">ProgressTemplate</SPAN><SPAN style="color: blue">&gt;</SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new">Loading Stores <SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">br</SPAN> <SPAN style="color: blue">/&gt;</SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">ProgressTemplate</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UpdateProgress</SPAN><SPAN style="color: blue">&gt;</SPAN> </p>
<p></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">br</SPAN> <SPAN style="color: blue">/&gt;&nbsp;</p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">DropDownList</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StoreListID&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: blue">/&gt;&lt;</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">RequiredFieldValidator</SPAN> <SPAN style="color: red">id</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationValidator1&#8243;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">ControlToValidate</SPAN><SPAN style="color: blue">=&#8221;StoreListID&#8221;</SPAN> <SPAN style="color: red">Cssclass</SPAN><SPAN style="color: blue">=&#8221;validationWarning&#8221;&gt;</SPAN>*<SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">RequiredFieldValidator</SPAN><SPAN style="color: blue">&gt;&nbsp;</p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</SPAN><SPAN style="color: #a31515">ContentTemplate</SPAN><SPAN style="color: blue">&gt; </SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</SPAN><SPAN style="color: #a31515">asp</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UpdatePanel</SPAN><SPAN style="color: blue">&gt;&nbsp;<br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue"></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</SPAN><SPAN style="color: #a31515">FormTemplate</SPAN><SPAN style="color: blue">&gt;&nbsp;<br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</SPAN><SPAN style="color: #a31515">ProactiveLogicSubForms</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">StoreAffiliationSubForm</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">td</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">tr</SPAN><SPAN style="color: blue">&gt;</SPAN></SPAN> </P></SPAN></SPAN><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">table</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">Content</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">TWC</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">TabbedPane</SPAN><SPAN style="color: blue">&gt; </SPAN></SPAN></P></BLOCKQUOTE><br />
<H2>SubForms Implementation&nbsp;&nbsp;&nbsp;&nbsp;</H2><br />
<P>I created a new project to implement my SubForms in and added a project reference to it from CS. I also updated the web.config in CS to know about my new controls by adding the following: </P><br />
<BLOCKQUOTE><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">controls</SPAN><SPAN style="color: blue">&gt;<br />&lt;</SPAN><SPAN style="color: #a31515">add</SPAN><SPAN style="color: blue"> </SPAN><SPAN style="color: red">tagPrefix</SPAN><SPAN style="color: blue">=</SPAN>&#8220;<span style="COLOR: blue">ProactiveLogicSubForms</span>&#8220;<SPAN style="color: blue"> </SPAN><SPAN style="color: red">namespace</SPAN><SPAN style="color: blue">=</SPAN>&#8220;<span style="COLOR: blue">ProactiveLogic.CS.SubForms</span>&#8220;<SPAN style="color: blue"> </SPAN><SPAN style="color: red">assembly</SPAN><SPAN style="color: blue">=</SPAN>&#8220;<span style="COLOR: blue"> ProactiveLogic.CS</span>&#8220;<SPAN style="color: blue"> /&gt; </SPAN></SPAN></P></BLOCKQUOTE><br />
<P>Now implementing the SubForms is a little tricky because my SubForms are used in both an update and creation context. In order to do this I always look for &#8220;posted&#8221; form values first and if there are no posted values, I see if I can get a CS User object to pull the values from for display. My code here is actually doing a lookup based on the state that is selected in order to populate the list of stores in that state. I am only showing my store selection SubForm as it is the more complicated of the two subforms that&nbsp;I created and should give you the most to chew on. </P><br />
<BLOCKQUOTE><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> System; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> System.Data; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> System.Configuration; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> System.Collections; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> System.Web; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> System.Web.Security; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> System.Web.UI; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> System.Web.UI.WebControls; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> System.Web.UI.WebControls.WebParts; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> System.Web.UI.HtmlControls; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> CommunityServer.Controls; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> CommunityServer.Components; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> ProactiveLogic.WebFacade; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">using</SPAN> ProactiveLogic.Entities;&nbsp;</SPAN>&nbsp;&nbsp;&nbsp;</p>
<p><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">namespace</SPAN> ProactiveLogic.CS.SubForms <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">{ </p>
<p></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">public</SPAN> <SPAN style="color: blue">partial</SPAN> <SPAN style="color: blue">class</SPAN> <SPAN style="color: #2b91af">StoreAffiliationSubForm</SPAN> : <SPAN style="color: #2b91af">WrappedSubFormBase <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new">{&nbsp;</p>
<p></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp; private</SPAN> <SPAN style="color: #2b91af">DropDownList</SPAN> StateList; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp; private</SPAN> <SPAN style="color: #2b91af">DropDownList</SPAN> StoreList;&nbsp;</p>
<p>&nbsp; <FONT color=#008000>//&nbsp;this ID is set in the ProactiveLogicSubForms:StoreAffiliationSubForm&nbsp;markup to<br />&nbsp; // provide an&nbsp;ID reference to the state list dropdown</FONT><br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp; public</SPAN> <SPAN style="color: blue">string</SPAN> StateListID <br />&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new">{ <br />&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">get</SPAN> { <SPAN style="color: blue">return</SPAN> (<SPAN style="color: blue">string</SPAN>)(ViewState[<SPAN style="color: #a31515">"StateListID"</SPAN>] ?? <SPAN style="color: #a31515">&#8220;&#8221;</SPAN>); } <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp; set</SPAN> { ViewState[<SPAN style="color: #a31515">"StateListID"</SPAN>] = <SPAN style="color: blue">value</SPAN>; }&nbsp;<br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;}&nbsp;</p>
<p>&nbsp; <FONT color=#008000>//&nbsp;this ID is set in the ProactiveLogicSubForms:StoreAffiliationSubForm&nbsp;markup to<br />&nbsp; // provide an&nbsp;ID reference to the&nbsp;store list dropdown</FONT><br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;public</SPAN> <SPAN style="color: blue">string</SPAN> StoreListID <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp; { <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp; get</SPAN> { <SPAN style="color: blue">return</SPAN> (<SPAN style="color: blue">string</SPAN>)(ViewState[<SPAN style="color: #a31515">"StoreListID"</SPAN>] ?? <SPAN style="color: #a31515">&#8220;&#8221;</SPAN>); } <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp; set</SPAN> { ViewState[<SPAN style="color: #a31515">"StoreListID"</SPAN>] = <SPAN style="color: blue">value</SPAN>; } <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp; }&nbsp;</p>
<p></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;public</SPAN> <SPAN style="color: blue">override</SPAN> <SPAN style="color: blue">bool</SPAN> IsEnabled() <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp; { <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp; return</SPAN> <SPAN style="color: blue">true</SPAN>;&nbsp;<br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;}&nbsp;</SPAN>&nbsp;&nbsp;&nbsp;</p>
<p><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;protected</SPAN> <SPAN style="color: blue">override</SPAN> <SPAN style="color: blue">void</SPAN> AttachChildControls() <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp; { <br /></SPAN><SPAN style="font-size: 10pt; color: green; font-family: courier new">&nbsp;&nbsp;&nbsp; // view state is disabled, so populate the state list every time <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp; StateList = <SPAN style="color: #2b91af">CSControlUtility</SPAN>.Instance().FindControl(<SPAN style="color: blue">this</SPAN>, StateListID) <SPAN style="color: blue">as</SPAN> <SPAN style="color: #2b91af">DropDownList</SPAN>; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp; this</SPAN>.StateList.Items.Add(<SPAN style="color: blue">new</SPAN> <SPAN style="color: #2b91af">ListItem</SPAN>(<SPAN style="color: #a31515">&#8220;&lt;Select Store State&gt;&#8221;</SPAN>, <SPAN style="color: #a31515">&#8220;0&#8243;</SPAN>));&nbsp;</p>
<p></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp; foreach</SPAN> (<SPAN style="color: #2b91af">State</SPAN> state <SPAN style="color: blue">in</SPAN> <SPAN style="color: #2b91af">CachedData</SPAN>.GetAllUSStates()) <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp; { <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this</SPAN>.StateList.Items.Add(<SPAN style="color: blue">new</SPAN> <SPAN style="color: #2b91af">ListItem</SPAN>(state.StateName, state.StateId.ToString())); <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp; }&nbsp;<br /></SPAN><SPAN style="font-size: 10pt; color: green; font-family: courier new"><br />&nbsp;&nbsp;&nbsp; // attach the Store list member &#8211; the Store list depends on the statelist value <br /></SPAN><SPAN style="font-size: 10pt; color: green; font-family: courier new">&nbsp;&nbsp;&nbsp; // which is not bound yet &#8211; so we will populate that in the DataBind method&nbsp;<br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp; StoreList = <SPAN style="color: #2b91af">CSControlUtility</SPAN>.Instance().FindControl(<SPAN style="color: blue">this</SPAN>, StoreListID) <SPAN style="color: blue">as</SPAN> <SPAN style="color: #2b91af">DropDownList</SPAN>;&nbsp;<br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp; }&nbsp;</SPAN>&nbsp;&nbsp;&nbsp;</p>
<p><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp; public</SPAN> <SPAN style="color: blue">override</SPAN> <SPAN style="color: blue">void</SPAN> DataBind() <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp; {&nbsp;</p>
<p></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; color: green; font-family: courier new">// determine the selected Store: always use posted form values if they are available &#8211; <br />&nbsp;&nbsp;&nbsp; // then use the existing user&#8217;s values if they are available&nbsp;<br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;int</SPAN> selectedStore = 0; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp; int</SPAN>.TryParse(<SPAN style="color: blue">this</SPAN>.Page.Request[StoreList.UniqueID], <SPAN style="color: blue">out</SPAN> selectedStore); </p>
<p></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp; if</SPAN> (selectedStore == 0) <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp; { <br /></SPAN><SPAN style="font-size: 10pt; color: green; font-family: courier new">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // if no store is selected yet, try to load the value from an&nbsp;existing user object<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // if it is available <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // (CS&nbsp;passes&nbsp;the User&nbsp;object to subforms if it is available in the context of what the user is doing)<br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User</SPAN> ExistingUser = <SPAN style="color: blue">this</SPAN>.DataSource <SPAN style="color: blue">as</SPAN> <SPAN style="color: #2b91af">User</SPAN>; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; selectedStore = (ExistingUser == <SPAN style="color: blue">null</SPAN>) ? selectedStore : ExistingUser.StoreAffiliatedToId;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="font-size: 10pt; color: green; font-family: courier new">//&nbsp;Select the state for the seleted store</SPAN><br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StateList.SelectedValue = <SPAN style="color: #2b91af">CachedData</SPAN>.GetStoreByID(selectedStore).StateId.ToString();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="font-size: 10pt; font-family: courier new">}&nbsp;</p>
<p></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; color: green; font-family: courier new">// repopulate the Stores based on the selected state <br />&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">this</SPAN>.StoreList.Items.Clear(); <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp; this</SPAN>.StoreList.Items.Add(<SPAN style="color: blue">new</SPAN> <SPAN style="color: #2b91af">ListItem</SPAN>(<SPAN style="color: #a31515">&#8220;&lt;Select Store&gt;&#8221;</SPAN>, <SPAN style="color: #2b91af">String</SPAN>.Empty)); <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; foreach</SPAN> (<SPAN style="color: #2b91af">Store</SPAN> col <SPAN style="color: blue">in</SPAN> <SPAN style="color: #2b91af">CachedData</SPAN>.GetAllStoresForState(<SPAN style="color: blue">int</SPAN>.Parse(StateList.SelectedValue))) <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp; { <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this</SPAN>.StoreList.Items.Add(<SPAN style="color: blue">new</SPAN> <SPAN style="color: #2b91af">ListItem</SPAN>(<SPAN style="color: blue">string</SPAN>.Format(<SPAN style="color: #a31515">&#8220;{0} ({1})&#8221;</SPAN><FONT color=#a31515>,</FONT> col.Name, col.Town), col.StoreId.ToString())); <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp; }&nbsp;</SPAN>&nbsp;&nbsp;<br /><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue"><br />&nbsp;&nbsp;&nbsp; <SPAN style="font-size: 10pt; color: green; font-family: courier new">//&nbsp;select the store &ndash;&nbsp;which was&nbsp;either loaded from a post value or<br />&nbsp;&nbsp;&nbsp; // user object value above<br /></SPAN>&nbsp;&nbsp;&nbsp; if</SPAN> (StoreList.Items.FindByValue(selectedStore.ToString()) != <SPAN style="color: blue">null</SPAN>)&nbsp;<br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp;&nbsp;{ <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StoreList.SelectedValue = selectedStore.ToString(); <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp; } <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp; } </SPAN></P><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp; <FONT color=#008000>// CS calls this to get the UI values into the Data object to save&nbsp;</FONT><br />&nbsp; public</SPAN> <SPAN style="color: blue">override</SPAN> <SPAN style="color: blue">void</SPAN> ApplyChangesBeforeCommit(<SPAN style="color: blue">object</SPAN> activeObject) <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp; {&nbsp;<br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue"><br />&nbsp;&nbsp;&nbsp; base</SPAN>.ApplyChangesBeforeCommit(activeObject);&nbsp;</p>
<p></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: #2b91af">&nbsp;&nbsp;&nbsp; User</SPAN> user = activeObject <SPAN style="color: blue">as</SPAN> <SPAN style="color: #2b91af">User</SPAN>; <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp; if</SPAN> (user != <SPAN style="color: blue">null</SPAN>) <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp; { <br /><FONT color=#008000>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;Just save the store &ndash;&nbsp;the state is just a filter and does not need to be saved<br /></FONT></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.StoreAffiliatedToId = <SPAN style="color: blue">int</SPAN>.Parse(<SPAN style="color: blue">this</SPAN>.StoreList.SelectedValue); <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;&nbsp;&nbsp; } <br />&nbsp; </SPAN><SPAN style="font-size: 10pt; font-family: courier new">}</SPAN> </P><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp; public</SPAN> <SPAN style="color: blue">override</SPAN> <SPAN style="color: blue">void</SPAN> ApplyChangesAfterCommit(<SPAN style="color: blue">object</SPAN> activeObject) <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp; { <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp; base</SPAN>.ApplyChangesAfterCommit(activeObject);&nbsp;<br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp; }<br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">&nbsp;<br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new">} </SPAN><SPAN style="font-size: 10pt; font-family: courier new"><br />} </SPAN></P></BLOCKQUOTE><br />
<H2>Displaying the Data In the Profile </H2><br />
<P>For the displaying the new fields in the User Profile I added callouts to my new fields in the file:<EM> &#8220;Web\Themes\default\User\userprofile.aspx&#8221; </EM></P><br />
<P>I added my fields under the &#8220;GMT&#8221; display. These fields query the aforementioned UserProfileData.GetPropertyValue method, based upon the &#8220;Property&#8221; value. </P><br />
<BLOCKQUOTE><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">CSControl</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UserProfileData</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;UserProfileData2&#8243;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">Property</SPAN><SPAN style="color: blue">=&#8221;storeaffiliationtype&#8221;&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">LeaderTemplate</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">tr</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">td</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;CommonFormFieldName&#8221;&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new">I am a: <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">td</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">td</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;CommonFormField&#8221;&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">LeaderTemplate</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">TrailerTemplate</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">td</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">tr</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">TrailerTemplate</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">CSControl</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UserProfileData</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">CSControl</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UserProfileData</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;UserProfileData1&#8243;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">Property</SPAN><SPAN style="color: blue">=&#8221;storeaffiliation&#8221;&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">LeaderTemplate</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">tr</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">td</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;CommonFormFieldName&#8221;&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new">of the Store: <br /></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">td</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">td</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;CommonFormField&#8221;&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">LeaderTemplate</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue"><br />&lt;</SPAN><SPAN style="color: #a31515">TrailerTemplate</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">td</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">tr</SPAN><SPAN style="color: blue">&gt; <br /></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">TrailerTemplate</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;/</SPAN><SPAN style="color: #a31515">CSControl</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UserProfileData</SPAN><SPAN style="color: blue">&gt;</SPAN></SPAN>&nbsp;</P></BLOCKQUOTE><br />
<H2>Displaying the data in Forum Posts </H2><br />
<H3>Forum Flat View </H3><br />
<P>The flat view of a forum is contained in the file: <EM>&#8220;Web\Themes\default\Forums\thread-flatview.ascx&#8221; <br /></EM><br />Under the line that has the user Avatar, I added a callout to my new fields.&nbsp; Notice how easy it is to display your new fields.&nbsp;</P><br />
<BLOCKQUOTE><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">CSControl</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UserAvatar</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">BorderWidth</SPAN><SPAN style="color: blue">=&#8221;1&#8243;</SPAN> <SPAN style="color: red">Tag</SPAN><SPAN style="color: blue">=&#8221;Li&#8221;</SPAN> <SPAN style="color: red">CssClass</SPAN><SPAN style="color: blue">=&#8221;ForumPostUserAvatar&#8221;</SPAN> <SPAN style="color: blue">/&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">CSControl</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UserProfileData</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliatedTo&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">Property</SPAN><SPAN style="color: blue">=&#8221;storeaffiliation&#8221;</SPAN> <SPAN style="color: red">Tag</SPAN><SPAN style="color: blue">=&#8221;Li&#8221;</SPAN> <SPAN style="color: red">CssClass</SPAN><SPAN style="color: blue">=&#8221;ForumPostUserAttribute&#8221;</SPAN> <SPAN style="color: blue">/&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">CSControl</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UserProfileData</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationType&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">Property</SPAN><SPAN style="color: blue">=&#8221;storeaffiliationtype&#8221;</SPAN> <SPAN style="color: red">Tag</SPAN><SPAN style="color: blue">=&#8221;Li&#8221;</SPAN> <SPAN style="color: red">CssClass</SPAN><SPAN style="color: blue">=&#8221;ForumPostUserAttribute&#8221;</SPAN> <SPAN style="color: blue">/&gt; </SPAN></SPAN></P></BLOCKQUOTE><br />
<H3>Forum Threaded View </H3><br />
<P>The post view for the threaded view of a forum is in the file: <EM>&#8220;Web\Themes\default\Forums\post-threadedview.aspx&#8221; <br /></EM><br />I added my new fields under the display name.&nbsp; Notice that while the Forum flat view uses a list to display the user values, the threaded forum view uses container divs.&nbsp;</P><br />
<BLOCKQUOTE><br />
<P><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">div</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;ForumThreadPostAuthor&#8221;&gt;&lt;</SPAN><SPAN style="color: #a31515">CSControl</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UserData</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">LinkTo</SPAN><SPAN style="color: blue">=&#8221;Profile&#8221;</SPAN> <SPAN style="color: red">Property</SPAN><SPAN style="color: blue">=&#8221;DisplayName&#8221;</SPAN> <SPAN style="color: blue">/&gt;&lt;/</SPAN><SPAN style="color: #a31515">div</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">div</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;ForumThreadPostPubDate&#8221;&gt;&lt;</SPAN><SPAN style="color: #a31515">CSControl</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UserProfileData</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliatedTo&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">Property</SPAN><SPAN style="color: blue">=&#8221;storeaffiliation&#8221;</SPAN> <SPAN style="color: blue">/&gt;&lt;/</SPAN><SPAN style="color: #a31515">div</SPAN><SPAN style="color: blue">&gt; </p>
<p></SPAN></SPAN><SPAN style="font-size: 10pt; font-family: courier new"><SPAN style="color: blue">&lt;</SPAN><SPAN style="color: #a31515">div</SPAN> <SPAN style="color: red">class</SPAN><SPAN style="color: blue">=&#8221;ForumThreadPostPubDate&#8221;&gt;&lt;</SPAN><SPAN style="color: #a31515">CSControl</SPAN><SPAN style="color: blue">:</SPAN><SPAN style="color: #a31515">UserProfileData</SPAN> <SPAN style="color: red">ID</SPAN><SPAN style="color: blue">=&#8221;StoreAffiliationType&#8221;</SPAN> <SPAN style="color: red">runat</SPAN><SPAN style="color: blue">=&#8221;server&#8221;</SPAN> <SPAN style="color: red">Property</SPAN><SPAN style="color: blue">=&#8221;storeaffiliationtype&#8221;</SPAN> <SPAN style="color: blue">/&gt;&lt;/</SPAN><SPAN style="color: #a31515">div</SPAN><SPAN style="color: blue">&gt; </SPAN></SPAN></P></BLOCKQUOTE><br />
<H2>Conclusion </H2><br />
<P>I spent about 8 days @ 1.5 hours a day to come up with what is in this post. It took another 3.5 hours to write this post <STRONG>(edit: about&nbsp;3 more hours to format and revise the post)</STRONG>. I&#8217;m hoping that&nbsp;this helps you extend CS much faster than that. I basically just loaded the code and had at it. I&#8217;m very open to suggestions on how to improve this, but I wanted to get this posted because it works for me and should hopefully help some of you who want to dig in and extend CS. I think CS seems to be a great platform and I am very impressed with how factored and clean the code is. The extensibility at the data layer seems to be an area that can be improved, but now that I typed up these instructions, hopefully it is a day of work or less to extend the CS schema so that you can capture, view and query your user data efficiently. </P><br />
<P>Cheers, <br />Jon </P><br />
<P>&nbsp;&nbsp;</P></p>
]]></content:encoded>
			<wfw:commentRss>http://proactivelogic.com/blog/index.php/2007/11/03/extending-community-server-2007-user-profiles-and-vista-setup/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Packaging a ClickOnce Server Deployment</title>
		<link>http://proactivelogic.com/blog/index.php/2006/09/30/packaging-a-clickonce-server-deployment/</link>
		<comments>http://proactivelogic.com/blog/index.php/2006/09/30/packaging-a-clickonce-server-deployment/#comments</comments>
		<pubDate>Sat, 30 Sep 2006 14:46:33 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ClickOnce]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://proactivelogic.com/blog/index.php/2006/09/30/packaging-a-clickonce-server-deployment/</guid>
		<description><![CDATA[Recently, I have helped one of our clients with ClickOnce deployment. Part of the system that our client sells consists of application servers that have a .Net web service, and a smart client application. We helped our client improve the architecture of the web service and the Smart Client application to support extensibility for customizations [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I have helped one of our clients with ClickOnce deployment. Part of the system that our client sells consists of application servers that have a .Net web service, and a smart client application. We helped our client improve the architecture of the web service and the Smart Client application to support extensibility for customizations specific to their customers. These customizations are out of the scope of this post, but during this re-architecture, the technology base was upgraded from VS 2003 &#038; .Net 1.1 to VS 2005 and .Net 2.0.</p>
<p>The extensibility, plug-in and pipelining portions of the project went over very well. We did however face an unforeseen complexity: ClickOnce Deployment. We had done our fair share of reading on the benefits of ClickOnce and had read some of the deeper technical articles, that all focused on ClickOnce deployment from the web server to the client. The benefits seemed great on paper, even though there are issues with Xbrowser support that quickly rear their head. Also, there seems to be a lack of documentation around actually getting the server portion of ClickOnce installed, and that is what this post focuses on.</p>
<p>ClickOnce deployment has two very important files: the application manifest that defines what files make up the application and the deployment manifest that has the deployment version information and the path (the ProviderURL) for the ClickOnce application to look for updates from. These manifests are signed and this leads to a very tough issue to get around:  how can you have a setup package that contains a deployment URL that you do not know ahead of time?</p>
<p>Our client sells their web applications to many customers.  These servers are all imaged with Windows Server 2003 and the .NET framework 2.0.  Then a deployment team installs the web service and ClickOnce application on the server via an MSI setup package.  In the field, servers are always added to server farms to increase capacity.  The need for quick setup of machines via a setup package is required.</p>
<p>The nature of the client application that we built, includes dynamically loaded assemblies in order to support customizations of the core application.  This scenario is not covered by the â€œright click -&gt; deployâ€ ClickOnce deployment method in Visual Studio or MSBuild.  When using MSBuild /deploy, the ClickOnce setup package only consists of statically linked assemblies.</p>
<p>What we did was prepare a <a target="_blank" href="http://nant.sourceforge.net/">nAnt</a> script for the build team to use, which creates the proper setup program, including dynamically linked files and additional files needed for server setup.  The setup program itself is created via a Web Setup project in Visual Studio.</p>
<p>The nAnt script that we created performed the following steps:</p>
<ul>
<li>Get files from source safe and label</li>
<li>Update all assembly info files with version information (remember that the assembly version is not what is used by ClickOnce to determine if there is a new version to download, the deployment manifest is used for that purpose)</li>
<li>Build all of the assemblies that are statically and dynamically linked.</li>
<li>Create the application manifest using Mage.exe, linking all of the statically and dynamically linked assemblies</li>
<li>Create the deployment manifest and version it with Mage.exe â€“ ensure that the deployment provider URL points to an invalid host name</li>
<li>Sign the Deployment and Application manifests with a certificate that is not issued by a certificate authority</li>
<li>Copy all of the files that are needed into a temporary build area with the Web Setup Project</li>
<li>Update the default web page with version information</li>
<li>Include a vbscript that is invoked during the install that will update the manifests (more on this later)</li>
<li>Invoke the Web Setup package via devenv (you need Visual Studio 2005 installed on the build machine)</li>
</ul>
<p>After the NAnt script is run, there will be a setup.exe and MSI install package for your ClickOnce server deployment.  In this package a dummy certificate is included and a vbscript for updating the deployment and application manifests.</p>
<p>In the Web Setup project we configured the vbscript to run during the server install.  The vbscript prompts the user to input the URL that will be used for ClickOnce client updates.  This URL is then used to update the deployment manifest with the new deployment URL.  The prompt also tells the installer that they should point to the load balanced hostname or as opposed to the specific server IP or hostname.  The vbscript invokes mage.exe to perform this step.  Mage.exe is part of the .Net Framework 2.0 SDK and must also be deployed with the setup project.</p>
<p><strong>mage.exe -Update myclickonceapp.application -ProviderUrl http://myserverhostname/myclickonceapp </strong></p>
<p>The installer then prompts for a path to the certificate to sign with.  Customers can use their own certificate to sign the application manifests with, or they can use the unsecured dummy certificate that is included in the setup package.</p>
<p><strong>mage.exe -Sign myclickonceapp.application -CertFile somecertificate.pfx -Password somepassword</strong></p>
<p>Next the installer vbscript must update the bootstrapper that is used to install the prerequisites.  This step is needed because the bootstrapper itself will invoke the ClickOnce application after it installs the prerequisites.  Note, that there are even issues around this if the client browser is not IE.  There are some very good work arounds for ClickOnce Firefox issues discussed over on the Microsoft Channel 9 forums.</p>
<p><strong>setup.exe /url= http://myserverhostname/</strong></p>
<p>After this is complete, the vbscript is left on the server in case if the user wants to update the deployment URL after setup.</p>
<p>This build and installation has worked very well for us, but you do need to at least provide instructions on the setup web page for Firefox users on how to properly install the application, or follow some of the work arounds detailed on the Microsoft Channel 9 Forums.</p>
<p>I hope this helps<br />
-Jon</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt">
]]></content:encoded>
			<wfw:commentRss>http://proactivelogic.com/blog/index.php/2006/09/30/packaging-a-clickonce-server-deployment/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
	</channel>
</rss>

