关于CAML和用户类型字段的问题

beibeilong 2010-02-09 06:26:10
小弟是MOSS开发新手,目前在做一个页面,需要读取列表项的内容,其中遇到一个问题。

列表中有一个允许多选的用户字段,我用CAML语句读取后,用得到DataTable的方式,即result = detailList.GetItems(query).GetDataTable();得到一个数据表,

此时我去拿那个用户字段的值发现和预期的不一样。
一般来说应该是如下格式 ID1;#Name1;#ID2;#Name2;#ID3;#Name3...
但是我拿到的是这样的 Name1;#ID2;#Name2;#ID3;#Name3....
其中ID1不见了,

如果用Item[“字段名”]的方式获取的话,返回值好像没有问题。

请问在写这样的Caml时是不是有什么需要注意的嘛?
...全文
216 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
beibeilong 2010-02-10
  • 打赏
  • 举报
回复
刚才查看了一下MicroSoft.SharePoint.dll,不知道是不是微软的一个bug。
代码如下
我查看的是SPListItemCollection对象的GetDataTable方法
其中在取值的时候有这么一段
。。。。
。。。。
switch (type2)
{
case SPFieldType.Lookup:
case SPFieldType.User:
str4 = Convert.ToString(obj2);
num5 = SPUtility.StsBinaryCompareIndexOf(str4, ";#");
if (num5 <= 0)
{
break;
}
goto Label_0417;
}
Label_0417:
row[num2] = str4.Substring(num5 + 2);
goto Label_007C;
。。。
。。。

比较感兴趣的是 num5 = SPUtility.StsBinaryCompareIndexOf(str4, ";#");
这个是取;#分隔符在字符串中的位置
例如我选择了2个用户,ID和Name分别为 3, User1和5,User2
那么这个时候str4应该就是 3;#User1;#5;#User2
num5得到的结果就是1

那么row[num2] = str4.Substring(num5 + 2);
此时row[num2]的结果应该就是User1;#5;#User2了,把第一个ID给截掉了。

-_-!
beibeilong 2010-02-10
  • 打赏
  • 举报
回复
感谢各位回答,不过好像都没答到点上啊

我生成的CAML语句应该没问题,我是用SPList.GetItems(SPQuery).GetDataTable()来得到一个DataTable,在SPList.GetItems(SPQuery)这个过程中返回的SPListItemCollection我也查看过,是我想要的内容,

但是GetDataTable后就发现, 那个用户字段的值和预期的不一样。
一般来说应该是如下格式 ID1;#Name1;#ID2;#Name2;#ID3;#Name3...
但是我拿到的是这样的 Name1;#ID2;#Name2;#ID3;#Name3....
其中ID1不见了


yuanyuyuyu 2010-02-10
  • 打赏
  • 举报
回复
你要取到多选的值?

列出以下您的CAML语句看看
forum2621 2010-02-10
  • 打赏
  • 举报
回复
引用 4 楼 forum2621 的回复:
我刚试了下,拿到的值格式是:;#value1;#value2;#value3;#

MultiChoice 字段拿到值的格式。(可以参考SPFieldMultiChoice,SPFieldMultiChoiceValue)
另外,ID是单独的啊,可以取到。
forum2621 2010-02-10
  • 打赏
  • 举报
回复
我刚试了下,拿到的值格式是:;#value1;#value2;#value3;#
forum2621 2010-02-10
  • 打赏
  • 举报
回复
用caml生成软件直接生成,然后自己改改(U2U CMAL Query Build)
可以参考 http://www.cnblogs.com/chenxizhang/archive/2009/10/23/1588415.html

CAML官网参考:http://msdn.microsoft.com/en-us/library/ms426449.aspx

sdenli 2010-02-10
  • 打赏
  • 举报
回复
I wonder whether the mutli-choice field is a look up type
forum2621 2010-02-10
  • 打赏
  • 举报
回复
可以自己写个方法转换下,有好的方法楼下继续
forum2621 2010-02-10
  • 打赏
  • 举报
