A quick look at Listviews and Listview webparts in SharePoint 2010


I always wondered on how list views and list view webparts are related. Very recently I explored on this and found something interesting to share...

Let me put the scenario in a problem statement...

We have a List:  MyList. We have a custom view associated, named: MyListview

       

 

There are many pages in our SharePoint site where we are using list view webparts to display the content using MyListview.

 

Now, we need to add a field/column: testcolumn in MyList and that should be added to all the list view webparts.

In order to solve this issue, I actually divided the problem in 2 parts:

     1. Adding the column to a list view

     2. Adding the column to a list view web part.

 Adding the column to a list view is fairly simple. We can achieve that using PowerShell

$web = Get-SPWeb http://myTestsite
$list = $web.Lists["MyList "]
$column = $list.Fields["testcolumn "]
$list.Views["MyListview "].Add($column)
$list.Update()
$web.Dispose()

 

But how can I ensure that the field is getting added in an existing list view web part, as by default even if I add that column in MyListview, it won't reflect in  the existing web part.  When we are adding a list view web part; we refer a view using which list items are displayed. Then why it is that, any changes made on that list view web part are not reflecting to the actual listview.

Undoubtedly, it’s a copy of that list view which is being used. Again we are having 2 questions:

1. Why do we maintain a copy of list view and not refer to the actual list view?

2. If it’s a copy then, how can we identify them?

 

When we are using list view webparts, it’s an obvious expectation , that we should be able to customize the list view web parts in  our SharePoint pages.

Now, if we are not using the copy and instead referring the same list view, then we are restricting the users to customize list view web parts independently and in turn all the pages which are using MyListview will not have an independent UI experience.

But then we should have some way to update those list view webparts. There should be some relation between listviews and listview web parts.

In order to further explore on this area, I used some PowerShell scripts and  SharePoint Manager 2010.

I executed the below powershell script to identify all the listviews associated with MYList


#Get Site Url (http://MyTestSite)
$web = Get-SPWeb http://MyTestSite
#Get List instance
$list = $web.Lists["MyList"]
#Get the collection of views
$viewlist = $list.Views
$viewlist | select Title,id

When I executed the above code, I got the output something like the following:

 

And Then I used SharePoint Manager 2010 to have a glimpse on the list and list views.

Both the results are really very interesting. One of the list view is not having a title. Gotcha !!

So, what it concludes is, list view webparts are actually nothing but hidden list views, they do not have a "Title" and the hidden property for these listviews are set to true.

Now we are all set to add the the testcolumn, in the webparts. We can use following powershell code to achieve this....


#Get Site Url (http://MyTestSite)
$web = Get-SPWeb http://MyTestSite
#Get List Name
$list = $web.Lists["MyList"]

#Get the field to be added
$spField = $List.Fields["testcolumn"]

#Get the collection of views
$viewlist = $list.Views

#Loop through each view to add the desired field
for($i = 0; $i -lt $viewlist.Count; $i++)
{
$viewnam = $viewlist[$i]
$spView = $viewnam
Write-Host $spView,': ',$spView.ID
$spView.ViewFields.Add($spField)
$spView.Update()
}

 

But, what if I want to update any specific list webpart on a page. Well If there is only one list view webpart, it is still easy to do it on the fly. But, if we have to do it in 1 or 2 pages, why waste time on writing code, should do it manually, shouldn't we 😉

 

Comments (2)
  1. Jeff says:

    Hello, thanks you for your code but when I execute mine I have an error on update method : "Exception calling update with 0 argument . The file is not checkout"

    Thanks you for your help, i've been struggling with that in order to remove a column on every listviewWebpart

    $web = Get-SPWeb intranet.com/humanresources

    #Get List Name

    $list = $web.Lists["Library compensation and benefits"]

    #Get the collection of views

    $viewlist = $list.Views

    #Loop through each view to add the desired field

    for($i = 0; $i -lt $viewlist.Count; $i++)

    {

    $viewnam = $viewlist[$i]
    
    $spView = $viewnam 
    
    Write-Host "View" $viewnam
    
     if($spView.ViewFields -Contains "OceanikLanguage"){
    
        Write-Host "This list contains OCeanikLanguage"
    
         Write-Host $spView,': ',$spView.ID
    
         $spView.ViewFields.Delete("OceanikLanguage") 
    
         $spView.Update() 
    
    }
    

    }

  2. Jeff says:

    Ok I succeed by checking out every pages 🙂 The code needs to be updated / cleaned but it works

    #Get Site Url (http://MyTestSite)

    $web = Get-SPWeb intranet.com/humanresources

    #Get List Name

    $list = $web.Lists["Library compensation and benefits"]

    #checkout every pages

    $pageLibrary = $web.Lists["Pages"]

    Write-host "Nb of pages " $pageLibrary.Items.Count

    Write-host $web.Url $pageLibrary.url

     for($i = 0; $i -lt $pageLibrary.Items.Count; $i++)

    {

      $page = $pageLibrary.Items[$i].File
    
      try{
    
      $page.Checkin("")
    
      }catch{}
    
      $page.CheckOut()
    
      Write-host "Checkout " $page.Url 
    

    }

    #Get the collection of views

    $viewlist = $list.Views

    #Loop through each view to add the desired field

    for($i = 0; $i -lt $viewlist.Count; $i++)

    {

    $viewnam = $viewlist[$i]
    
    $spView = $viewnam 
    
     if($spView.ViewFields -Contains "OceanikLanguage"){
    
        Write-Host -foregroundcolor Yellow "This list contains OceanikLanguage in listViewWebpart"
    
         Write-Host $spView,': ',$spView.ID
    
         $spView.ViewFields.Delete("OceanikLanguage") 
    
         $spView.Update() 
    
    }
    
    if($spView.ViewFields -Contains "OceanikLanguageCode"){
    
        Write-Host -foregroundcolor Yellow "This list contains OceanikLanguageCode listViewWebpart"
    
         Write-Host "Web " $web.Url "List" $list.Url $spView,': ',$spView.ID
    
         $spView.ViewFields.Delete("OceanikLanguageCode") 
    
         $spView.Update() 
    
    }
    

    }

     for($i = 0; $i -lt $pageLibrary.Items.Count; $i++)

    {

     $page = $pageLibrary.Items[$i].File

     $page.Checkin("")

     $page.Publish("")

     Write-host "Published " $pageLibrary.Items[$i].File.Url

    }

Comments are closed.

Skip to main content