在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.这里来我们通过代码获取最后回复的人!
方法一:此方法循环量太大
如图:
在图中,我们只看到了创建者,最后更新的时间,等等,但是不知道谁是最后回复的人!而一般论坛都会显示为:最后回复某某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标签: