您的位置:首页 > 运维架构

在sharepoint中获取Team Discussion中每个Topic 最后回复信息

2010-11-18 16:56 176 查看
我在MSDN发的帖子:http://social.microsoft.com/Forums/zh-CN/partnercndevsharepoint/thread/fc8b39d2-fd5d-49b7-877c-ae67d87e2f6b

如图:



在图中,我们只看到了创建者,最后更新的时间,等等,但是不知道谁是最后回复的人!而一般论坛都会显示为:最后回复某某11/16/2010/5:49.这里来我们通过代码获取最后回复的人!

方法一:此方法循环量太大

protectedvoidPage_Load(objectsender,EventArgse)
{
GetDisBoard();
}

publicvoidGetDisBoard()
{
using(SPSitesite=newSPSite("http://moss:5000"))
using(SPWebweb=site.RootWeb)
{
SPListlist=web.Lists["TeamDiscussion"];
//获取帖子[注意:这里list.Folders才是帖子,而不是Items]
foreach(SPListItemspListIteminlist.Folders)
{
Response.Write(GetLastPost(spListItem.ID));
Response.Write("<p></p>");

}

}
}

publicstringGetLastPost(inttopicID)
{
List<string>replies=newList<string>();
using(SPSitesite=newSPSite("http://moss:5000"))
using(SPWebweb=site.RootWeb)
{

SPListlist=web.Lists["TeamDiscussion"];
//Items:包含了帖子和回复
foreach(SPListItemiteminlist.Items)
{
//获取帖子的回复ParentFolderId指该回复的帖子ID
if(item["ParentFolderId"]+""==topicID+"")
{
replies.Add("Lastreplyby"+item.Fields["CreatedBy"].GetFieldValueAsText(item["CreatedBy"])+
"on"+item["Modified"]);
}
}
}
stringlastReply="Noonereply";
if(replies.Count>0)
{
lastReply=replies[replies.Count-1];
}
returnlastReply;
}



2.该方法循环次数有所减少,但是SPSiteDataQuery对象执行起来也比较耗时!

publicvoidGetQuery(stringDiscussionLastUpdated)
{
using(SPSitesite=newSPSite("http://moss:5000"))
using(SPWebweb=site.RootWeb)
{
SPSiteDataQueryquery=newSPSiteDataQuery();
query.Webs="<WebsScope=\"SiteCollection\">";
//108表示Discussionhttp://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsitedataquery.lists.aspxquery.Lists="<ListsServerTemplate=\"108\"/>";
//query.ViewFields=
//"<FieldRefName=\"Title\"/><FieldRefName=\"Created\"/><FieldRefName=\"DiscussionLastUpdated\"/>";
query.ViewFields="<FieldRefName=\"Author\"/>";
//中国时间要–8这里出来的格式为:2010-11-17T01:49:01Z
DiscussionLastUpdated=SPUtility.FormatDate(web,Convert.ToDateTime(DiscussionLastUpdated).AddHours(-8),SPDateFormat.ISO8601);
//DiscussionLastUpdated为最后回复的时间,即最后回复的创建时间
query.Query=
@"<Where><Eq><FieldRefName='Created'/><ValueIncludeTimeValue='TRUE'Type='DateTime'>"+
DiscussionLastUpdated+"</Value></Eq></Where>";
DataTabledt=web.GetSiteData(query);
foreach(DataRowrowindt.Rows)
{
Response.Write(row["Author"]+""+row["Body"]+"Lastby:"+row["DiscussionLastUpdated"]+
"<br/>");
Response.Write("<hrstyle='color=red'>");
}
}
}
publicvoidGetDisBoard()
{
using(SPSitesite=newSPSite("http://moss:5000"))
using(SPWebweb=site.RootWeb)
{
SPListlist=web.Lists["TeamDiscussion"];
//获取帖子
foreach(SPListItemspListIteminlist.Folders)
{
GetQuery(spListItem["DiscussionLastUpdated"]+"");
}
}
}
期待更好的方法出来!这个功能也许意义不大,但是通过代码可以了解到一些对象的使用!
今天在帖子:http://social.microsoft.com/Forums/zh-CN/sharepointwebpartzhchs/thread/afcb3aab-0238-47bd-968a-125cf85dacf3
MVPErucy回复了我,感谢Erucy提供的帮助.

你可以使用SPQuery对象,这个对象有一个Folder属性,会限制查询的范围当你找某一个主题最新帖子的时候(主题本质上是一个文件夹)你就可以把这个文件夹作为参数设置到SPQuery上面然后:query.Query="<OrderBy><FieldRefName='Created'Ascending='FALSE'/></OrderBy>";//按创建时间逆序排序query.RowLimit=1;//只取最新的一个然后再list.GetItems(query)就可以了,如果有回复的话就会取到最新一个回复的item,后面的你应该就会了
code:已通过测试

using(SPSitesite=newSPSite("http://jianghao:5000"))
using(SPWebweb=site.RootWeb)
{
SPListlist=web.Lists["TeamDiscussion"];

//获取帖子
SPQueryquery;
foreach(SPListItemspListIteminlist.Folders)
{
query=newSPQuery();
query.Query="<OrderBy><FieldRefName='Created'Ascending='FALSE'/></OrderBy>";//倒序
query.RowLimit=1;//取一个
query.Folder=spListItem.Folder;//关键代码,设置Folder属性
SPListItemCollectionreplies=list.GetItems(query);
Response.Write(replies.Count==0
?"Noreply<br/>"
:replies[0].Fields["CreatedBy"].GetFieldValueAsText(replies[0]["CreatedBy"])+"<br/>");
}
}
相关文章:Sharepoint中用编码的方式实现Discussions的创建、删除、回复

Technorati标签:sharepoint,discussion
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航