Wednesday, February 18, 2009

Programmatically Updating a SharePoint Content Editor Web Part

I found it to be a bit tricky to programmatically update a SharePoint's Content Editor Web Part. Well, most properties of the web part are not an issue, however the Content property can be a bit tricky. The reason is because it is of type XmlElement. When I first started to look at doing this, I figured I could just modify the XML and call the SaveChanges() method. It is not that simple. If you don't set the Content property explicitly, that property is not marked dirty and therefore is never saved. Or at least that is my theory. The fact is that you must create a new XmlElement and set the Content property equal to it. If you do this you should have no problem.

Below is a sample method that I used to replace content on ALL Content Editor Web Parts that are on the particular SPWeb (based on the url passed). You could loop through all the SPWebs to do a global search and replace as well.

This method is not robust from a functionality standpoint. It is really just to illustrate how to get a reference to a webpart, make a not so straight forward change, and then persist the changes. For example, this method does not work on any pages that you add or that are not default.aspx. This code could be easily modified to do so though.

using System.Xml;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebPartPages;

public void SearchAndReplaceInContentEditorWebParts(string siteUrl, string oldString, string newString)
  using (SPSite site = new SPSite(siteUrl))
   using (SPWeb web = site.OpenWeb())
    if (web.Exists)
     using (SPLimitedWebPartManager mgr = web.GetFile("default.aspx").GetLimitedWebPartManager(PersonalizationScope.Shared))

      if (mgr != null)
       foreach (Microsoft.SharePoint.WebPartPages.WebPart part in mgr.WebParts)
         if (part.GetType().ToString().Equals("Microsoft.SharePoint.WebPartPages.ContentEditorWebPart"))
          ContentEditorWebPart contentEditor = (ContentEditorWebPart)part;

          // create a new XmlElement and put the results there
          XmlDocument xmlDoc = new XmlDocument();
          XmlElement xmlElement = xmlDoc.CreateElement("MyElement");
          xmlElement.InnerText = contentEditor.Content.InnerText.Replace(oldString, newString);

          // we MUST set the Content property, not a property of Content.
          // For example, changing the InnerXml or InnerText property of
          // Content will not be saved.
          contentEditor.Content = xmlElement;

          // persist changes to the database

        catch (Exception ex)
         //logLine("WebPart ERROR: " + ex.Message);



  }// end using


Avi said...

This post might be also help:

Brent V said...

Hi Avi,

Thank you very much for your feedback. I greatly appreciate it.

One thing to note about the post you reference is actually the obsolete (see way of doing it if you are using Windows SharePoint Services 3.0 or MOSS 2007. The post does however work for Windows SharePoint Services 2.0.

Unless you are using WSS 2.0, it is strongly recommended that you use the new code as noted in my post. Short of that, the code does essentially the same thing.

Thank you again for your feedback.

Sam said...

Thanks a lot. You just saved my 2nd day :-)

Anonymous said...

Thanks for this solution, very helpful

ntrnci01 said...

Thanks for the solution!

Prologic Corporation said...

This is a good article & good site.Thank you for sharing this article. It is help us following categorize:
healthcare, e commerce, programming, multi platform,inventory management, cloud-based solutions, it consulting, retail, manufacturing, CRM, technology means, digital supply chain management, Delivering high-quality service for your business applications,
Solutions for all Industries,
Getting your applications talking is the key to better business processes,
Rapid web services solutions for real business problems,
Web-based Corporate Document Management System,
Outsourcing Solution,
Financial and Operations Business Intelligence Solution,

Our address:
2002 Timberloch Place, Suite 200
The Woodlands, TX 77380