2009-03-11 16 views

Respuesta

15

Si buscas código, tengo algo para ti. Si desea encontrar todos los elementos web Consulta de contenido, entonces sería llamar a mi código como este:

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

Aquí está el código:

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(); 
     } 
    } 
} 

Por supuesto se puede hacer pequeños cambios en el código. Actualmente hace una comparación de cadenas, pero es fácil hacerlo de una manera más tipada. ¡Que te diviertas!

+0

campeón, gracias por la ayuda – nailitdown

+0

Me alegro de ser de ayuda :-) – LeonZandman

+0

Por cierto, ¿no debería marcar mi respuesta como la respuesta, haciendo clic en la marca de verificación? – LeonZandman

3

A modo de alternativa, si desea probar páginas de elementos web que incluye la página por defecto en los sitios de colaboración, puede utilizar el siguiente fragmento de código que utiliza la propiedad de archivos del objeto SPWeb:

private static void FindWebPart(string siteUrl, string webPartName) 
{ 
    using (var site = new SPSite(siteUrl)) 
    { 
     foreach (SPWeb web in site.AllWebs) 
     { 

      foreach (var file in web.Files.Cast<SPFile>().Where(file => file.Name.EndsWith("aspx"))) 
      { 
       FindWebPartOnPage(webPartName, file); 
      } 

      var pagesTemplateType = (SPListTemplateType)Enum.Parse(typeof(SPListTemplateType), "850"); 
      foreach (var documentLibrary in web.Lists.Cast<SPList>().Where(list => list.BaseTemplate == pagesTemplateType || (list.BaseTemplate == SPListTemplateType.DocumentLibrary && list.Title.Contains("Pages")))) 
      { 
       foreach (var file in documentLibrary.Items.Cast<SPListItem>().Where(item => item.File.Name.EndsWith("aspx")).Select(item => item.File)) 
       { 
        FindWebPartOnPage(webPartName, file); 
       } 
      } 

      web.Dispose(); 
     } 
    } 
} 

private static void FindWebPartOnPage(string webPartName, SPFile file) 
{ 
    using (var webPartManager = file.GetLimitedWebPartManager(PersonalizationScope.Shared)) 
    { 
     if (webPartManager.WebParts.Cast<WebPart>().Any(webPart => webPart.GetType().Name == webPartName)) 
     { 
      Console.WriteLine(file.ServerRelativeUrl); 
     } 

     webPartManager.Web.Dispose(); 
    } 
} 

Nota: la biblioteca de páginas creada por la función de publicación no tiene un valor BaseTemplate de SPListTemplateType.DocumentLibrary; en cambio, está representado por un valor "oculta" de 850.

Esto se llama una manera similar a la respuesta de LeonZandman, sin embargo, sólo el nombre de clase se utiliza para suministrar un partido:

FindWebPart("http://yoursite.com/", "MyWebPart"); 
Cuestiones relacionadas