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
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