Cross sitecollection ListView Webpart


Cross sitecollection ListView Webpart

Out of the box list view web part does not support lists that are contained in a different site collection. In this post I will show you how you can write a simple web part that will allow cross site collection list support.

Within the custom web part I’m leveraging ListViewByQuery control that is contained within the “Microsoft.SharePoint.WebControls” namespace in assembly “Microsoft.SharePoint.dll”

Couple of things about “ListViewByQuery” control

  • you must set “List” and “Query” properties for this control
  • You will get a “missing list” exception or something like that if you don’t set “ViewFields” property for the Query
  • SPQuery should be instantiated with a View, otherwise you will get a blank page (If you instantiate SPQuery with a view you do not need to specify “ViewFields” property although MSDN documentation states different)

My custom web part has following properties defined

SiteUrl: if the list is in different site collection, set site collection URL

ViewName: List View Name to be used

SourceList: Source List to Query

In the overriden CreateChildControls method of web part new up an instance of “ListViewControl” and set List and Query properties and add to the controls collection. If a site url was not specified, we assume the list is contained within the current web context, also if a view name was specified through properties, we are using that when creating SPQuery object, other wise default view on the list is used.

 

   1: protected override void CreateChildControls()
   2: {
   3:     base.CreateChildControls();
   4:     SPSite site = null ;
   5:     SPWeb web = null ;
   6:     Boolean disposeSPSite = false ;
   7:     try
   8:     {
   9:         if (this.SourceList != string.Empty && this.SourceList != string.Empty)
  10:         {
  11:             viewByQuery = new ListViewByQuery();
  12:             if(this.SiteUrl != null && this.SiteUrl != string.Empty)
  13:             {
  14:                 site = new SPSite(this.SiteUrl);
  15:                 disposeSPSite = true ;
  16:             }
  17:             else
  18:             {
  19:                 site = SPContext.Current.Site ;
  20:             }
  21:             web = site.OpenWeb();
  22:             SPList sourceList = web.Lists[this.SourceList];
  23:             viewByQuery.List = sourceList;
  24:             SPQuery query = null;
  25:             if (CheckIfViewExists(viewByQuery.List))
  26:             {
  27:                 //use the view specified in webpart property
  28:                 query = new SPQuery(viewByQuery.List.Views[this.ViewName]);
  29:             }
  30:             else
  31:             {
  32:                 //use default view to initialized
  33:                 query = new SPQuery(viewByQuery.List.DefaultView);
  34:             }
  35:             viewByQuery.Query = query;
  36:             viewByQuery.DisableFilter = this.DisableFilter;
  37:             viewByQuery.DisableSort = this.DisableSort;
  38:             this.Controls.Add(viewByQuery);
  39:         }
  40:         else
  41:         {
  42:             encodedLiteral = new EncodedLiteral();
  43:             encodedLiteral.Text = "This webpart is not configured.";
  44:             this.Controls.Add(encodedLiteral);
  45:         }
  46:     }
  47:     finally
  48:     {
  49:         if(disposeSPSite)
  50:         {
  51:             ((IDisposable)site).Dispose();
  52:             ((IDisposable)web).Dispose();
  53:         }
  54:     }
  55: }

Custom Web Part Configuration View

crosssistelist3

Here is a view of the web part showing documents from document library named “Documents” contained within a different site collection

crosssitelist4

All Items view of document library named “Documents” in root site collection of the web app

crossitelist1

 

<Update Date=”10/10/2010″>

I recently received comment about not being able to see folder, try setting the ViewAttributes property for the SPQuery object

Ex:

query.ViewAttributes = “Scope=\”Recursive\””;

</Update>

 

 

 

