in

SharePoint Blogs

The Best Place for SharePoint-related Blogs

Ton Stegeman [MVP] weblog

I have moved my blog to http://www.tonstegeman.com/blog. If you have a blogpost at sharepointblogs that does not display all the content on the right hand side, please go to the new blog. It has all the posts that are on this blog as well. I you have any feedback, please send me a message through the contact form.

Creating custom editor parts for a SharePoint webpart

For one of my SharePoint webparts I created a custom EditorPart to edit the properties of the webpart. I had some issues with this editorpart that caused me a headache.My webpart is an ASP.NET 2.0 webpart (System.Web.UI.WebControls.WebParts) that implements the IWebEditable interface. Here is the code of my webpart:

    public class TestEditorPart : 
System.Web.UI.WebControls.WebParts.WebPart, IWebEditable
    {
        private string _myMessage;
 
        [WebBrowsable(false)]
        [Personalizable(PersonalizationScope.Shared)]
        public string MyMessage
        {
            get { return _myMessage; }
            set { _myMessage = value; }
        }
 
        protected override void Render(HtmlTextWriter writer)
        {
            base.Render(writer);
            writer.WriteLine(string.Format("Message: {0}.", MyMessage));
        }
 
        EditorPartCollection IWebEditable.CreateEditorParts()
        {
            List<EditorPart> editors = new List<EditorPart>();
            editors.Add(new MyEditorPart());
            return new EditorPartCollection(editors);
        }
 
        object IWebEditable.WebBrowsableObject
        {
            get { return this; }
        }
 
    }

In CreateEditorParts() my custom editorpart is created and returned in a new collection. My editor part is called MyEditorPart. I will not discuss the code in detail, because it is pretty straight forward.

    public class MyEditorPart : EditorPart
    {
        private TextBox _message;
        protected override void CreateChildControls()
        {
            base.CreateChildControls();
            _message = new TextBox();
            Controls.Add(_message);
        }
 
        public override bool ApplyChanges()
        {
            EnsureChildControls();
            TestEditorPart webPart = WebPartToEdit as TestEditorPart;
            if (webPart != null)
            {
                webPart.MyMessage = _message.Text;
            }
 
            return true;
        }
 
        public override void SyncChanges()
        {
            EnsureChildControls();
            TestEditorPart webPart = WebPartToEdit as TestEditorPart;
            if (webPart != null)
            {
                _message.Text = webPart.MyMessage;
            }
        }
    }

After compiling the assembly, deploying it to my SharePoint 2007 server and registering the webpart, I added the webpart to the page. After clicking the “Modify”Shared Web Part””, the page crashes with message “An unexpected error has occurred.”:

                Editorpart1

After adding a constructor to MyEditorPart and setting an ID for my editor part, this problem is solved.

        public MyEditorPart()
        {
            this.ID = "MyEditorPart";
        }

While testing the webpart, I used this webpart twice on the same page. I changed the message for the first webpart to “Message 1”. Then I set the message for the other webpart to a different text and switched back to the properties of the first webpart. Although I have the correct webpart selected (see screenshot below) the textbox in the editor part shows the message of the other webpart. See the screenshot below.

                Editorpart2

After some serious debugging I found out that the ID of the editor part has to be unique for each instance of your webpart. I changed the constructor of my EditorPart to take the ID of the webpart as a parameter. This solved my problem.

        public MyEditorPart(string webPartID)
        {
            this.ID = "MyEditorPart" + webPartID;
        }

In the webpart code I changed CreateEditorParts to pass the ID in the constructor: 

        EditorPartCollection IWebEditable.CreateEditorParts()
        {
            List<EditorPart> editors = new List<EditorPart>();
            editors.Add(new MyEditorPart(this.ID));
            return new EditorPartCollection(editors);
        }

You probably already know this if you develop SharePoint webpart, but I didn’t and after nearly getting crazy because my text boxes displayed the wrong values in the editor part, I decided to share it.

 

Comments

No Comments

Need SharePoint Training? Attend a SharePoint Bootcamp!

Posts (c) their respective authors. Everything else (c) 2007 SharePoint Experts