in

SharePoint Blogs

The Best Place for SharePoint-related Blogs

Ton Stegeman [MVP] weblog

August 2007 - Posts

  • 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.

     


Need SharePoint Training? Attend a SharePoint Bootcamp!

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