Normally we come across a requirement where we need to
provide SharePoint List like UI and facilities to user in our solutions. I came
across a good solution where in we query a view of SharePoint List, generate a
new custom view and instead of updating default view we just copy the schema
HTML and render it to page.
It provided me many advantages compared to using SPGrid and
writing down code to handle sorting, filtering, paging and many more. The best
part I found is Multi column filter and sorting is handled by SharePoint
itself. No issues related to paging or UI.
Even though I have not tested below solution to extremes,
but found it great so decided to document it.
Below are solution steps.
- Create an empty SharePoint Project.
- Add a blank webpart to the project.
- Create few global properties in the webpart code file.
private string listName = "TestList1";
private string viewFields = "ID,test1,test2,test3";
private string emptyViewString =
"No liked documents. Select and
like new documents..:";
private int noItemsToDisplay
= 20;
private string webparttitle = "My liked documents";
|
- Below is the code that will get schemaHTML from custom method and will render that on page.
protected override void CreateChildControls()
{
base.CreateChildControls();
try
{
//Create XML definition for mylikeddocuments view
string viewXML = this.CreatePersonalView();
using (SPSite site = new SPSite(SPContext.Current.Web.Url))
{
using (SPWeb web =
site.OpenWeb())
{
SPList list = web.Lists[this.listName];
// Create xsltlistviewwebpart control
this.listView = new
Microsoft.SharePoint.WebPartPages.XsltListViewWebPart();
this.listView.Visible
= true;
this.listView.EnableViewState
= true;
//
Bind listviewwebpart to the list.
this.listView.ListName
= list.ID.ToString("B").ToUpperInvariant();
// When clicking the title, navigate to the View
"My Liked Documents" in the list.
this.listView.TitleUrl = list.Views["All Items"].Url;
this.listView.WebId =
web.ID;
this.listView.Title = this.webparttitle;
this.listView.ListId =
(System.Guid)list.ID;
this.listView.UseSQLDataSourcePaging
= true;
// Set XML definition of view to "My liked
documents" XML
this.listView.XmlDefinition
= viewXML;
this.listView.HelpMode
= WebPartHelpMode.Modeless;
this.Controls.Add(this.listView);
}
}
}
catch (Exception ex)
{
System.Web.UI.WebControls.Label lbl = new
System.Web.UI.WebControls.Label();
lbl.Text = ex.Message;
Controls.Add(lbl);
}
}
|
- Below custom method will query DefaultView of SharePoint List and returns SchemaHTML.
private string CreatePersonalView()
{
SPList list = SPContext.Current.Web.Lists[this.listName];
//
Create CAML Query to get documents
string querystring = string.Empty;
querystring = string.Concat("<OrderBy><FieldRef
Name='ID'/></OrderBy>");
//
Based on the defaultview of the list, create a new view where the query is
replaced with the custom query to extract liked documents.
//
Return the schemaxml of the view.
string schemaxml = string.Empty;
SPSecurity.RunWithElevatedPrivileges(delegate
{
using (SPSite site = new SPSite(SPContext.Current.Web.Url))
{
using (SPWeb web =
site.OpenWeb())
{
SPList elevatedList =
web.Lists[list.ID];
SPView view =
elevatedList.DefaultView;
view.Query =
querystring;
if (!string.IsNullOrEmpty(this.viewFields))
{
view.ViewFields.DeleteAll();
foreach (string fieldname in this.viewFields.Split(new char[] { ',' }))
{
view.ViewFields.Add(fieldname);
}
}
view.TabularView = false;
view.RowLimit = (uint)this.noItemsToDisplay;
view.Paged = true;
schemaxml =
view.HtmlSchemaXml;
}
}
});
return schemaxml;
}
|
Below is the output of above code.
Thanks &
Regards,
Keyur Pandya
Comments
Post a Comment