Sunday, July 28, 2013

Copy \ Add Document to Document Set

In this article we can explore the copy document from a document library to document set through code.

Following are the activities involved in copying document:
  • Find the document library
  • Find the document by name
  • Create a byte array from document
  • Find document set and add document to document set
Inside Visual Studio

Create a new console application and name it as DocLibCreation. Make sure you change the target framework to .Net 3.5.

Add the following code into the Program.cs file:

public static void CopyDocument( SPWeb objProjectSite, SPWeb rootSite)
objProjectSite.AllowUnsafeUpdates = true;
SPList objList = rootSite.Lists.TryGetList("Source Document Library");
SPFile objFile = null;
Foreach (SPListItem itm in objList.Items)
if (itm.Name == "My Document")
objFile = itm.File;
byte[] sourceFileContent = objFile.OpenBinary();
SPList prjDocsList = objProjectSite.Lists.TryGetList("Destination Document Library");
SPFolder folDocSet = objProjectSite.GetFolder("Destination Document Library" + "/" + "Document Set Name");
folDocSet.Files.Add("Document Name" , sourceFileContent, true );
ObjProjectSite.AllowUnsafeUpdates = false;

Monday, July 22, 2013

Get all seach scopes for current site collection

In this article we will be seeing about search scopes in SharePoint 2010.|

In this article:
  • Add namespaces
  • Get search context
  • Get all scopes
  • Skip default scopes
  • Add scopes in dropdown
Get all the search scopes:

Add following namespaces.

using Microsoft.Office.Server;
using  Microsoft.Office.Server.Search.Administration;

Use following method to populate all scopes of current site collection in dropdown.

private void GetScopes()
using (SPSite site = new SPSite(SPContext.Current.Site.ID))
// Get the search context object.
SearchContext context = SearchContext.GetContext(site);
Scopes scopes = new scopes(context);
foreach(Scope scope in scopes.GetSharedScopes())
// Skip following default scopes
// Global Query Exclusion - Everything that should be omitted from all search by default
// Rank Demoted Sites - Sites whose rank will be demoted in click - distance calculation.

if(scope.Name != "Global Query Exclusion" && scope.Name !="Rank demoted Sites")
// Show scopes in dropdown

Sunday, July 7, 2013

CAML Query to get all documents from a Document Library

CAML query to retrieve all documents from all folders in a document library.

SPList lstDocs = SPContext.Current.Web.Lists.TryGetList("myDocLib");
SPQuery query = new SPQuery();
query.Query = @"<Where><BeginsWith><FieldRef Name = 'ContentTypeId' /><Value Type= 'ContentTypeId'>0x0101</Value></BeginsWith></Where>";
query.ViewAttributes = "Scope = 'RecursiveAll'";
SPListItemCollection itmsDocs = lstDocs.GetItems(query);

Wednesday, March 13, 2013

Deploy Administrator Approved Forms - InfoPath 2010

Administrator-approved form templates

Administrator-approved form templates are available to any site collection on the SharePoint site and can contain code that requires full trust. They are individually verified, uploaded, and activated by a SharePoint site administrator. Administrator-approved form templates are maintained in a special document library that can be accessed only by administrators.

Deploy administrator-approved form templates

