HOW TO: Programmatically modify values of people and groups column of type multi-value using Lists.asmx in SharePoint 2010
This blog post is a contribution from Bharat Rathod, an engineer with the SharePoint Developer Support team.
In this post, I’ll show you how to use UpdateListItems method of the Lists.asmx web service to modify a ListItem which has multi-value people and group column. Most of us tend to fall into trouble while creating the batch element.
Here’s the detailed description of the sample code.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
using System.Xml;
using Microsoft.SharePoint.SoapServer;
namespace TestProject
{
class Program
{
static void Main(string[] args)
{
using (SPSite osite = new SPSite("https://sp/"))
{
using (SPWeb oweb = osite.OpenWeb())
{
SPList mylist = oweb.Lists["TestList"];
SPListItem item = mylist.GetItemById(1);
// Get the user ID of the User whose value needs to be added to the column
SPUser user1 = oweb.AllUsers["contoso\\user1"];
int Id1 = user1.ID;
ListService.Lists list = new ListService.Lists();
list.UseDefaultCredentials = true;
XmlDocument doc = new System.Xml.XmlDocument();
XmlElement batchElement = doc.CreateElement("Batch");
batchElement.SetAttribute("OnError", "Continue");
batchElement.SetAttribute("ListVersion", "1");
batchElement.SetAttribute("ViewName", "");
batchElement.InnerXml = "<Method ID='1' Cmd='Update'>" +
"<Field Name='ID'>1</Field>" +
"<Field Name='Title'>Item1</Field>" +
"<Field Name='manyusers'>;#1;#Contoso\\spadmin;#9;#contoso\\user1;#</Field>" +
"</Method>";
try
{
list.UpdateListItems(mylist.ID.ToString(), batchElement);
}
catch (SoapServerException ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
}
}
One of the most important part of this code is creating the batch element. In order to add users to a multi-value people and group field, we need to get the UserID from the SPWeb object. In the code, I’ve used the following statements:
SPUser user1 = oweb.AllUsers["contoso\\user1"];
int Id1 = user1.ID;
This code finds out the user’s identifier (UserID) of whatever user you want to add to the multi-value field (in this case, it’s contoso\user1).
batchElement.InnerXml = "<Method ID='1' Cmd='Update'>" +
"<Field Name='ID'>1</Field>" +
"<Field Name='Title'>Item1</Field>" +
"<Field Name='manyusers'>;#1;#Contoso\\spadmin;#9;#contoso\\user1;#</Field>" +
"</Method>";
The above code snippet tries to add two users to the column named “manyusers”. Use the ;# symbols before every entity and then end the string with ;# again. One common mistake we tend to do is to miss out on the ;# towards the end of the string.
Try the above sample to get users added to a multi-value people and group field.
Hope this short blog post is of some help!