Search code examples
sharepointinputuserid

SharePoint 2007: AfterProperties of person input field shows always -1 as lookupid


I'm struggling with the SharePoint 2007 AfterProperties. I've a people input field, where several people can be added.

On the ItemUpdating event I now need to determine which users were added, removed or stayed the same.

Unfortunately this becomes quit difficult, as the id of the untouched users turns to -1 in the AfterProperties, so that I cant not use SPFieldUserValueCollection to find the user.

An example. properties.ListItem["AssignedTo"].ToString() shows:

1;#domain\user1;#2;#domain\user2

properties.AfterProperties["AssignedTo"].ToString() shows:

-1;#domain\user1;#-1;#domain\user2;#3;#domain\user3 <-Added a user

I planned to use following code, to determine removed and added users:

foreach (SPFieldUserValue oldUser in oldUserCollection)
{
   if (newUserCollection.Find(x => x.LookupId == oldUser.LookupId) == null)
   {
      RemoveRole(aListItem, oldUser.User, roleDefCollection[workerRoleName]);
   }
}

foreach (SPFieldUserValue newUser in newUserCollection)
{
   if(oldUserCollection.Find(x => x.User.LoginName == newUser.LookupValue) == null)
   {
      AddRole(aListItem, newUser.User, roleDefCollection[workerRoleName]);
   }
} 

How can I archive, that the AfterProperties show the right lookupid?


Solution

  • Solved the problem by myself. Instead of using the SPFieldUserCollection I'm now using a list and try to parse all the information by myself out of the string.

    Regex reg = new Regex(@"\;\#");
    string[] usernameParts = reg.Split(usernames);
    List<SPUser> list = new List<SPUser>();
    int id;
    
    foreach (string s in usernameParts)
        {
            if (!string.IsNullOrEmpty(s))
            {
                if (!Int32.TryParse(s, out id))
                {
                    if (list.Find(x => x.ID == spweb.Users[s].ID) == null)
                        list.Add(spweb.Users[s]);
                }
                else
                {
                    if (Convert.ToInt32(s) != -1)
                    {
                        if (list.Find(x => x.ID == Convert.ToInt32(s)) == null)
                            list.Add(spweb.Users.GetByID(Convert.ToInt32(s)));
                    }
                }
            }
        }