随笔-45  评论-9  文章-2 

使用代码管理SharePoint页面中的WebPart

SharePoint中的WebPart功能很强大,通过界面可以定制共享视图中的WebPart也可以定制个性化视图中的WebPart。

但是有的SharePoint项目可能需要通过feature向SharePoint的页面中添加WebPart,下面介绍如何实现通过代码管理SharePoint页面中的WebPart。

方案:通过SPSite->SPWeb->SPFolder得到SPFile,通过 SPFile.GetLimitedWebPartManager 方法获取SPWebPartManager(Provides a limited set of Web Part operations that can be performed in our object model scenarios when there is no HttpContext and no Page object is instantiated.),通过SPWebPartManager来操作页面中的WebPart,下面是示例代码:

//get the current web; not using "using" because we don't want to

//kill the web context for other controls that need it

SPWeb curWeb = SPContext.Current.Web;

   

//look to see if our code has already run

if (! curWeb.Properties.ContainsKey(KEY_CHK))

   

The next thing is to get a reference to the home page in the site:

//look for the default page so we can mess with the web parts

SPFile thePage = curWeb.RootFolder.Files["default.aspx"];

   

With the home page, you can get the web part manager for it:

//get the web part manager

SPLimitedWebPartManager theMan = thePage.GetLimitedWebPartManager

(System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared);

//create a hashtable to store our web parts

hshWp = new Hashtable();

   

foreach (WebPart wp in theMan.WebParts)

{

//close the welcome part; WebPartAction is a custom class

//I wrote to keep track of web parts and their properties

if (wp.GetType().Equals(typeof(PersonalWelcomeWebPart)))

hshWp.Add(wp.StorageKey.ToString(),

new WebPartAction(wp,

WebPartAction.ActionType.Delete));

//etc

}

//add a new ThisWeekInPictures web part

ThisWeekInPicturesWebPart wpPix = new ThisWeekInPicturesWebPart();

wpPix.ImageLibrary = "Shared Pictures";

wpPix.Title = "My Pictures";

   

//add it to the hash so it gets put in the page

hshWp.Add(Guid.NewGuid().ToString(),

new WebPartAction(wpPix, WebPartAction.ActionType.Add,

"MiddleRightZone", 10));

   

Finally, the code enumerates through the hashtable and makes all of the web part changes:

foreach (string key in hshWp.Keys)

{

WebPartAction wpa = (WebPartAction)hshWp[key];

   

switch (wpa.Action)

{

case WebPartAction.ActionType.Delete:

theMan.DeleteWebPart(wpa.wp);

break;

case WebPartAction.ActionType.Move:

theMan.MoveWebPart(wpa.wp, wpa.zoneID, wpa.zoneIndex);

theMan.SaveChanges(wpa.wp);

break;

case WebPartAction.ActionType.Add:

theMan.AddWebPart(wpa.wp, wpa.zoneID, wpa.zoneIndex);

break;

}

}

   

//look to see if our code has already run

if (! curWeb.Properties.ContainsKey(KEY_CHK))

//add our key to the property bag so we don't run

//our provisioning code again

curWeb.Properties.Add(KEY_CHK, "true");

curWeb.Properties.Update();

curWeb.AllowUnsafeUpdates = false;

posted on 2010-09-28 17:00 IORICC 阅读(...) 评论(...) 编辑 收藏