0

SharePoint2007AfterPropertiesで苦労しています。数人を追加できる人入力フィールドがあります。

ItemUpdatingイベントで、どのユーザーが追加、削除、または同じままであるかを判別する必要があります。

残念ながら、これは非常に困難になります。これは、手付かずのユーザーのIDがAfterPropertiesで-1になり、SPFieldUserValueCollectionを使用してユーザーを見つけることができないためです。

例。properties.ListItem ["AssignedTo"]。ToString()は次のことを示しています。

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

properties.AfterProperties ["AssignedTo"]。ToString()は次のことを示しています。

-1;#domain \ user1;#-1; #domain \ user2;#3;#domain \user3<-ユーザーを追加しました

削除および追加されたユーザーを判別するために、次のコードを使用することを計画しました。

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]);
   }
} 

AfterPropertiesが正しいlookupidを表示するようにアーカイブするにはどうすればよいですか?

4

1 に答える 1

0

自分で問題を解決しました。SPFieldUserCollectionを使用する代わりに、リストを使用して、文字列からすべての情報を自分で解析しようとしています。

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)));
                }
            }
        }
    }
于 2010-07-29T14:56:55.437 に答える