<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.sharepointblogs.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Bob&amp;#39;s SharePoint Bonanza</title><link>http://www.sharepointblogs.com/bobsbonanza/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>Deploying site columns and content types to sharepoint webs</title><link>http://www.sharepointblogs.com/bobsbonanza/archive/2007/12/17/deploying-site-columns-and-content-types-to-sharepoint-webs.aspx</link><pubDate>Mon, 17 Dec 2007 15:56:00 GMT</pubDate><guid isPermaLink="false">1f6a1193-f4bb-4480-a5ae-b538d8b20f46:9914</guid><dc:creator>Robert Fridén</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sharepointblogs.com/bobsbonanza/rsscomments.aspx?PostID=9914</wfw:commentRss><comments>http://www.sharepointblogs.com/bobsbonanza/archive/2007/12/17/deploying-site-columns-and-content-types-to-sharepoint-webs.aspx#comments</comments><description>&lt;p&gt;Hi everyone!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;It&amp;#39;s been a long time since my last (and first) post. Mostly because my job is keeping me insanely busy these days, but also since there are so many excellent SharePoint bloggers out there that it&amp;#39;s not every day you discover something worth blogging that&amp;nbsp;someone hasn&amp;#39;t already written about. But last week i ran into a problem when we were about to create some features and site definitions to deploy a portal for one of our customers that I thought maybe would be of interest to other people.&lt;/p&gt;
&lt;p&gt;The portal consisted of one site collection on the top level and several levels of webs underneath. On some of the subwebs we had created site columns with lookups to lists on that web and based content types on them. We knew that we could deploy content types and site columns using the feature framework and we tried to do just that only to discover that stsadm would spurt out nasty error messages telling us that features with web scope cannot be used to deploy that type of content.&lt;/p&gt;
&lt;p&gt;&amp;quot;No Problem&amp;quot;, I thought, &amp;quot;I&amp;#39;ll just create a small app that uses the API to add them instead&amp;quot;. But that proved to be easier said than done since the API require your content type to inherit from existing content types and when you do, it will create new GUIDS for them which just cut it for us. So what I ended up doing (once again) was to reverse engineer selected parts of SharePoint and trick it into adding content types and site columns on webs using specific GUIDs and now I&amp;#39;ll tell you how to do the same.&lt;/p&gt;
&lt;p&gt;The first step for me was to get the information about the content types and site columns out of our development environment so I could move it from one machine to another. For this I created a small console application. If I had more time I would probably made and STSADM extension out of it, but I&amp;#39;ll leave that as an exercise for the reader &lt;img src="http://www.sharepointblogs.com/emoticons/emotion-5.gif" alt="Wink" /&gt;. &lt;/p&gt;
&lt;p&gt;The application iterates through the entire site and generates an XML file with each web in it&amp;#39;s own node to keep the information structured and so that I&amp;#39;ll be able to read out which web each field belongs to when I import it later. This time I was in luck since the SPField object in the Fields collection on the SPWeb object actually has a property called &amp;quot;SchemaXml&amp;quot; which contains the definition of the field.&lt;/p&gt;
&lt;p&gt;The SchemaXml property of a column looks something like this:&lt;/p&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;Field&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Type&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;LookupMulti&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;DisplayName&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;Target Segments&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Required&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;FALSE&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;List&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;{848b897d-e7e7-4efa-a859-c7c13fe00270}&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;WebId&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;c5fe1b80-87d2-41a3-ba0e-ba1bfc43c65b&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;ShowField&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;Title&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Mult&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;TRUE&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Sortable&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;FALSE&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;UnlimitedLengthInDocumentLibrary&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;FALSE&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Group&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;My columns&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;ID&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;{89f0caed-ff04-43e5-ba04-9accbaa50776}&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;SourceID&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;{c5fe1b80-87d2-41a3-ba0e-ba1bfc43c65b}&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;StaticName&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;TargetSegments&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;TargetSegments&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;/&amp;gt;&lt;/p&gt;&lt;/font&gt;
&lt;p&gt;But unfortunately, look-up columns refer to the source lists and webs by GUID (the List and WebId attributes above) which means that there&amp;#39;s no way we can just import this XML into another farm and expect everything to work. We have to examine the schema XML and fiddle with it a little by inserting a little extra information to help us determine the correct GUIDs during import.&lt;/p&gt;
&lt;p&gt;So let&amp;#39;s load&amp;nbsp;up the XML in an XMLDocument&amp;nbsp;in the loop that iterates through all the site columns in the web:&lt;/p&gt;&lt;font color="#2b91af" size="2"&gt;
&lt;p&gt;XmlDocument&lt;/font&gt;&lt;font size="2"&gt; doc = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;XmlDocument&lt;/font&gt;&lt;font size="2"&gt;();&lt;br /&gt;doc.LoadXml(field.SchemaXml);&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;And then check if the field has a &amp;quot;List&amp;quot;-attribute and if it does, append a &amp;quot;ListName&amp;quot;-attribute with the name of the list that the GUID points to:&lt;/font&gt;&lt;/p&gt;&lt;font size="2"&gt;&lt;font color="#008000" size="2"&gt;
&lt;p&gt;// Fix List GUID&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (doc.DocumentElement.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;List&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt; &amp;amp;&amp;amp; doc.DocumentElement.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;List&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;].Value.StartsWith(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;{&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;))&lt;br /&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp; Guid&lt;/font&gt;&lt;font size="2"&gt; listId = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Guid&lt;/font&gt;&lt;font size="2"&gt;(doc.DocumentElement.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;List&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;].Value);&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp; XmlAttribute&lt;/font&gt;&lt;font size="2"&gt; listNameAttribute = doc.CreateAttribute(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;ListName&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;&amp;nbsp; listNameAttribute.Value = web.Lists[listId].Title;&lt;br /&gt;&amp;nbsp; doc.DocumentElement.Attributes.Append(listNameAttribute);&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;Then check if there&amp;#39;s a WebId attribute and give it a similar treatment by adding a WebName attribute:&lt;/font&gt;&lt;/p&gt;&lt;font size="2"&gt;&lt;font color="#008000" size="2"&gt;
&lt;p&gt;// Fix Web GUID&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (doc.DocumentElement.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;WebId&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp; Guid&lt;/font&gt;&lt;font size="2"&gt; webId = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Guid&lt;/font&gt;&lt;font size="2"&gt;(doc.DocumentElement.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;WebId&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;].Value);&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp; XmlAttribute&lt;/font&gt;&lt;font size="2"&gt; webNameAttribute = doc.CreateAttribute(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;WebName&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp; using&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;SPWeb&lt;/font&gt;&lt;font size="2"&gt; sourceWeb = web.Site.OpenWeb(webId))&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; webNameAttribute.Value = sourceWeb.ServerRelativeUrl;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;doc.DocumentElement.Attributes.Append(webNameAttribute);&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;Now we have fully importable look-up site column XML! Next, let&amp;#39;s export some content types!&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;Here&amp;#39;s where I stumbled upon my first hurdle in my endeavor. SPContent type doesn&amp;#39;t have any SchemaXml property! But after some research with &lt;a class="" title="Reflector" href="http://www.aisto.com/roeder/dotnet/" target="_blank"&gt;Reflector&lt;/a&gt;&amp;nbsp;I found out that SPContentType has an internal method called &amp;quot;SaveCore&amp;quot; that takes an XmlTextWriter and exports the content type definition to XML which is just what we need! So let&amp;#39;s write a helper method that calls SaveCore on an SPContentType object and returns the exported XML using reflection:&lt;/font&gt;&lt;/p&gt;&lt;font size="2"&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;private&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;static&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt; GetInternalSchema(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;SPContentType&lt;/font&gt;&lt;font size="2"&gt; ctype)&lt;br /&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp; MethodInfo&lt;/font&gt;&lt;font size="2"&gt; saveCoreMethod = ctype.GetType().GetMethod(&lt;br /&gt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;SaveCore&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;,&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindingFlags&lt;/font&gt;&lt;font size="2"&gt;.NonPublic | &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;BindingFlags&lt;/font&gt;&lt;font size="2"&gt;.Instance,&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null&lt;/font&gt;&lt;font size="2"&gt;,&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Type&lt;/font&gt;&lt;font size="2"&gt;[] { &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;typeof&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;XmlTextWriter&lt;/font&gt;&lt;font size="2"&gt;), &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;typeof&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;bool&lt;/font&gt;&lt;font size="2"&gt;), &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;typeof&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;bool&lt;/font&gt;&lt;font size="2"&gt;) },&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp; StringBuilder&lt;/font&gt;&lt;font size="2"&gt; sb = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;StringBuilder&lt;/font&gt;&lt;font size="2"&gt;();&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp; XmlTextWriter&lt;/font&gt;&lt;font size="2"&gt; xwtr = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;XmlTextWriter&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;StringWriter&lt;/font&gt;&lt;font size="2"&gt;(sb, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;CultureInfo&lt;/font&gt;&lt;font size="2"&gt;.InvariantCulture));&lt;br /&gt;&amp;nbsp; saveCoreMethod.Invoke(ctype, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt;[] { xwtr, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;false&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;false&lt;/font&gt;&lt;font size="2"&gt; });&lt;br /&gt;&amp;nbsp; xwtr.Flush();&lt;br /&gt;&amp;nbsp; xwtr.Close();&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp; return&lt;/font&gt;&lt;font size="2"&gt; sb.ToString();&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s an example of what this method writes for one of my content types:&lt;/p&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;ContentType&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;ID&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;0x01040074079E5E8E5DA5419F1CE8300AA67B68&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;MyContentType&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Group&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;MyContentTypes&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Version&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;2&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;Folder&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;TargetName&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;_cts/MyContentType&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;FieldRefs&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;FieldRef&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;ID&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;{c042a256-787d-4a6f-8a8a-cf6ab767f12d}&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;ContentType&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;FieldRef&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;ID&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;{fa564e0f-0c70-4ab9-b863-0177e6ddd247}&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;Title&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Required&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;TRUE&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;ShowInNewForm&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;TRUE&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;ShowInEditForm&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;TRUE&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;FieldRef&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;ID&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;{7662cd2c-f069-4dba-9e35-082cf976e170}&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;Body&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;FieldRef&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;ID&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;{3805f629-5035-4a13-9362-8d1b216bbc05}&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;CustomColumnHere&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;FieldRef&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;ID&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;{51d39414-03dc-4bd0-b777-d3e20cb350f7}&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;PublishingStartDate&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;FieldRef&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;ID&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;{a990e64f-faa3-49c1-aafa-885fda79de62}&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;PublishingExpirationDate&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;FieldRefs&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;XmlDocuments&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;XmlDocument&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;NamespaceURI&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;http://schemas.microsoft.com/sharepoint/v3/contenttype/forms&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;FormTemplates&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;xmlns&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;http://schemas.microsoft.com/sharepoint/v3/contenttype/forms&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;Display&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;/font&gt;&lt;font size="2"&gt;ListForm&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;Display&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;Edit&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;/font&gt;&lt;font size="2"&gt;ListForm&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;Edit&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;New&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;/font&gt;&lt;font size="2"&gt;ListForm&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;New&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;FormTemplates&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;XmlDocument&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;XmlDocuments&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;ContentType&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Ahhh. I love .NET &lt;img src="http://www.sharepointblogs.com/emoticons/emotion-1.gif" alt="Smile" /&gt; &lt;/p&gt;
&lt;p&gt;Anyway! Let&amp;#39;s move on the next step: Importing the site columns!&lt;/p&gt;
&lt;p&gt;Before we can feed SharePoint the exported Schema XML for the columns, we have check each column for the ListName and WebName attributes we added earlier and use them to find the GUIDs of the list and web in the target enviroment. We should also remove the *Name attributes since SharePoint isn&amp;#39;t expecting them:&lt;/p&gt;&lt;font color="#008000" size="2"&gt;
&lt;p&gt;// Fix List GUID&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (field.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;ListName&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; field.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;List&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;].Value = web.Lists[field.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;ListName&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;].Value].ID.ToString(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;B&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;&amp;nbsp; field.Attributes.RemoveNamedItem(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;ListName&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;// Fix Web GUID&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (field.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;WebName&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp; using&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;SPWeb&lt;/font&gt;&lt;font size="2"&gt; sourceWeb = web.Site.OpenWeb(field.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;WebName&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;].Value))&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; field.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;WebId&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;].Value = sourceWeb.ID.ToString(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;D&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; field.Attributes.RemoveNamedItem(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;WebName&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;}&lt;/p&gt;&lt;/font&gt;
&lt;p&gt;I also noticed the SourceID attribute in the schema and that it was (in my case) always the same as the WebId, so just to be safe, I replaced that one too:&lt;/p&gt;&lt;font color="#008000" size="2"&gt;
&lt;p&gt;// Fix source ID&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (field.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;SourceID&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt; &amp;amp;&amp;amp; field.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;SourceID&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;].Value.StartsWith(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;{&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; field.Attributes[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;SourceID&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;].Value = web.ID.ToString(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;B&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;You may wish to examine your generated XML for the site columns and make sure that WebId and SourceId are the same in your case too before using this code &lt;img src="http://www.sharepointblogs.com/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;Now that the XML has been updated with GUIDs in the new environment we can finally add the column to the web:&lt;/font&gt;&lt;/p&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;
&lt;p&gt;web.Fields.AddFieldAsXml(field.OuterXml);&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s proceed directly to the grand finale: Importing the content types!&lt;/p&gt;
&lt;p&gt;As you probably have guessed (or found out the hard way since you&amp;#39;re reading this article) There&amp;#39;s no&amp;nbsp;documented way of importing content types to webs and preserving the GUIDs. This is most likely a design decision to ensure the uniqueness of content types across all webs of a farm so you may want to examine your options carefully before going down the same dark path that I did. And keep in mind that this code probably doesn&amp;#39;t support all content type scenarios. It worked for me, but I didn&amp;#39;t need features like workflows, document templates or information management policies. To get a better understanding of the complexities of content types, you can take look at &lt;a class="" title="Gary Lapointe&amp;#39;s" href="http://stsadm.blogspot.com/"&gt;Gary Lapointe&amp;#39;s&lt;/a&gt; post about &lt;a class="" title="copying content types" href="http://stsadm.blogspot.com/2007/08/copy-content-types.html"&gt;copying content types&lt;/a&gt;&amp;nbsp;between site collections within the same farm. &lt;/p&gt;
&lt;p&gt;Still with me? Cool! Then let&amp;#39;s get down to business:&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;First we need to create an empty SPContentType object. Again, we have to resort to reflection since the SPContentType class doesn&amp;#39;t have any public constructors. It&amp;#39;s time for another helper method:&lt;/font&gt;&lt;/p&gt;&lt;font size="2"&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;private&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;static&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;SPContentType&lt;/font&gt;&lt;font size="2"&gt; CreateEmptyContentType()&lt;br /&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp; ConstructorInfo&lt;/font&gt;&lt;font size="2"&gt; constructor = (&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;typeof&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;SPContentType&lt;/font&gt;&lt;font size="2"&gt;)).GetConstructor(&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindingFlags&lt;/font&gt;&lt;font size="2"&gt;.NonPublic | &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;BindingFlags&lt;/font&gt;&lt;font size="2"&gt;.Instance, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Type&lt;/font&gt;&lt;font size="2"&gt;.EmptyTypes, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;SPContentType&lt;/font&gt;&lt;font size="2"&gt; ctype = (&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;SPContentType&lt;/font&gt;&lt;font size="2"&gt;)constructor.Invoke(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt;[0]);&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp; return&lt;/font&gt;&lt;font size="2"&gt; ctype;&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;Then we need to call the internal method &amp;quot;Load&amp;quot; to load the XML definition of the content type that we exported earlier:&lt;/font&gt;&lt;/p&gt;&lt;font size="2"&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;private&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;static&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt; ReadContentTypeFromXml(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;SPContentType&lt;/font&gt;&lt;font size="2"&gt; ctype, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;XmlTextReader&lt;/font&gt;&lt;font size="2"&gt; xmlReader)&lt;br /&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp; MethodInfo&lt;/font&gt;&lt;font size="2"&gt; loadMethod = ctype.GetType().GetMethod(&lt;br /&gt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;Load&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;,&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindingFlags&lt;/font&gt;&lt;font size="2"&gt;.NonPublic | &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;BindingFlags&lt;/font&gt;&lt;font size="2"&gt;.Instance,&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null&lt;/font&gt;&lt;font size="2"&gt;,&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Type&lt;/font&gt;&lt;font size="2"&gt;[] { &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;typeof&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;XmlReader&lt;/font&gt;&lt;font size="2"&gt;) },&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;&amp;nbsp; loadMethod.Invoke(ctype, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt;[] { xmlReader });&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;After that&amp;nbsp;we have to set the scope of the content type and the field reference collection, yet again using reflection:&lt;/font&gt;&lt;/p&gt;&lt;font size="2"&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;private&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;static&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt; SetContentTypeScope(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;SPContentType&lt;/font&gt;&lt;font size="2"&gt; ctype, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;SPWeb&lt;/font&gt;&lt;font size="2"&gt; web)&lt;br /&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp; string&lt;/font&gt;&lt;font size="2"&gt; scope = web.ServerRelativeUrl.TrimStart(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;#39;/&amp;#39;&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp; MethodInfo&lt;/font&gt;&lt;font size="2"&gt; setCTScopeMethod = ctype.GetType().GetMethod(&lt;br /&gt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;SetScope&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;,&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindingFlags&lt;/font&gt;&lt;font size="2"&gt;.NonPublic | &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;BindingFlags&lt;/font&gt;&lt;font size="2"&gt;.Instance,&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null&lt;/font&gt;&lt;font size="2"&gt;,&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Type&lt;/font&gt;&lt;font size="2"&gt;[] { &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;typeof&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt;) },&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;&amp;nbsp; setCTScopeMethod.Invoke(ctype, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt;[] { scope });&lt;/font&gt;&lt;/p&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp; PropertyInfo&lt;/font&gt;&lt;font size="2"&gt; fieldLinksScopeProperty = ctype.FieldLinks.GetType().GetProperty(&lt;br /&gt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;Scope&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;,&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindingFlags&lt;/font&gt;&lt;font size="2"&gt;.NonPublic | &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;BindingFlags&lt;/font&gt;&lt;font size="2"&gt;.Instance,&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null&lt;/font&gt;&lt;font size="2"&gt;,&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; typeof&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt;),&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type&lt;/font&gt;&lt;font size="2"&gt;.EmptyTypes,&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;&amp;nbsp; fieldLinksScopeProperty.SetValue(ctype.FieldLinks, scope, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt;[0]);&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp; PropertyInfo&lt;/font&gt;&lt;font size="2"&gt; contentTypeWebProperty = ctype.GetType().GetProperty(&lt;br /&gt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;Web&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;,&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindingFlags&lt;/font&gt;&lt;font size="2"&gt;.NonPublic | &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;BindingFlags&lt;/font&gt;&lt;font size="2"&gt;.Instance,&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null&lt;/font&gt;&lt;font size="2"&gt;,&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; typeof&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;SPWeb&lt;/font&gt;&lt;font size="2"&gt;),&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type&lt;/font&gt;&lt;font size="2"&gt;.EmptyTypes,&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;nbsp; contentTypeWebProperty.SetValue(ctype, web, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt;[0]);&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;font size="2"&gt;Now all that remains is to call the helper methods and add the content type to the web:&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#2b91af" size="2"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#2b91af" size="2"&gt;SPContentType&lt;/font&gt;&lt;font size="2"&gt; ctype = CreateEmptyContentType();&lt;br /&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;XmlTextReader&lt;/font&gt;&lt;font size="2"&gt; xmlReader = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;XmlTextReader&lt;/font&gt;&lt;font size="2"&gt;(contentType.OuterXml, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;XmlNodeType&lt;/font&gt;&lt;font size="2"&gt;.Element, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;XmlParserContext&lt;/font&gt;&lt;font size="2"&gt;(doc.NameTable, nsmgr,&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;XmlSpace&lt;/font&gt;&lt;font size="2"&gt;.Default));&lt;br /&gt;ReadContentTypeFromXml(ctype, xmlReader);&lt;br /&gt;&lt;font size="2"&gt;SetContentTypeScope(ctype, web);&lt;br /&gt;&lt;font size="2"&gt;web.ContentTypes.Add(ctype);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt; 
&lt;p&gt;As soon as I get around to cleaning up my code, I&amp;#39;ll post an example application that makes use of the code in this post. &lt;/p&gt;
&lt;p&gt;Questions, comments and improvements are of course always welcome!&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
			&lt;hr&gt;&lt;span style="font-size:10pt;"&gt;Posted on &lt;a href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/a&gt;&lt;/span&gt;
		  &lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=9914" width="1" height="1"&gt;</description><category domain="http://www.sharepointblogs.com/bobsbonanza/archive/tags/content+types/default.aspx">content types</category><category domain="http://www.sharepointblogs.com/bobsbonanza/archive/tags/site+columns/default.aspx">site columns</category><category domain="http://www.sharepointblogs.com/bobsbonanza/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://www.sharepointblogs.com/bobsbonanza/archive/tags/deployment/default.aspx">deployment</category></item><item><title>Filtering with SPGridView</title><link>http://www.sharepointblogs.com/bobsbonanza/archive/2007/07/02/filtering-with-spgridview.aspx</link><pubDate>Mon, 02 Jul 2007 11:18:00 GMT</pubDate><guid isPermaLink="false">1f6a1193-f4bb-4480-a5ae-b538d8b20f46:2621</guid><dc:creator>Robert Fridén</dc:creator><slash:comments>72</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sharepointblogs.com/bobsbonanza/rsscomments.aspx?PostID=2621</wfw:commentRss><comments>http://www.sharepointblogs.com/bobsbonanza/archive/2007/07/02/filtering-with-spgridview.aspx#comments</comments><description>&lt;p&gt;One of the most exciting new web controls that come with SharePoint 2007 is the SPGridView control. With it, you can present data in a grid view that closely resembles the view that SharePoint uses to display data from lists. You can sort and group rows, add drop-down menus to cells and filter rows using column header drop-down menus. &lt;/p&gt;
&lt;p&gt;There is, however, a slight drawback with it; there is almost no official documentation on how to use it. But there is lots of information post on it around the &amp;#39;net. If you&amp;#39;re new to the SPGridView, I suggest you head over to &lt;a href="http://blogs.msdn.com/powlo"&gt;Powlo&amp;#39;s blog&lt;/a&gt; that has a &lt;a href="http://blogs.msdn.com/powlo/archive/2007/02/25/displaying-custom-data-through-sharepoint-lists-using-spgridview-and-spmenufield.aspx"&gt;great introduction&lt;/a&gt; of how to use the basic features of the control. &lt;/p&gt;
&lt;p&gt;I recently chose to use this control in a scenario where filtering using the UI was required. I had heard about the SPGridView and knew it had the filtering capabilities I needed, but I had a very hard time figuring out &lt;em&gt;how&lt;/em&gt; to use it. But after much (unsuccessful) Googling and a lot of trial-and-error on my own, I managed to get it right and thought it would be nice to share this information with others facing the same challenges I did. &lt;/p&gt;
&lt;p&gt;The first hurdle I ran into was that filtering does not work if you bind the SPGridView using the DataSource property; you have to use the DataSourceID property to perform the binding. For this example, I wrote a small class that creates a DataTable object with some hardcoded data: &lt;/p&gt;
&lt;p dir="ltr" style="MARGIN-RIGHT:0px;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;class&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;ExampleObjectDataSource &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;{ &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:blue;"&gt;&amp;nbsp; public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;DataTable&lt;/span&gt; GetDataTable() &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp; { &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:#2b91af;"&gt;&amp;nbsp; &amp;nbsp; DataTable&lt;/span&gt; tblData = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;DataTable&lt;/span&gt;(); &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tblData.Columns.Add(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;); &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; tblData.Columns.Add(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Author&amp;quot;&lt;/span&gt;); &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; tblData.Columns.Add(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Rating&amp;quot;&lt;/span&gt;); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tblData.Rows.Add(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Obsession&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Robards, Karen&amp;quot;&lt;/span&gt;, 2); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tblData.Rows.Add(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Vanished&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Robards, Karen&amp;quot;&lt;/span&gt;, 3); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tblData.Rows.Add(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Magician: Apprentice&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Feist, Raymong E.&amp;quot;&lt;/span&gt;, 4); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tblData.Rows.Add(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Magician: Master&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Feist, Raymong E.&amp;quot;&lt;/span&gt;, 5); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tblData.Rows.Add(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Silverthorn&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Feist, Raymong E.&amp;quot;&lt;/span&gt;, 4); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tblData.Rows.Add(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Lord Foul&amp;#39;s Bane&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Donaldson, Stephen R.&amp;quot;&lt;/span&gt;, 3); &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tblData.Rows.Add(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;The Illearth War&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Donaldson, Stephen R.&amp;quot;&lt;/span&gt;, 4); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tblData.AcceptChanges(); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:blue;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/span&gt; tblData; &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp; } &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;}&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;Then simply instantiate an ObjectDataSource object that points to the example data class in the CreateChildControl() method of the web part: &lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:#2b91af;"&gt;ObjectDataSource&lt;/span&gt; odsDataSource = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;ObjectDataSource&lt;/span&gt;(&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Strand.Demos.FilteredGridExample.ExampleObjectDataSource, Strand.Demos.FilteredGridExample, Culture=neutral, Version=1.0.0.0, PublicKeyToken=9f4da00116c38ec5&amp;quot;&lt;/span&gt;, &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:#a31515;"&gt;&lt;br /&gt;&amp;nbsp; &amp;quot;GetDataTable&amp;quot;&lt;/span&gt;); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp; odsDataSource.ID = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;ExampleSource&amp;quot;&lt;/span&gt;; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;&amp;nbsp; Controls.Add(odsDataSource); &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Of course, we&amp;#39;re going to need some columns to display the data. For good measure, I want to implement sorting as well, so let&amp;#39;s set the SortExpression properties of the fields too: &lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;sgvGrid = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;SPGridView&lt;/span&gt;(); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;sgvGrid.ID = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;ExampleGrid&amp;quot;&lt;/span&gt;; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;sgvGrid.AutoGenerateColumns = &lt;span style="COLOR:blue;"&gt;false&lt;/span&gt;; &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:#2b91af;"&gt;&lt;br /&gt;BoundField&lt;/span&gt; col = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;BoundField&lt;/span&gt;(); &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;col.DataField = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;; &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;col.SortExpression = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;; &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;col.HeaderText = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;sgvGrid.Columns.Add(col); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;col = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;BoundField&lt;/span&gt;(); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;col.DataField = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Author&amp;quot;&lt;/span&gt;; &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;col.SortExpression = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Author&amp;quot;&lt;/span&gt;; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;col.HeaderText = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Author&amp;quot;&lt;/span&gt;; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;sgvGrid.Columns.Add(col); &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;col = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;BoundField&lt;/span&gt;(); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;col.DataField = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Rating&amp;quot;&lt;/span&gt;; &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;col.SortExpression = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Rating&amp;quot;&lt;/span&gt;; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;col.HeaderText = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Rating&amp;quot;&lt;/span&gt;; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;sgvGrid.Columns.Add(col); &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;sgvGrid.AllowSorting = &lt;span style="COLOR:blue;"&gt;true&lt;/span&gt;;&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;Next, let&amp;#39;s enable the filtering! &lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;sgvGrid.AllowFiltering = &lt;span style="COLOR:blue;"&gt;true&lt;/span&gt;; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Now, we need to tell the SPGridView which columns we want to enable filtering on, and which field each column should use in the filter expression by setting the FilterDataFields property. This is a comma-separated string containing which field each respective column in the grid should filter by. We want to be able to filter by Author or Rating, but not by Title, so leave the first field empty: &lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;sgvGrid.FilterDataFields = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;,Author,Rating&amp;quot;&lt;/span&gt;;&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;We also need to tell the grid which property to set on the data source control when filtering. In our case, it is the FilterExpression property of the ObjectDataSource: &lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;sgvGrid.FilteredDataSourcePropertyName = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;FilterExpression&amp;quot;&lt;/span&gt;; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The SPGridView control will use string.Format() to generate the string it will set the FilterExpression to, so we must specify the format string it will use. The first parameter is the value to filter on, and the second parameter is the name of the field being filtered. &lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;sgvGrid.FilteredDataSourcePropertyFormat = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;{1} LIKE &amp;#39;{0}&amp;#39;&amp;quot;&lt;/span&gt;; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;And lest we forget, let&amp;#39;s set the DataSourceID property of the grid and add the grid to the Controls collection: &lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;sgvGrid.DataSourceID = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;ExampleSource&amp;quot;&lt;/span&gt;; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;Controls.Add(sgvGrid); &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Do the databinding in the Render method: &lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:blue;"&gt;protected&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Render(&lt;span style="COLOR:#2b91af;"&gt;HtmlTextWriter&lt;/span&gt; writer) &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;{ &lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;sgvGrid.DataBind(); &lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;.Render(writer); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;} &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Now you&amp;#39;ll have filtering implemented and you can compile, deploy and filter the grid to your heart&amp;#39;s content! &lt;/p&gt;
&lt;p&gt;&lt;img src="http://chipz.sytes.net/~chipz/050307_1301_Filteringwi1.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;(Please excuse the Swedish UI!) &lt;/p&gt;
&lt;p&gt;If you&amp;#39;ve come this far and played around with the filtering and sorting for awhile, you&amp;#39;ve probably noticed that there&amp;#39;s something that&amp;#39;s not working quite as you&amp;#39;d expect it; If you filter by one column and then sort by another, your filter will disappear! This is of course highly unsatisfactory and needs to be dealt with! &lt;/p&gt;
&lt;p&gt;I think my solution to this is a bit on the ugly side, so if anyone out there happens to know the &amp;quot;right&amp;quot; way of doing this, I&amp;#39;d appreciate it if you let me know! &lt;/p&gt;
&lt;p&gt;What I did was to first save the FilterExpression in the ViewState in the OnPreRender method: &lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:blue;"&gt;protected&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; OnPreRender(&lt;span style="COLOR:#2b91af;"&gt;EventArgs&lt;/span&gt; e) &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;{&amp;nbsp;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp; ViewState[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;FilterExpression&amp;quot;&lt;/span&gt;] = odsDataSource.FilterExpression; &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:blue;"&gt;&lt;br /&gt;&amp;nbsp; base&lt;/span&gt;.OnPreRender(e); &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;} &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Then I inserted code to set the FilterExpression to the previously saved expression in the ViewState. Since I never want the options in the filter menu drop-down to be filtered, I check the query string and then only set the FilterExpression if the current page request is &lt;em&gt;not&lt;/em&gt; callback from the drop down menu. This code should be inserted just before adding the odsDataSource object to the Controls collection: &lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:#2b91af;"&gt;HttpRequest&lt;/span&gt; req = &lt;span style="COLOR:#2b91af;"&gt;HttpContext&lt;/span&gt;.Current.Request; &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (req.Form[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;__CALLBACKID&amp;quot;&lt;/span&gt;] == &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt; || &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;br /&gt;&amp;nbsp; req.Form[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;__CALLBACKPARAM&amp;quot;&lt;/span&gt;] == &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt; || &lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;!req.Form[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;__CALLBACKID&amp;quot;&lt;/span&gt;].EndsWith(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;ExampleGrid&amp;quot;&lt;/span&gt;)) &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;{ &lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (ViewState[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;FilterExpression&amp;quot;&lt;/span&gt;] != &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;odsDataSource.FilterExpression = (&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;)ViewState[&lt;span style="COLOR:#a31515;"&gt;&amp;quot;FilterExpression&amp;quot;&lt;/span&gt;]; &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;} &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;And that&amp;#39;s it! &lt;/p&gt;
			&lt;hr&gt;&lt;span style="font-size:10pt;"&gt;Posted on &lt;a href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/a&gt;&lt;/span&gt;
		  &lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=2621" width="1" height="1"&gt;</description><enclosure url="http://www.sharepointblogs.com/bobsbonanza/attachment/2621.ashx" length="5146" type="application/x-zip-compressed" /><category domain="http://www.sharepointblogs.com/bobsbonanza/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://www.sharepointblogs.com/bobsbonanza/archive/tags/Filtering/default.aspx">Filtering</category><category domain="http://www.sharepointblogs.com/bobsbonanza/archive/tags/SPGridView/default.aspx">SPGridView</category></item></channel></rss>