Let’s say, you have a List with a People Picker column (Person or Group) on your site. Now, you need to add an event handler for new item add/update. Normally, if you go by the conventional way, you would get the following error:
Invalid data has been used to update the list item . The field you are trying to update may be read only.
I tried to figure out what exactly caused this error while I trying to set a people picker column property in my event handler programmatically. Afterwards, I found out that People Picker Column in a List is a read-only field. By Default, the read-only mode of this field remains true while we try to add/update it for a list item. So, how to overcome this problem? Well, it’s not that difficult. You just need to set the read-only mode of the people picker column to be “False” at first and after that, update the property of the people picker. After finishing everything, set the read-only mode of the field again to “True”. Here is an example how you can achieve this:
using (SPSite mySite = new SPSite(properties.SiteId)) { using (SPWeb myWeb = mySite.OpenWeb(properties.RelativeWebUrl)) { SPList currentList = myWeb.Lists[properties.ListId]; SPListItem currentitem = currentList.GetItemById(properties.ListItem.ID); myWeb.AllowUnsafeUpdates = true; ServerContext ospServerContext = ServerContext.GetContext(mySite); //Create a new UserProfileManager UserProfileManager pManager = new UserProfileManager(ospServerContext); //Get the User Profile for the current user UserProfile uProfile = pManager.GetUserProfile(currentitem["Title"].ToString()); //Set the read only mode of people picker column to FALSE currentitem.Fields["Direct Supervisor"].ReadOnlyField = false; if (uProfile["Manager"].Value != null) { string temp = @""+uProfile["Manager"].Value.ToString(); string temp1=temp.Replace("\\",@"\"); //Setting the property of people picker column currentitem["Direct Supervisor"] = myWeb.AllUsers[temp1].ID; } //Update List Item currentitem.Update(); //Update List currentList.Update(); //Set the read only mode to TRUE currentitem.Fields["Direct Supervisor"].ReadOnlyField = true; //Update the List item again currentitem.Update(); //update the List again currentList.Update(); } }
Inside the above code, you can see that first of all, I set the property of current site’s allowUnsafeUpdates to True which will allow you to change the read-only mode of a field. I have used the User Profile service to set the value of People Picker Control (in this case, the field name is “Direct Supervisor”). After setting the value of the field, I updated the List item and the list before changing back the read-only mode to be “True” again. Afterwards, I updated the current item and current list once again which ensures that the update will take place without any such error which happened previously.