<?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; Community Server</title>
	<atom:link href="http://proactivelogic.com/blog/index.php/category/community-server/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>
	</channel>
</rss>

