Wednesday, April 13, 2011

Sharepoint: how can i find all the pages that host a particular web part?

As the question says - is there a way to determine which pages are including my web part?

From stackoverflow
  • If you're looking for code, I've got something for you. If you'd like to find all Content Query web parts then you would call my code like this:

    FindWebPart("http://server.com/", "Microsoft.SharePoint.Publishing.WebControls.ContentByQueryWebPart");
    

    Here's the code:

    public static void FindWebPart(string siteCollectionUrl, string webPartName)
    {
        using (SPSite siteCollection = new SPSite(siteCollectionUrl))
        {
            using (SPWeb rootSite = siteCollection.OpenWeb())
            {
                FindWebPartHelper(rootSite, webPartName);
            }
        }
    }
    
    public static void FindWebPartHelper(SPWeb site, string webPartName)
    {
        // Search for web part in Pages document library
        SPList pagesList = null;
        try
        {
            pagesList = site.Lists["Pages"];
        }
        catch (ArgumentException)
        {
            // List not found
        }
    
        if (null != pagesList)
        {
            SPListItemCollection pages = pagesList.Items;
            foreach (SPListItem page in pages)
            {
                SPFile file = page.File;
                using (SPLimitedWebPartManager mgr = file.GetLimitedWebPartManager(PersonalizationScope.Shared))
                {
                    try
                    {
                        SPLimitedWebPartCollection webparts = mgr.WebParts;
                        foreach (System.Web.UI.WebControls.WebParts.WebPart wp in webparts)
                        {
                            // Here perform the webpart check
                            // For instance you could identify the web part by
                            // its class name
    
                            if (webPartName == wp.GetType().ToString())
                            {
                                // Found a match! Now do something...
                                Console.WriteLine("Found web part!");
                            }
                        }
                    }
                    finally
                    {
                        // Needs to be disposed
                        mgr.Web.Dispose();
                    }
    
                }
            }
        }
    
        // Check sub sites
        SPWebCollection subSites = site.Webs;
        foreach (SPWeb subSite in subSites)
        {
            try
            {
                FindWebPartHelper(subSite, webPartName);
            }
            finally
            {
                // Don't forget to dispose!
                subSite.Dispose();
            }
        }
    }
    

    Ofcourse you can make little changes to this code. Currently it does a string comparison, but it's easy to do it in a more typed way. Have fun!

    nailitdown : champion, thanks for the help
    LeonZandman : Glad to be of help :-)
    LeonZandman : By the way, shouldn't you mark my answer as being THE answer, by clicking the check mark?
    Scott Price : Please note, this code only checks pages in the "Pages" document library. Pages stored in other document libraries or the default.aspx pages for sites (yoursite.com/site/default.aspx) will not be checked without some modifications. Thanks for the post, was very helpful for me and saved me some time digging through the API.
    nailitdown : yes i should - apologies for the delay there stingray

0 comments:

Post a Comment

Note: Only a member of this blog may post a comment.