1. 程式人生 > >SharePoint物件模式獲取“使用者或使用者組”欄的值

SharePoint物件模式獲取“使用者或使用者組”欄的值

harePoint的People Picker控制元件真的是非常好用的一個東東。
但是,如果您需要輸出某一個“使用者或使用者組”欄的值時,就顯得有點麻煩了。

  1. 如果您採用item["***"].ToString()這樣的形式的話,輸出的每一個人或組的資訊前都有N#這樣的符號。
    很顯然,很多時候採用這種方式時,我們不得不對字串進行分析並擷取。
  2. “使用者或使用者組”型別的在物件模型中,有其對應的型別: SPFieldUser,通過它,我們就可以獲取到某一個
    使用者或使用者組欄的物件模型了,如:SPFieldUser uField=item["***"] as SPFieldUser;
  3. “使用者或使用者組”中,您可以輸入使用者,也可以輸入使用者組
  4. “使用者或使用者組”型別欄的值的獲取實際上是通過SPFieldUserValueCollection和SPFieldUserValue來獲取的,
    而SPFieldUserValue指的是某一個人或某一個組。
  5. SPFieldUserValueCollection的獲取方法 : SPFieldUserValueCollection users=item["欄名"] as SPFieldUser
    ValueCollection.   那獲取SPFieldUserValue呢? 當然,您可以通過users的迭代來獲取,但是,某種情況下,這種方法行不通:當你沒有啟用“使用者或使用者 組”這一欄“允許多重選擇”時,通過上述方法獲取的users將為null,可能你會有如下的方法來獲取 SPFieldUserValue user=item["欄名"] as SPFieldUserValue。
    唉,我也通過這種方法來獲取,但是非常遺憾的是,系統友好的提示我:此路不通!
  6. 牢 騷:為什麼在“允許多重選擇”的情況下,通過SPFieldUserValueCollection users=item["欄名"] as SPFieldUserValueCollection就可以,而沒啟用的情況下用SPSPFieldUserValue user=item["欄名"] as SPFieldUserValue就行不通呢?這二個用法在針對是否啟用“允許多重選擇”下,是合情合理的啊?不管你怎麼想,它就是行不通。
  7. 實際上,在沒有“允許多重選擇”的情況下,您得通過SPFieldUserValue的建構函式來初始化一個物件,如:

    SPFieldUserValue usere = new SPFieldUserValue(web, item["欄目名"].ToString());
    夠折騰人的吧?

  8. 獲得了SPFieldUserValueCollection和SPFieldUserValue物件後,該如何獲取它裡面的使用者或使用者組呢?
    獲取使用者:使用SPFieldUserValue的User屬性。
    獲取使用者組:當SPFieldUserValue的User屬性為null的時候,通過web.SiteGroups.GetByID(SPFieldUserValue.LookupID)來獲取使用者組。

  9. 一波三折後,無論是獲取使用者或使用者組(包括獲取使用者組裡的使用者)應該就是手到擒來了。

  10. 附上一段從欄中獲取使用者的程式碼《沒有作相關的異常或效能優化處理》:

     1 public  List < SPUser >  GetUsersFromSPFieldUser(SPListItem item)
     2 {
     3   List < SPUser >  fUsers = new  List < SPUser > ();
     4   SPWeb web  =  item.ParentList.ParentWeb;
     5   SPFieldUser uField = item.Fields[ " 作者 " as  SPFieldUser;
     6    if (!uField.AllowMultipleValues)  // 允許多重選擇  7 {
     8      SPFieldUserValue userValue  = new  SPFieldUserValue(web, item[ " 作者 " ].ToString());
     9      fUsers.Add(userValue.User);
    10   }
    11    else 12    {
    13     SPFieldUserValueCollection userValues = item[ " 作者 " as  SPFieldUserValueCollection;
    14      foreach (SPFieldUserValue userValue  in  userValues)
    15      {
    16         if ( null != userValue.User)
    17         {
    18           fUsers.Add(userValue.User);
    19        }
    20         else 21         {
    22           SPGroup userGroup = web.SiteGroups.GetByID(userValue.LookupID);
    23           fUsers.AddRange(userGroup.Users);
    24        }
    25     }
    26   }
    27    return  fUsers;
    28 }