In a new example of what I call "Guerrilla Coding" I had a couple of hours to develop a little program to copy hundreds of webpart pages full of ListViewWebparts, each one with its own custom view.
I don't know if you feel the same, but I start to tremble every time I have to touch anything related to the ListViewWebpart
The ListViewWebparts create in the parent list a hidden view when we customize their view. This means that if you want to copy the webparts to a new site you'll have to copy the views from the parent list to its destination equivalent, I don't think I'm explaining my point well... I'd better paste the code...
What I do in this code snippet is copying the webparts from every origin file to the destination one giving them a special treatment if they are LisvViewWebpart
which is enough for the application I need.
private static void CopyWebParts(SPFile origFile, SPFile destFile)
{
SPLimitedWebPartManager origWpm = origFile.GetLimitedWebPartManager(PersonalizationScope.Shared);
SPLimitedWebPartManager destWpm = destFile.GetLimitedWebPartManager(PersonalizationScope.Shared);
DeleteWebparts(destWpm);
foreach (Microsoft.SharePoint.WebPartPages.WebPart webpart in origWpm.WebParts)
{
Microsoft.SharePoint.WebPartPages.WebPart newWp;
if (webpart is ListViewWebPart)
newWp = UpdateListViewWebPart(webpart as ListViewWebPart, origFile.GetWeb(), destFile.GetWeb());
else
newWp = webpart;
destWpm.AddWebPart(newWp, Common.ConvertToString(newWp.ZoneID), newWp.ZoneIndex);
}
try
{
destFile.Publish("Added Web Parts");
destFile.Approve("Web Part additions approved");
}
catch { }
}
private static ListViewWebPart UpdateListViewWebPart(ListViewWebPart webpart, SPWeb origWeb, SPWeb destWeb)
{
ListViewWebPart newWebPart = webpart; //yeah I know.
string oldListName = webpart.ListName;
string oldViewGuid = webpart.ViewGuid;
SPList OrigList = origWeb.Lists.GetList(new Guid(oldListName), true);
SPList DestList = destWeb.Lists[OrigList.Title];
SPView OrigView = OrigList.GetView(new Guid(oldViewGuid));
SPView DestView = DestList.Views.Add(string.Empty, OrigView.ViewFields.ToStringCollection(), OrigView.Query,
OrigView.RowLimit, OrigView.Paged, OrigView.DefaultView);
DestView.Hidden = OrigView.Hidden;
DestView.Scope = OrigView.Scope;
DestView.ApplyStyle(destWeb.ViewStyles.StyleByID(Convert.ToInt32(OrigView.StyleID)));
DestView.Update();
newWebPart.ViewGuid = DestView.ID.ToString("B").ToUpper();
newWebPart.ListName = destWeb.Lists[OrigList.Title].ID.ToString("B").ToUpper();
return newWebPart;
}
And against all odds it worked, I hope I don't have to deal with this webparts for a while.
No comments:
Post a Comment