Code from web part project, if you find it useful please leave a comment here…

   1: #region using statements
   2: using System;
   3: using System.Runtime.InteropServices;
   4: using System.Web;
   5: using System.Web.UI;
   6: using System.Web.UI.WebControls;
   7: using System.Web.UI.WebControls.WebParts;
   8: using System.Xml.Serialization;
   9: using System.Text;
  10:  
  11:  
  12: using Microsoft.SharePoint;
  13: using Microsoft.SharePoint.WebControls;
  14: using Microsoft.SharePoint.WebPartPages;
  15: #endregion
  16:  
  17: namespace Foo
  18: {
  19:     [Guid("9558189B-CD3B-481b-9B06-AE434CF47B18")]
  20:     public class CrossSiteCollectionListViewWebPart : System.Web.UI.WebControls.WebParts.WebPart
  21:     {
  22:         #region protected child control variable definitions
  23:         protected ListViewByQuery viewByQuery = null;
  24:         protected EncodedLiteral encodedLiteral = null;
  25:         #endregion
  26:         
  27:         #region webpart properties
  28:         /// <summary>
  29:         /// 
  30:         /// </summary>
  31:         private string viewNameField = string.Empty;
  32:         [Personalizable(), WebPartStorage(Storage.Shared), WebBrowsable(),
  33:          WebDisplayName("View Name"), WebDescription("View Name")]
  34:         public string ViewName
  35:         {
  36:             get
  37:             {
  38:                 return this.viewNameField;
  39:             }
  40:             set
  41:             {
  42:                 this.viewNameField = value;
  43:             }
  44:         }
  45:         private string siteUrlField = string.Empty;
  46:         [Personalizable(), WebPartStorage(Storage.Shared), WebBrowsable(),
  47:          WebDisplayName("Site Url"), WebDescription("Site Url")]
  48:         public string SiteUrl
  49:         {
  50:             get
  51:             {
  52:                 return this.siteUrlField;
  53:             }
  54:             set
  55:             {
  56:                 this.siteUrlField = value;
  57:             }
  58:         }
  59:         /// <summary>
  60:         /// 
  61:         /// </summary>
  62:         private string sourceListField = string.Empty;
  63:         [Personalizable(), WebPartStorage(Storage.Shared), WebBrowsable(),
  64:          WebDisplayName("Source List"), WebDescription("Source list to query")]
  65:         public string SourceList
  66:         {
  67:             get
  68:             {
  69:                 return this.sourceListField;
  70:             }
  71:             set
  72:             {
  73:                 this.sourceListField = value;
  74:             }
  75:         }
  76:         private Boolean disableFilterField = false;
  77:         [Personalizable(), WebPartStorage(Storage.Shared), WebBrowsable(),
  78:          WebDisplayName("Disable Filter"), WebDescription("Disable List Filtering")]
  79:         public Boolean DisableFilter
  80:         {
  81:             get
  82:             {
  83:                 return disableFilterField;
  84:             }
  85:             set
  86:             {
  87:                 disableFilterField = value;
  88:             }
  89:         }
  90:         private Boolean disableSortField = false;
  91:         [Personalizable(), WebPartStorage(Storage.Shared), WebBrowsable(),
  92:          WebDisplayName("Disable Sort"), WebDescription("Disable list sorting")]
  93:         public Boolean DisableSort
  94:         {
  95:             get
  96:             {
  97:                 return disableSortField;
  98:             }
  99:             set
 100:             {
 101:                 this.disableSortField = value;
 102:             }
 103:         }
 104:         #endregion
 105:  
 106:         #region overrides
 107:         protected override void CreateChildControls()
 108:         {
 109:             base.CreateChildControls();
 110:             SPSite site = null ;
 111:             SPWeb web = null ;
 112:             Boolean disposeSPSite = false ;
 113:             try
 114:             {
 115:                 if (this.SourceList != string.Empty && this.SourceList != string.Empty)
 116:                 {
 117:                     viewByQuery = new ListViewByQuery();
 118:                     if(this.SiteUrl != null && this.SiteUrl != string.Empty)
 119:                     {
 120:                         site = new SPSite(this.SiteUrl);
 121:                         disposeSPSite = true ;
 122:                     }
 123:                     else
 124:                     {
 125:                         site = SPContext.Current.Site ;
 126:                     }
 127:                     web = site.OpenWeb();
 128:                     SPList sourceList = web.Lists[this.SourceList];
 129:                     viewByQuery.List = sourceList;
 130:                     SPQuery query = null;
 131:                     if (CheckIfViewExists(viewByQuery.List))
 132:                     {
 133:                         //use the view specified in webpart property
 134:                         query = new SPQuery(viewByQuery.List.Views[this.ViewName]);
 135:                     }
 136:                     else
 137:                     {
 138:                         //use default view to initialized
 139:                         query = new SPQuery(viewByQuery.List.DefaultView);
 140:                     }
 141:                     viewByQuery.Query = query;
 142:                     viewByQuery.DisableFilter = this.DisableFilter;
 143:                     viewByQuery.DisableSort = this.DisableSort;
 144:                     this.Controls.Add(viewByQuery);
 145:                 }
 146:                 else
 147:                 {
 148:                     encodedLiteral = new EncodedLiteral();
 149:                     encodedLiteral.Text = "This webpart is not configured.";
 150:                     this.Controls.Add(encodedLiteral);
 151:                 }
 152:             }
 153:             finally
 154:             {
 155:                 if(disposeSPSite)
 156:                 {
 157:                     ((IDisposable)site).Dispose();
 158:                     ((IDisposable)web).Dispose();
 159:                 }
 160:             }
 161:         }
 162:         protected override void RenderContents(HtmlTextWriter writer)
 163:         {
 164:             
 165:             EnsureChildControls();
 166:             RenderChildren(writer);
 167:         }
 168:         #endregion
 169:  
 170:         #region helper methods
 171:         private Boolean CheckIfViewExists(SPList list)
 172:         {
 173:             Boolean ret = false;
 174:  
 175:             foreach (SPView view in list.Views)
 176:             {
 177:                 if (view.Title.ToLower() == this.ViewName.ToLower())
 178:                 {
 179:                     ret = true;
 180:                 }
 181:             }
 182:             return ret;
 183:         }
 184:         #endregion
 185:     }
 186: }
Advertisements

About sharepointsriram

9+ Yrs of IT experience
This entry was posted in Sharepoint 2010 Web Parts. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s