If you ever tried to programmatically set the toolbar type for a list view web part then you will find that this is not at all straightforward. There are actually quite a lot of posts about this on the net, and they all involve using reflection to invoke various private methods. The simplest way I have found is to invoke the SetToolbarType private method of the SPView class. Using ILSpy you can see that there are two overloads for this method, one takes a uint and the other takes a string for the toolbar type. The first overload translates the uint to a string value and invokes the second overload.
For a recent project we used PowerShell to add the list view web part to a rich text field on a page and then turn off the toolbar. Below is the complete script to do this – please review the inline comments.
###Declare a custom enum. The names of the enum members match the string values that the SetToolbarType method expects.
Add-Type -TypeDefinition @"
public enum ToolbarType
{
Standard,
FreeForm,
None,
ShowToolbar
}
"@
###These functions are required as we are adding the web part to a rich text field, rather than to a web part zone.
Function RegisterWebPartForPageRendering([Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager] $webPartManager, [System.Web.UI.WebControls.WebParts.WebPart] $webPart)
{
$WEB_PART_ZONE_ID = "wpz";
$webPartStorageKey = [Guid]::NewGuid()
$webPart.ID = GetWebPartIDFromStorageKey $webPartStorageKey
$webPartManager.AddWebPart($webPart, $WEB_PART_ZONE_ID, 0);
return GetHtmlForWebPart $webPartStorageKey
}
Function GetWebPartIDFromStorageKey([Guid] $storageKey)
{
return "g_" + $storageKey.ToString().Replace('-', '_');
}
Function GetHtmlForWebPart([Guid] $webPartStorageKey)
{
return [String]::Format(@"
<div class='ms-rtestate-read ms-rte-wpbox' contentEditable='false' unselectable='on'>
<div class='ms-rtestate-notify ms-rtestate-read {0}' id='div_{0}' unselectable='on'></div>
<div style='display:none' id='vid_{0}'unselectable='on'></div>
</div>
"@, $webPartStorageKey.ToString());
}
###This is the method that does the magic. It is invoked by the main script below.
Function SetViewToolbar([Microsoft.SharePoint.SPView] $view, [ToolbarType] $toolbarType)
{
$setToolbarTypeParameterTypes = [uint32]
$setToolbarTypeMethod = $view.GetType().GetMethod("SetToolbarType", [System.Reflection.BindingFlags]::Instance -bor [System.Reflection.BindingFlags]::NonPublic, $null, $setToolbarTypeParameterTypes, $null)
$setToolbarParameters = [uint32] 1
$setToolbarTypeMethod.Invoke($view, $setToolbarParameters)
$view.Update()
}
###Get the web's landing page. The web part will be added to this page.
$web = Get-SPWeb "http://myServer/myWeb"
$publishingWeb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($web)
$defaultPage = $publishingWeb.DefaultPage
###Check out the page so we can edit it
$defaultPage.CheckOut()
###Get the page's web part manager
$defaultPageItem = $defaultPage.Item
$webPartManager = $defaultPageItem.File.GetLimitedWebPartManager([System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
###Delete all the web parts currently on the page
$allWebParts = $webPartManager.WebParts | Select $_
ForEach ($webPart in $allWebParts)
{
$webPartManager.DeleteWebPart($webPart);
}
###Instantiate a new list view web part
$targetList = $web.Lists.TryGetList("My List")
$listViewWebPart = New-Object Microsoft.SharePoint.WebPartPages.XsltListViewWebPart
$listViewWebPart.ListName = $targetList.ID.ToString("B")
$listViewWebPart.ViewGuid = $targetList.Views["My View"].ID.ToString("B")
$listViewWebPart.Title = "My List View Web Part"
###Add the web part to the rich text field
$content = RegisterWebPartForPageRendering $webPartManager $listViewWebPart
$defaultPageItem["PublishingPageContent"] = $content
###As we are adding a new web part to be page, be sure to call Update on the page before
###accessing the View property of the web part, otherwise it will be null.
$defaultPageItem.Update()
###Access the View used by the list view web part and set the toolbar type
$view = $listViewWebPart.View
SetViewToolbar $view None
###All done, update the page and check in.
$defaultPageItem.Update()
$defaultPage.CheckIn([String]::Empty, [Microsoft.SharePoint.SPCheckinType]::MinorCheckIn)
Hi Bernado,
Thank you for the example.
Cheers
Thank You!!! This really helped
Bernardo, thank you very much for sharing!
For them, who will use this excellent code – it is important to call $defaultPageItem.Update(), otherwise it will not work. You can just caml query the item by LinkFilename and update it.