回复
引用 10 楼 beibeilong 的回复:
引用 9 楼 forum2621 的回复:
引用 7 楼 beibeilong 的回复:感谢各位回答,不过好像都没答到点上啊 我生成的CAML语句应该没问题,我是用SPList.GetItems(SPQuery).GetDataTable()来得到一个DataTable,在SPList.GetItems(SPQuery)这个过程中返回的SPListItemCollection我也查看过,是我想要的内容, 但是GetDataTable后就发现, 那个用户字段的值和预期的不一样。 一般来说应该是如下格式 ID1;#Name1;#ID2;#Name2;#ID3;#Name3... 但是我拿到的是这样的  Name1;#ID2;#Name2;#ID3;#Name3.... 其中ID1不见了


你可以把你代码写上来呗。
我用SPList.GetItems(SPQuery).GetDataTable()绑定Gridview,查看到的数据没什么问题啊
这位兄弟,你有没有测试过创建一个允许多选的用户类型字段,并且输入多个用户后,再用GetDataTable方式返回数据源绑定到GridView。此时第一个用户的ID已经被截断了。
而且从SharePoint的代码中发现不进入User字段,允许多选的Lookup类型字段应该也是这样的情况。
搜了一下网络,发现有人也发现了同样的问题,请看链接
http://www.fftf.org/news/Mar07feed/SPListItemCollectionGetDataTable_Bug.rss.html



不好意思,没看清楚,多选用户字段是有这个问题的
beibeilong 2010-02-10
  • 打赏
  • 举报
回复
引用 9 楼 forum2621 的回复:
引用 7 楼 beibeilong 的回复:感谢各位回答,不过好像都没答到点上啊 我生成的CAML语句应该没问题,我是用SPList.GetItems(SPQuery).GetDataTable()来得到一个DataTable,在SPList.GetItems(SPQuery)这个过程中返回的SPListItemCollection我也查看过,是我想要的内容, 但是GetDataTable后就发现, 那个用户字段的值和预期的不一样。 一般来说应该是如下格式 ID1;#Name1;#ID2;#Name2;#ID3;#Name3... 但是我拿到的是这样的  Name1;#ID2;#Name2;#ID3;#Name3.... 其中ID1不见了


你可以把你代码写上来呗。
我用SPList.GetItems(SPQuery).GetDataTable()绑定Gridview,查看到的数据没什么问题啊

这位兄弟,你有没有测试过创建一个允许多选的用户类型字段,并且输入多个用户后,再用GetDataTable方式返回数据源绑定到GridView。此时第一个用户的ID已经被截断了。
而且从SharePoint的代码中发现不进入User字段,允许多选的Lookup类型字段应该也是这样的情况。
搜了一下网络,发现有人也发现了同样的问题,请看链接
http://www.fftf.org/news/Mar07feed/SPListItemCollectionGetDataTable_Bug.rss.html
forum2621 2010-02-10
  • 打赏
  • 举报
回复
引用 7 楼 beibeilong 的回复:
感谢各位回答,不过好像都没答到点上啊

我生成的CAML语句应该没问题,我是用SPList.GetItems(SPQuery).GetDataTable()来得到一个DataTable,在SPList.GetItems(SPQuery)这个过程中返回的SPListItemCollection我也查看过,是我想要的内容,

但是GetDataTable后就发现, 那个用户字段的值和预期的不一样。
一般来说应该是如下格式 ID1;#Name1;#ID2;#Name2;#ID3;#Name3...
但是我拿到的是这样的  Name1;#ID2;#Name2;#ID3;#Name3....
其中ID1不见了



你可以把你代码写上来呗。
我用SPList.GetItems(SPQuery).GetDataTable()绑定Gridview,查看到的数据没什么问题啊
Justin-Liu 2010-02-09
  • 打赏
  • 举报
回复
mark 我不会 帮顶

3,242

社区成员

发帖
与我相关
我的任务
社区描述
企业开发 SharePoint
社区管理员
  • SharePoint社区
  • 霖雨
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