harePoint的People Picker控件真的是非常好用的一个东东。
但是,如果您需要输出某一个“用户或用户组”栏的值时,就显得有点麻烦了。
- 如果您采用item["***"].ToString()这样的形式的话,输出的每一个人或组的信息前都有N#这样的符号。
很显然,很多时候采用这种方式时,我们不得不对字符串进行分析并截取。 - “用户或用户组”类型的在对象模型中,有其对应的类型: SPFieldUser,通过它,我们就可以获取到某一个
用户或用户组栏的对象模型了,如:SPFieldUser uField=item["***"] as SPFieldUser; - “用户或用户组”中,您可以输入用户,也可以输入用户组
- “用户或用户组”类型栏的值的获取实际上是通过SPFieldUserValueCollection和SPFieldUserValue来获取的,
而SPFieldUserValue指的是某一个人或某一个组。 - SPFieldUserValueCollection的获取方法 : SPFieldUserValueCollection users=item["栏名"] as SPFieldUser
ValueCollection.那获取SPFieldUserValue呢? 当然,您可以通过users的迭代来获取,但是,某种情况下,这种方法行不通:当你没有启用“用户或用户
组”这一栏“允许多重选择”时,通过上述方法获取的users将为null,可能你会有如下的方法来获取 SPFieldUserValue
user=item["栏名"] as SPFieldUserValue。
唉,我也通过这种方法来获取,但是非常遗憾的是,系统友好的提示我:此路不通! - 牢
骚:为什么在“允许多重选择”的情况下,通过SPFieldUserValueCollection users=item["栏名"] as
SPFieldUserValueCollection就可以,而没启用的情况下用SPSPFieldUserValue
user=item["栏名"] as
SPFieldUserValue就行不通呢?这二个用法在针对是否启用“允许多重选择”下,是合情合理的啊?不管你怎么想,它就是行不通。 - 实际上,在没有“允许多重选择”的情况下,您得通过SPFieldUserValue的构造函数来初始化一个对象,如:
SPFieldUserValue usere = new SPFieldUserValue(web, item["栏目名"].ToString());
够折腾人的吧? -
获得了SPFieldUserValueCollection和SPFieldUserValue对象后,该如何获取它里面的用户或用户组呢?
获取用户:使用SPFieldUserValue的User属性。
获取用户组:当SPFieldUserValue的User属性为null的时候,通过web.SiteGroups.GetByID(SPFieldUserValue.LookupID)来获取用户组。 -
一波三折后,无论是获取用户或用户组(包括获取用户组里的用户)应该就是手到擒来了。
-
附上一段从栏中获取用户的代码《没有作相关的异常或性能优化处理》:
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
}