To deploy an administrator-approved form template, you must complete three actions after the form template has been designed: verify, upload, and activate. These steps can either be performed through the command-line interface or through the Central Administration site. You can upload a form template by using the Publishing Wizard in the InfoPath program, using the command line on a server running InfoPath Forms Services in the farm to which the form template will be deployed, or by using the Central Administration interface.
To deploy the form using central admin you can refer
Using central admin method we can deploy one form at a time but if we need to deply many forms this process takes lot of time and effort. So I tried to automate this process using powershell. I have wrote a small powershell script to deploy these forms.
# Set the required variables
$siteURL = "
$publishingDirectory = "Source file location"
$settingsFile = "$publishingDirectory\InfoPathFormsList.txt"
$category = "My Category"
function Show-Progress([string]$activity, [string]$status, [int]$count)
if ($count % 4 -eq 1) {write-progress -activity $activity -status $status " _" ;}
if ($count % 4 -eq 2) {write-progress -activity $activity -status $status " \" }
if ($count % 4 -eq 3) {write-progress -activity $activity -status $status " |" }
if ($count % 4 -eq 0) {write-progress -activity $activity -status $status " /" }
foreach ($i in Get-Content -Path $settingsFile)
$formLocation = "$publishingDirectory\$i.xsn"
# Deactivate the InfoPath form
Write-Output "Deactivate " $i
Disable-SPInfoPathFormTemplate -Identity $i -Site $siteURL -ErrorAction:SilentlyContinue
# uninstall the InfoPath form
Write-Output "Uninstalling " $i
$formTemplate = Get-SPInfoPathFormTemplate -Identity $i -ErrorAction:SilentlyContinue
if ($formTemplate -ne $null)
Uninstall-SPInfoPathFormTemplate -Identity $i -ErrorAction:SilentlyContinue
$percent = 1
while ($formTemplate -ne $null -and $formTemplate.FormTemplateStatus -eq "Removing")
if ($count -eq 100) {$count = 0;}
write-progress -activity "Uninstalling $i" -status "Removing" -percentcomplete (++$count);
$formTemplate = Get-SPInfoPathFormTemplate -Identity $i -ErrorAction:SilentlyContinue;
write-progress -activity "Uninstalling $i" -status "Removing" -percentcomplete 100;
# Verify the InfoPath form
#Write-Output "Verifying " $i
#Test-SPInfoPathFormTemplate -Path $formLocation
# Upload the InfoPath form
Write-Output "Uploading " $i
Install-SPInfoPathFormTemplate -Path $formLocation -Confirm:$false
# Activate the InfoPath form
Write-Output "Activating " $i
Enable-SPInfoPathFormTemplate -Identity $i -Site $siteURL
# Modify the category of the form
Set-SPInfoPathFormTemplate -Identity $i -Category $category

To use this script

1. Copy this script in a notepad.
2. Change $siteURL =
3. Create a folder sourcesFiles and paste your InfoPath form template (.xsn) files in it.
4. Enter your source folder path in $publishingDirectory = "Source folder path"
5. Save this notepad text as PowerShell script (myScript.ps1).
6. Create a InfoPathFormsList.txt file in the same folder and write all InfoPath form template names (i.e. myTemplate.xsn) in it.
7. Open SharePoint 2010 management shell and run this PowerShell script

Monday, October 8, 2012

Useful links for Access Services 2013 in SharePoint 2013

Intro to Access 2013

SQL and Access 2013

Access Blog

Three part series. This is part 1.  Gives a good insight to internals of SharePoint.

Improving the Reach and Manageability of Microsoft Access 2010 Database Applications with Microsoft Access Services

Access 2013 desktop database reference

Access 2013 web app demo

Wednesday, August 29, 2012

Lookup field dropdown position issue

I was trying to create a custom webpart that will display a form to submit data in a list. The list had few lookup fields.
Whenever, I click on that image it displays us with a drop-down containing all the values, but the funniest part is you can select a particular item either by double click or by selecting it once and clicking it else where on the page or by tabbing system of the keyboard. But I want it work like a normal drop-down selection in other words just with a single click and also the control should be closer to other controls from usability perspective.

To fix this issue. you need to set InDesign ="true";

 Ex.BaseFieldControl webControl = field.FieldRenderingControl;

webControl.ID =
string.Format("ctrl_{0}_{1}", field.InternalName, pplCount);

webControl.FieldName = field.Title;

webControl.ItemContext =
SPContext.GetContext(HttpContext.Current, lstReqData.DefaultView.ID, lstReqData.ID, lstReqData.ParentWeb);

webControl.RenderContext = SPContext.GetContext(HttpContext.Current, lstReqData.DefaultView.ID, lstReqData.ID, lstReqData.ParentWeb);

webControl.ControlMode = SPControlMode.New;

webControl.ListId = lstReqData.ID;

webControl.InDesign =

 If you are using form field you can set it by following changes in aspx page

<SharePoint:FormField runat="server" InDesign="true" ID="myFieldId" ControlMode="New" FieldName="myFieldName" />