问题总结(一)使用代码调整SharePoint WebPart 视图和列表菜单
最近在做项目的过程中,遇到个问题,创建一个SharePoint站点,在站点首页(default.aspx)添加了几个列表WebPart(ListViewWebPart),WebPart选用了自定义的视图,并将列表WebPart工具栏类型设置成“没有工具栏”,整体的效果如下图:

接着将SharePoint站点另存成模板,然后基于此模板创建个新站点,结果新站点创建完成后,原来模板中首页WebPart所应用的视图和工具栏类型都恢复到默认的样子,如下图:

这样下来又要从头到尾的手动调整WebPart的样式,想想有些崩溃。这样的站点要通过程序创建200多个,手动调整起来只能吐血了。于是开始研究如何通过代码来完成调整的任务,让他创建完站点以后自动样式调整。基本的实现思路如下:
1、首先找到首页(default.aspx)的WebPart管理对象(SPLimitedWebPartManager).
2、用SPLimitedWebPartManager搞到页面里所有的WebPart。
3、过滤掉非列表WebPart(ListViewWebPart)。
4、剩下的开始逐一处理,先调整视图,在调整它的工具栏类型。
5、最后保存调整的结果。
实现的代码如下:
1

/**//// <summary>2
/// 修改首页WerPart样式及视图3
/// </summary>4
/// <param name="currentWeb">大客户站点</param>5
public void ChangeWebPartLayout(SPWeb currentWeb)6

{7
SPSecurity.RunWithElevatedPrivileges(delegate()8

{9
SPSite siteClt = new SPSite(currentWeb.Site.ID);10
SPWeb managementWeb = siteClt.AllWebs["ITSImportanceCustomerManagement"]; //需要以用Mode中的变量11
SPWeb customWeb = managementWeb.Webs[currentWeb.ID];12

13
//客户年度重点项目计划14
SPList ITSKeyProjectPlanList = this.GetListFromUrl(customWeb, "ITSKeyProjectPlan");15
//重点项目追踪16
SPList ITSKeyProjectTrackingList = this.GetListFromUrl(customWeb, "ITSKeyProjectTracking");17
//客户年度普通项目计划18
SPList ITSGeneralProjectPlanList = this.GetListFromUrl(customWeb, "ITSGeneralProjectPlan");19
//普通项目追踪20
SPList ITSGeneralProjectTrackingList = this.GetListFromUrl(customWeb, "ITSGeneralProjectTracking");21
//客户动态追踪22
SPList ITSClientDynamicTrackingList = this.GetListFromUrl(customWeb, "ITSClientDynamicTracking");23
//客户接触记录24
SPList ITSClientContactRecordList = this.GetListFromUrl(customWeb, "ITSClientContactRecord");25
//大客户团队信息26
SPList ITSClientTeamList = this.GetListFromUrl(customWeb, "ITSClientTeam");27
//大客户团队工作28
SPList ITSClientTeamWorkLogList = this.GetListFromUrl(customWeb, "ITSClientTeamWorkLog");29

30
SPLimitedWebPartManager webPartManager = customWeb.GetLimitedWebPartManager("default.aspx", PersonalizationScope.Shared);31

32
customWeb.AllowUnsafeUpdates = true;33
foreach (System.Web.UI.WebControls.WebParts.WebPart wp in webPartManager.WebParts)34

{35
if (wp is ListViewWebPart)36

{37
ListViewWebPart lv = wp as ListViewWebPart;38
switch (lv.DisplayTitle)39

{40
//重点项目计划41
case "客户年度重点项目计划":42

{43
this.SaveWebPartChanges(ITSKeyProjectPlanList, lv, webPartManager);44
}45
break;46
//重点项目追踪47
case "重点项目追踪":48

{49
this.SaveWebPartChanges(ITSKeyProjectTrackingList, lv, webPartManager);50
}51
break;52
//普通项目计划53
case "客户年度普通项目计划":54

{55
this.SaveWebPartChanges(ITSGeneralProjectPlanList, lv, webPartManager);56
}57
break;58
//普通项目追踪59
case "普通项目追踪":60

{61
this.SaveWebPartChanges(ITSGeneralProjectTrackingList, lv, webPartManager);62
}63
break;64
//客户动态追踪65
case "客户动态追踪":66

{67
this.SaveWebPartChanges(ITSClientDynamicTrackingList, lv, webPartManager);68
}69
break;70
//客户接触记录71
case "客户接触记录":72

{73
this.SaveWebPartChanges(ITSClientContactRecordList, lv, webPartManager);74
}75
break;76
//客户团队信息77
case "大客户团队信息":78

{79
this.SaveWebPartChanges(ITSClientTeamList, lv, webPartManager);80
}81
break;82
//客户团队工作83
case "大客户团队工作":84

{85
this.SaveWebPartChanges(ITSClientTeamWorkLogList, lv, webPartManager);86
}87
break;88
}89
}90
}91
customWeb.Update();92
customWeb.AllowUnsafeUpdates = false;93
});94
}95

