views:

40

answers:

1

Hi,

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?

A: 

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)));
                }
            }
        }
    }
yan.kun