96

/**//// <summary>97
/// 得到当前站点指定URL地址的列表98
/// </summary>99
/// <param name="web">列表所在站点</param>100
/// <param name="listShortUrl">列表URL名(例:ITSKeyProjectPlan)</param>101
/// <returns></returns>102
public SPList GetListFromUrl(SPWeb web, string listShortUrl)103

{104
SPList list = null;105
if ((web != null) && !string.IsNullOrEmpty(listShortUrl)) 106
list = web.GetListFromUrl(string.Format("/ITSImportanceCustomerManagement/{0}/Lists/{1}/AllItems.aspx",web.Name,listShortUrl));107
return list;108
}109

110

/**//// <summary>111
/// 保存对ListViewWebPart的修改。112
/// 此方法只为ChangeWebPartLayout(SPWeb currentWeb)方法提供服务。113
/// </summary>114
/// <param name="list">ListViewWebPart所引用的列表</param>115
/// <param name="lv">ListViewWebPart对象</param>116
/// <param name="webPartManager">当前页面WebPartManager对象</param>117
private void SaveWebPartChanges(SPList list,ListViewWebPart lv,SPLimitedWebPartManager webPartManager)118

{119
SPView homeView = list.Views["首页视图"];120
//得到 客户重点项目计划WebPart当前使用的视图121
SPView lvView = list.Views[new Guid(lv.ViewGuid)];122
//清除视图所有的显示栏123
lvView.ViewFields.DeleteAll();124
foreach (string field in homeView.ViewFields)125
lvView.ViewFields.Add(field);126
lvView.GroupByHeader = homeView.GroupByHeader;127
lvView.GroupByFooter = homeView.GroupByFooter;128
lvView.RowLimit = homeView.RowLimit;129
lvView.Query = homeView.Query;130
lvView.ViewEmpty = homeView.ViewEmpty;131
lvView.ViewHeader = homeView.ViewHeader;132
lvView.ViewFooter = homeView.ViewFooter;133
lvView.Scope = homeView.Scope;134
lvView.Update();135

136
//代码去除视图的工具栏137
System.Reflection.PropertyInfo ViewProp = lv.GetType().GetProperty("View", BindingFlags.NonPublic | BindingFlags.Instance);138
SPView spView = ViewProp.GetValue(lv, null) as SPView;139
string txt = spView.SchemaXml;140
System.Reflection.PropertyInfo nodeProp = spView.GetType().GetProperty("Node", BindingFlags.NonPublic | BindingFlags.Instance);141
XmlNode node = nodeProp.GetValue(spView, null) as XmlNode;142
XmlNode tBarNode = node.SelectSingleNode("Toolbar");143
if (tBarNode != null)144

{145
XmlAttribute typeNode = tBarNode.Attributes["Type"];146
tBarNode.RemoveAll();147
tBarNode.Attributes.Append(typeNode);148
typeNode.Value = "None";149
}150
spView.Update();151

152
webPartManager.SaveChanges(lv);153
}
搞个命令行程序测试一下:
class Program
{
static void Main(string[] args)
{
SPSite site = new SPSite("http://liust-server:100");
SPWeb icmWeb = site.AllWebs["ITSImportanceCustomerManagement"];
SPWeb customWeb = icmWeb.Webs["DKHWebTemplate"];
Program p = new Program();
p.ChangeWebPartLayout(customWeb);
Console.Write("ok");
Console.ReadKey();
}
}
至此,这个问题就搞定了,可以休息一下了。

浙公网安备 33010602011771号