developing on sharepoint 2010

Upload: sreedhar-konduru

Post on 13-Apr-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/27/2019 Developing on SharePoint 2010

    1/27

    Module 1: Getting Started Building Web Parts in SharePoint 2010

    Benefits of Developing Webparts for SharePoint 2010

    Web Parts are reusable and can be used on multiple pages or sites, they can be easily added to

    a SharePoint webpage from the standard SharePoint interface and their development and

    deployment is supported in Visual studio 2010, standard web parts do not.

    Visual Web part in SharePoint 2010

    Visual Webparts are ascx user controls that can be added directly to a SharePoint page. One

    significant enhancement is that Visual studio 2010 manages packing and deployment of these

    controls

    Deployment of Visual web part

    Visual Webparts are deployed directly from Visual studio 2010 by right clicking the project and

    choosing deploy.

    Standard Webparts in SP2010

    Standard web parts are the classes that inherit from ASP.NET web part base class. When using SPSite SPWeb object in your web part code you should always call Dispose

    () method of the object to ensure the underlying COM object is destroyed explicitly, or

    instantiate the SPSite or SQPWeb in a Using statement.

    You should override the CreateChildControls () method when creating a standard webpart.

    The SPGridView Control provides a simple approach to displaying SharePoint data on aWebpage.

    Module 1: Code Snippets: Getting Started: Building Web Parts in SharePoint 2010

    5

    The following code shows how to modify the Textproperty of a label when a Visual Web Partloads.

    NOTE: This code assumes there is an ASP.NET Label control called messagein the Visual Web

    Part

    using System;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

  • 7/27/2019 Developing on SharePoint 2010

    2/27

    namespace BonnevilleTestBed.VisualWebPart1

    {

    public partial class VisualWebPart1UserControl : UserControl

    {

    protected void Page_Load(object sender, EventArgs e)

    {

    message.Text = "Welcome to SharePoint 2010 Development";

    }

    }

    }

    The following code shows how to render a welcome message when a standard Web Part loads:

    using System;

    using System.ComponentModel;

    using System.Runtime.InteropServices;using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

    using Microsoft.SharePoint;

    using Microsoft.SharePoint.WebControls;

    namespace BonnevilleTestBed.BonnevilleStandardWP

    {

    [ToolboxItemAttribute(false)]

    public class BonnevilleStandardWP : WebPart

    {

    public BonnevilleStandardWP(){

    }

    protected override void CreateChildControls()

    {

    //Get the currently logged-on user's name from the SharePoint object

    model

    string username = SPContext.Current.Web.CurrentUser.LoginName;

    LiteralControl myMessage = new Literalcontrol("Welcome " + userName

    + " to SharePoint 2010 Development");

    this.Controls.Add(myMessage);

    base.CreateChildControls();

    }

    protected override void RenderContents(HtmlTextWriter writer)

    {

    base.RenderContents(writer);

    }

  • 7/27/2019 Developing on SharePoint 2010

    3/27

    }

    }

    The following code shows how to iterate through all lists and subwebs in a SharePoint site, and

    add them to a treeview control in a Visual Web Part.Note:This code assumes there is a TreeView control called siteStructurein the Visual Web

    Part. Note also how the addWebs()method is called recursively.

    using System;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

    using Microsoft.SharePoint;

    using Microsoft.SharePoint.Utilities;

    using System.Web;

    namespace BonnevilleTestBed.Bonneville

    {public partial class BonnevilleUserControl : UserControl

    {

    protected void Page_Load(object sender, EventArgs e)

    {

    SPWeb thisWeb = null;

    TreeNode node;

    thisWeb = SPContext.Current.Web;

    //Add the Web's title as the display text for the tree node, and add

    the URL as the NavigateUri

    node = new TreeNode(thisWeb.Title, null, null, thisWeb.Url, "_self");

    //The Visual Web Part has a treeview control called siteStructure

    siteStructure.Nodes.Add(node);

    //Get a reference to the current node, so child nodes can be added in

    the correct position

    TreeNode parentNode = node;

    //Iterate through the Lists collection of the Web

    foreach (SPList list in thisWeb.Lists)

    {

    if (!list.Hidden)

    {

    node = new TreeNode(list.Title, null, null, list.DefaultViewUrl,

    "_self");

    parentNode.ChildNodes.Add(node);}

    }

    foreach (SPWeb childWeb in thisWeb.Webs)

    {

    //Call our own helper function for adding each child Web to the tree

    addWebs(childWeb, parentNode);

  • 7/27/2019 Developing on SharePoint 2010

    4/27

    childWeb.Dispose();

    }

    siteStructure.CollapseAll();

    }

    void addWebs(SPWeb web, TreeNode parentNode)

    {

    TreeNode node;

    node = new TreeNode(web.Title, null, null, web.Url, "_self");

    parentNode.ChildNodes.Add(node);

    parentNode = node;

    foreach (SPList list in web.Lists)

    {

    if (!list.Hidden)

    {

    node = new TreeNode(list.Title, null, null, list.DefaultViewUrl,

    "_self");

    parentNode.ChildNodes.Add(node);

    }

    }

    foreach (SPWeb childWeb in web.Webs)

    {

    //Call the addWebs() function from itself (i.e. recursively)

    //to add all child webs until there are no more to be added

    addWebs(childWeb, parentNode);

    }

    }

    }

    }

    Module 2: What Developers Need to Know About SharePoint 2010?

    SharePoint 2010 is based on ASP.NET 3.5 and runs on 64 bit platforms only. The _layouts location is a virtual web folder that points to file system folder on the

    SharePoint server. Visual studio 2010 provides support for deploying items to the

    _layouts folder.

    WSP files simplify deployment across multiple servers in a farm and provide for astandard way for visual studio to open and modify functionality.

  • 7/27/2019 Developing on SharePoint 2010

    5/27

    Site events enable a developer to capture events such as site deletion site provisioning,or site moving, either just before or after these operation have taken place.

    Visual studio 2010 and SharePoint 2010 combine to provide full debugging interface fordevelopers.

    SPWeb, SPSite and SPFarm are objects in SharePoint hierarchy.

    SPFarm object provides access to all of the services and web applications in a SharePointdeployment.

    SharePoint object hierarchy order from the highest to most specific: SPFarm,SPWebapplication, SPSite, and SPWeb.

    Module 2 - Code Snippets: What Developers Need to Know About SharePoint 2010

    The following code shows two event handlers:

    - The first one (FieldAdded) updates existing list items when a field is added to a list.

    - The second handler (ListDeleting) prevents the deletion of a list.

    namespace ProductMarketing.ProductTaskEvents{

    public class ProductTaskEvents : SPListEventReceiver

    {

    public override void FieldAdded(SPListEventProperties properties)

    {

    SPField newField = properties.Field;

    Guid fieldID = newField.Id;

    if (newField.Type == SPFieldType.Text)

    {

    SPList thisList = properties.List;

    foreach (SPListItem item in thisList.Items)

    {

    item[fieldID] = "Please update this existing item...";

    item.Update();

    }

    }

    base.FieldAdded(properties);

    }

    public override void ListDeleting(SPListEventProperties properties)

    {

    properties.ErrorMessage = "This list is critical to the marketing

    campaign and cannot be deleted.";

    properties.Cancel = true;}

    }

    }

    The following event handler shows how to update properties of a SharePoint Web site when anew Web is created

  • 7/27/2019 Developing on SharePoint 2010

    6/27

    namespace ProductMarketing.ProductMarketingWebEvents

    {

    public class ProductMarketingWebEvents : SPWebEventReceiver

    {

    public override void WebProvisioned(SPWebEventProperties properties)

    {

    SPWeb thisNewWeb = properties.Web;

    thisNewWeb.AllowUnsafeUpdates = true;

    thisNewWeb.Title = "Updated in Code";

    thisNewWeb.Update();

    thisNewWeb.AllowUnsafeUpdates = false;

    base.WebProvisioned(properties);

    }

    }

    }

    The following code shows how to enumerate the alerts in a SharePoint site, and also how toenable or disable alerts.

    Note: This code is designed to run on an application page that includes:

    - An ASP.NET Label control called alertCount- An ASP.NET button that includes a Clickevent handler set to the EnableAllfuntion

    - An ASP.NET button that includes a Clickevent handler set to the DisableAllfuntion

    namespace Alerter.Layouts.Alerter

    {

    public partial class Alerts : LayoutsPageBase

    {

    protected void Page_Load(object sender, EventArgs e)

    {

    int enabled = 0;

    int disabled = 0;

    SPWeb thisWeb = SPContext.Current.Web;

    foreach (SPAlert alrt in thisWeb.Alerts)

    {

    if (alrt.Status == SPAlertStatus.On)

    {

    enabled++;

    }

    if (alrt.Status == SPAlertStatus.Off)

    { disabled++;

    }

    }

    alertCount.Text = "Enabled Alerts: " + enabled.ToString()

    + "\nDisabled Alerts" + disabled.ToString();

    }

    protected void EnableAll(object sender, EventArgs e)

    {

  • 7/27/2019 Developing on SharePoint 2010

    7/27

    SPWeb thisWeb = SPContext.Current.Web;

    foreach (SPAlert alrt in thisWeb.Alerts)

    {

    alrt.Status = SPAlertStatus.On;

    alrt.Update();

    }

    }

    protected void DisableAll(object sender, EventArgs e)

    {

    SPWeb thisWeb = SPContext.Current.Web;

    foreach (SPAlert alrt in thisWeb.Alerts)

    {

    alrt.Status = SPAlertStatus.Off;

    alrt.Update();

    }

    }

    }

    }

    The following code creates a new SharePoint site (SPWeb object):

    SPSite thisSite = SPContext.Current.Site;

    thisSite.RootWeb.AllowUnsafeUpdates = true;

    SPWeb hrWeb = thisSite.RootWeb.Webs.Add("HRWeb",

    "Human Resources Web",

    "For use by HR Employees",

    1033,

    "STS#0",

    false,false);

    hrWeb.Dispose();

    thisSite.RootWeb.AllowUnsafeUpdates = false;

    The following code enumerates all of the services provided by the current farm's SPFarmobject

    and displays them in a treeview control in an application page.

    Note: The code relies on there being a tree-view named farmContentsin the application page.

    namespace Hierarchy.Layouts.Hierarchy

    {public partial class HierarchyViewer : LayoutsPageBase

    {

    protected void Page_Load(object sender, EventArgs e)

    {

    SPFarm thisFarm = SPFarm.Local;

    TreeNode node;

    farmContent s.Nodes.Clear();

    foreach(SPService svc in thisFarm.Services)

  • 7/27/2019 Developing on SharePoint 2010

    8/27

    {

    node = new TreeNode();

    node.Text = "(Type=" + svc.TypeName + ") " + svc.DisplayName;

    farmContents.Nodes.Add(node);

    }

    farmContents.CollapeAll();

    }

    }

    The following code enumerates all of the services, web applications, site collections, sites, and

    lists in a SharePoint farm, and displays them in a treeview control in an application page.

    Note: The code relies on there being a tree-view named farmContentsin the application page.

    Also note how the addWebs() function is called recursively to ensure sites and subsites areenumerated and displyed in the treeview.

    using System;

    using Microsoft.SharePoint;using Microsoft.SharePoint.WebControls;

    using System.Web.UI.WebControls;

    using Microsoft.SharePoint.Administration;

    namespace Hierarchy.Layouts.Hierarchy

    {

    public partial class HierarchyViewer : LayoutsPageBase

    {

    protected void Page_Load(object sender, EventArgs e)

    {

    SPFarm thisFarm = SPFarm.Local;

    TreeNode node;

    farmContents .Nodes.Clear();

    foreach(SPService svc in thisFarm.Services)

    {

    node = new TreeNode();

    node.Text = "(Type=" + svc.TypeName + ") " + svc.DisplayName;

    farmContents.Nodes.Add(node);

    TreeNode svcNode = node;

    if (svc is SPWebService)

    {

    SPWebService webSvc = (SPWebService)svc;

    foreach (SPWebApplication webApp in webSvc.WebApplications)

    {

    node = new TreeNode();

    node.Text = webApp.DisplayName;

    svcNode.ChildNodes.Add(node);

    TreeNode webAppNode = node;

    foreach (SPSite site in webApp.Sites)

    {

  • 7/27/2019 Developing on SharePoint 2010

    9/27

    try {

    node = new TreeNode();

    node.Text = site.Url;

    webAppNode.ChildNodes.Add(node);

    TreeNode siteNode = node;

    site.CatchAccessDeniedException = false;

    try

    {

    node = new TreeNode(site.RootWeb.Title, null, null,

    site.RootWeb.Url, "_self");

    siteNode.ChildNodes.Add(node);

    TreeNode parentNode = node;

    foreach (SPList list in site.RootWeb.Lists)

    {

    node = new TreeNode(list.Title, null, null,

    list.DefaultViewUrl, "_self");

    parentNode.ChildNodes.Add(node);

    }

    foreach (SPWeb childWeb in site.RootWeb.Webs)

    {

    try {

    addWebs(childWeb, parentNode);

    } finally

    {

    childWeb.Dispose();

    }}

    }

    catch

    { }

    }

    finally

    {

    site.Dispose();

    }

    }

    }

    }

    }

    farmContents.CollapseAll();

    }

    void addWebs(SPWeb web, TreeNode parentNode)

  • 7/27/2019 Developing on SharePoint 2010

    10/27

    {

    TreeNode node;

    node = new TreeNode(web.Title, null, null, web.Url, "_self");

    parentNode.ChildNodes.Add(node);

    parentNode = node;

    foreach (SPList list in web.Lists)

    {

    node = new TreeNode(list.Title, null, null, list.DefaultViewUrl,

    "_self");

    parentNode.ChildNodes.Add(node);

    }

    foreach (SPWeb childWeb in web.Webs)

    {

    try {

    addWebs(childWeb, parentNode);

    } finally {

    childWeb.Dispose();

    }

    }

    }

    }

    }

    Module 3: Building Blocks for Web Part Development in SharePoint

    2010

    SharePoints building blocks enable faster development, proven components, and moreefficient code, and they ensure you do not end up building what already exists.

    The SharePoint Controls section in the Visual Studio toolbox does not display all of thecontrols available to the developer. To see the complete list type

  • 7/27/2019 Developing on SharePoint 2010

    11/27

    ListViewByQuery listTasks = new ListViewByQuery();

    listTasks.List = tasks;

    SPQuery taskQuery = new SPQuery(listTasks.List.DefaultView);

    taskQuery.ViewFields = "";

    taskQuery.Query = ""

    +

    SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now.AddMonths(1))

    + "";

    listTasks.Query = taskQuery;

    this.Controls.Add(listTasks);

    base.CreateChildControls();

    }

    The following code shows how to extract the selected people in a PeopleEditorcontrol.

    Note:The code runs in a Visual Web Part, and relies on there being a PeopleEditorcontrol

    named peoplePicker, and an ASP.NET ListBoxcontrol called selectedPeople

    namespace SharePointControls.ControlExample

    {

    public partial class ControlExampleUserControl : UserControl

    {

    protected void Page_Load(object sender, EventArgs e)

    {

    }

    protected void getPeople(object sender, EventArgs e)

    {

    string allPeople = peoplePicker.CommaSeparatedAccounts;

    string[] selected = allPeople.Split(new string[] { "," },StringSplitOptions.RemoveEmptyEntries);

    foreach (string p in selected)

    {

    selectedPeople.Items.Add(p);

    }

    }

    }

    }

    The following code shows how to use the SPGridViewcontrol in a Web Part to display listitems from a list:

    protected override void CreateChildControls()

    {

    SPGridView taskGrid = new SPGridView();

    taskGrid.AutoGenerateColumns = false;

    BoundField taskTitle = new BoundField();

    taskTitle.DataField = "Title";

  • 7/27/2019 Developing on SharePoint 2010

    12/27

    taskTitle.HeaderText = "To Do...";

    taskGrid.Columns.Add(taskTitle);

    SPWeb thisWeb = SPControl.GetContextWeb(Context);

    SPList taskList = thisWeb.Lists["Tasks"];

    SPDataSource listSource = new SPDataSource();

    listSource.List = taskList;

    SPDataSourceView view = listSource.GetView();

    taskGrid.DataSource = listSource;

    if (view.CanSort)

    {

    taskGrid.AllowSorting = true;

    }

    taskGrid.DataBind();

    Controls.Add(taskGrid);

    base.CreateChildControls();

    }

    Module 4: Accessing SharePoint 2010 Data with Server-Side APIs

    Retrive and Manipulate list items in a SharePoint site use SPListItem andSPQuery classes.

    SPQuery Class makes use of CAML query with a where clause that filters theresults that it returns.

    SPMetal is a Command line tool that creates entities for use with LINQ. LINQ offers early binding to list data, fields and the data types of those

    fields.LINQ is also a standard approach to querying data.

    A Content type can be associated with various types of document andcompleting the additional metadata can improve the management of site data.

    Some extensions of content type functionality can only be implemented in VisualStudio 2010.

    Module 5: Accessing SharePoint 2010 Data with Client-Side APIs

    Silverlight, .NET and JavaScript can all use SharePoint Client Object Model. XML and JSON are used to communicate between Client Object Model and SharePoint

    server.

  • 7/27/2019 Developing on SharePoint 2010

    13/27

    When the Client Object Model is instantiated the URL to the SharePoint site can bepassed to its constructor as a string.

    Lambda Expressions can be used to filter the items in a list when calling the Listsmethod on the Client Context load.

    Silver light applications should query data using an asynchronous background thread.

    .Module 5 - Code Snippets: Accessing SharePoint 2010 Data with Client-Side APIs

    The following code shows how to use the client object model from a console application. Thecode first of all lists the Web templates available for a specific Web, and then creates a new Web

    based on a specific template:

    ClientContext clientCtx = new ClientContext("http://intranet.contoso.com");

    Site thatSite = clientCtx.Site;

    clientCtx.Load(thatSite.RootWeb);

    Web thatWeb = thatSite.RootWeb;

    WebTemplateCollection templates =

    thatWeb.GetAvailableWebTemplates(1033, true);

    clientCtx.Load(templates);

    clientCtx.ExecuteQuery();

    foreach (WebTemplate template in templates)

    {

    Console.WriteLine(template.Id + " : "

    + template.Name + " : "

    + template.Title);

    }

    WebCreationInformation webInfo = new WebCreationInformation();

    webInfo.Description = "My client-created Web";

    webInfo.Title = "Created by Client OM";

    webInfo.Url = "Client3";

    webInfo.Language = 1033;

    webInfo.UseSamePermissionsAsParentSite = true;

    webInfo.WebTemplate = "MPS#2";

    Web newWeb = thatWeb.Webs.Add(webInfo);

    clientCtx.ExecuteQuery();

    clientCtx.Dispose();

    Console.WriteLine("Web was created");

    The following code shows how to use the client object model from a Windows Presentation

    Foundation (WPF) application. The code enumerates the lists in a Web, and adds them to a WPF

    Expandercontrol.Note: The code relies on there being an Expandercontrol named expander1on the WPF form.

    try

    {

    ClientContext clientCtx = new ClientContext(siteUrl.Text);

  • 7/27/2019 Developing on SharePoint 2010

    14/27

    Web thatWeb = clientCtx.Web;

    clientCtx.Load(thatWeb);

    clientCtx.Load(thatWeb.Lists);

    clientCtx.Load(thatWeb, lists => lists.Lists.Where(list => list.Title !=

    null));

    clientCtx.ExecuteQuery();

    AllLists.Items.Clear ();

    foreach (Microsoft.SharePoint.Client.List lst in thatWeb.Lists)

    {

    AllLists.Items.Add(lst.Title);

    }

    clientCtx.Dispose();

    }

    catch (Exception ex)

    {

    AllLists.Items.Clear ();

    AllLists.Items.Add(ex.Message);

    }

    expander1.IsExpanded = false;

    Note:To see code samples that use the client object model from a Silverlight application, please

    see:http://blogs.msdn.com/pandrew/pages/GettingStarted2010Snippets8.aspx

    Module 6: Accessing External Data with Business Connectivity

    Services in SharePoint 2010

    SharePoint 2010 provides a new set of technologies known as Business Connectivity Services for

    retrieving, editing, updating, and deleting data from external systems. This module provides an overview

    of Business Connectivity Services, and delves into development examples of using Business Connectivity

    Services data in custom SharePoint solutions.

    Business Connectivity Services integrates external content with SharePointCollaboration and workflow.

    http://blogs.msdn.com/pandrew/pages/GettingStarted2010Snippets8.aspxhttp://blogs.msdn.com/pandrew/pages/GettingStarted2010Snippets8.aspxhttp://blogs.msdn.com/pandrew/pages/GettingStarted2010Snippets8.aspx
  • 7/27/2019 Developing on SharePoint 2010

    15/27

    SharePoint Designer can be used to build basic Business Connectivity servicessolutions with many of the features managed by standard out-ofbox functionality.

    More Complex requirements can be built in visual Studio 2010.

    External Content from Business Connectivity Services can be displayed in theSharePoint web interface and can be taken offline in SharePoint Workspace.

    Business Connectivity Services enables full data operations including updating anddeletion of records to take place if the developer chooses. Both SharePoint Designer

    and Visual Studio support these actions.

    Module 7: Developing Business Processes with SharePoint 2010

    Workflows

    SharePoint 2010 provides a powerful workflow framework that enables you to implementcustom business processes that are driven by SharePoint data.

    SharePoint 2010 adds Site Workflows to the existing List Workflow capability that wasprovided in earlier versions.

    The Workflow engine is based on ASP.NET 3.5 and as well as introducing workflows atSite level, SharePoint 2010 also enables workflows to be built in Visio before being

    imported into SharePoint Designer or Visual Studio.

    The Workflow engine supports Sequential and State Machine workflows. The Site Workflow workflows can be started from the Site Actions Menu by clicking the

    Site Workflows option and then the Site workflow from the Webpage.

    The Workflow initationForm allows parameters to be provided when a workflow isstarted.

    Module 7 - Code Snippets: Developing Business Processes with SharePoint 2010 WorkflowsThe following code shows how to return data from a workflow initiation form to the workflow.

    Note:This code relies on there being an ASP.NET Textbox on the initiation form named

    MaxPrice.Note also that the code snippet that follows this one uses the data returned.

    namespace ApproveRejectProducts.Workflow1

    {

    public partial class GetMaxPrice : LayoutsPageBase

    {

  • 7/27/2019 Developing on SharePoint 2010

    16/27

    protected void Page_Load(object sender, EventArgs e)

    {

    InitializeParams();

    // Optionally, add code here to pre-populate your form fields.

    }

    // This method is called when the user clicks the button to start the

    workflow.

    private string GetInitiationData()

    {

    return (MaxPrice.Text);

    }

    }

    }

    The following code shows how to use data returned from a workflow initiation form (as in the

    above example) and use it in a code activity in a SharePoint 2010 workflow.Note:This code relies on there being a list named Productsin the current SharePoint site.

    namespace ApproveRejectProducts.Workflow1

    {

    public sealed partial class Workflow1 : SequentialWorkflowActivity

    {

    public Workflow1()

    {

    InitializeComponent();

    }

    public Guid workflowId = default(System.Guid);

    public SPWorkflowActivationProperties workflowProperties = new

    SPWorkflowActivationProperties();

    private void codeActivity1_ExecuteCode(object sender, EventArgs e)

    {

    double maxPrice =

    double.Parse(workflowProperties.InitiationData.ToString());

    SPWeb thisWeb = workflowProperties.Web;

    SPList products = thisWeb.Lists["Products"];

    foreach (SPListItem product in products.Items)

    {

    if (double.Parse(product["SellingPrice"].ToString()) > maxPrice)

    {

    product.ModerationInformation.Comment = "Price too high";

    product.ModerationInformation.Status =

    SPModerationStatusType.Denied;

    product.Update();

    }

    else

    {

  • 7/27/2019 Developing on SharePoint 2010

    17/27

    product.ModerationInformation.Comment = "Price OK";

    product.ModerationInformation.Status =

    SPModerationStatusType.Approved;

    product.Update();

    }

    }

    }

    }

    }

    Module 8: Creating Silver light User Interfaces for SharePoint

    2010 Solutions

    Silver light 3.0 provides the opportunity for developers to create the next generation of Rich

    Internet Applications (RIAs). SharePoint 2010 integrates closely with Microsoft Silver light to

    enable you to build compelling user interfaces that interact with SharePoint data.

    The SharePoint 2010 Client Object model significantly simplifies the creation of Silverlight applications that access SharePoint 2010 sites.

    Silver light offers a rich user experience and with the code running on the client browserthe workload for many operations is removed from the server.

    SharePoint 2010 supports silver light applications by providing a Silver light Web partthat you can add to your page and specify the URL to the Silver light XAP file .If your

    Silver light application requires additional parameters then you can write your own

    control to host the Silver light application.

    A Silver light application can be uploaded to a SharePoint Document Library by aninformation worker and then added to a page using the built-in Silver light web part in

    SharePoint 2010,as well as being deployed to the Client Bin folder by an administrator.

    Module 8 - Code Snippets: Creating Silverlight User Interfaces for SharePoint 2010 Solutions

    The following code shows how to use the SharePoint client object model in a Silverlight

    application. The code performs the following actions in the Silverlight application:

    - Obtains a reference to the current SharePoint site in the application's APP.XAML file

    - Updates a progress bar and status label in real time, based on accessing and retrieving datafrom SharePoint

    - Renders media files (images and videos) from SharePoint in the Silverlight application

  • 7/27/2019 Developing on SharePoint 2010

    18/27

    Note: Silverlight code must call methods of the client object model asynchronously, so that the

    main UI thread in Silverlight is not blocked while waiting for responses from SharePoint. In this

    way, the progress bar (and status label) can be updated appropriately. However, becausethe results from SharePoint are returned on background threads (becuase of the asynchronous

    nature of the calls) and because updating the UI must be performed back on the main UI thread,

    the code switches back to the main UI thread by using the Dispatcher.BeginInvoke() calls thatyou can see below.

    Also note that the code relies on there being the following controls in the Silverlight User

    Control:- A Silverlight ProgressBar named Loader

    - A Silverlight TextBlock named Status- A Silverlight StackPanel named MyContainer

    // The following using statements are in the application file (APP.XAML.CS)

    using Microsoft.SharePoint.Client;

    using System.Threading;

    //The following line of code is in the Startupevent for the

    //Silverlight application in the application file (APP.XAML.CS)

    ApplicationContext.Init (e.InitParams, SynchronizationContext.Current);

    //The following using statements are in a Silverlight user control

    using Microsoft.SharePoint.Client;

    using System.Threading;

    //The following code is in a Silverlight user control

    ClientContext clientCtx;

    Microsoft.SharePoint.Client.List docs;

    int fileTracker = 0;

    int rowTracker = 0;

    private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)

    {

    Loader.Maximum = 3;

    Loader.Value = 0;

    Status.Text = "Connecting to Web...";

    clientCtx = new ClientContext(ApplicationContext.Current.Url);

    clientCtx.Load(clientCtx.Web);

    clientCtx.ExecuteQueryAsync(updateConnectionStatus, null);

    }

    void updateConnectionStatus(Object sender, ClientRequestSucceededEventArgs e)

  • 7/27/2019 Developing on SharePoint 2010

    19/27

    {

    //This method starts on a background thread, but needs to update the progress bar and label in the UI

    //Therefore, it calls Dispatcher.BeginInvoke() to perform the UI updating on the main thread

    Dispatcher.BeginInvoke(makeProgressWebConnection);

    }

    void makeProgressWebConnection()

    {

    //Called by Dispatcher.BeginInvoke() in the function above

    //The code is now running back on the main UI thread, and so can update the UI

    Loader.Value++;

    Status.Text = "Web Connected. Connecting to Lists...";

    clientCtx.Load(clientCtx.Web.Lists);

    clientCtx.ExecuteQueryAsync(updateListStatus, null);

    }

    void updateListStatus(Object sender, ClientRequestSucceededEventArgs e)

    {

    //This method starts on a background thread, but needs to update the progress bar and label in the UI

    //Therefore, it calls Dispatcher.BeginInvoke() to perform the UI updating on the main thread

    Dispatcher.BeginInvoke(makeProgressListConnection);

    }

    void makeProgressListConnection()

    {

    //Called by Dispatcher.BeginInvoke() in the function above

    //The code is now running back on the main UI thread, and so can update the UI

    Loader.Value++;

    Status.Text = "Lists Connected. Getting List data...";

    MyContainer.Children.Clear();

    docs = clientCtx.Web.Lists.GetByTitle("Shared Documents");

    clientCtx.Load(docs);

    clientCtx.Load(docs.RootFolder);

    clientCtx.Load (docs.RootFolder.Files);

    clientCtx.ExecuteQueryAsync(getListData, null);

    }

    void getListData(Object sender, ClientRequestSucceededEventArgs e)

    {

    //This method starts on a background thread, but needs to update the progress bar and label in the UI

    //Therefore, it calls Dispatcher.BeginInvoke() to perform the UI updating on the main thread

    Dispatcher.BeginInvoke(loadFiles);

    }

    private void loadFiles()

    {

    //Called by Dispatcher.BeginInvoke() in the function above

  • 7/27/2019 Developing on SharePoint 2010

    20/27

    //The code is now running back on the main UI thread, and so can update the UI

    Loader.Maximum = docs.RootFolder.Files.Count;

    Loader.Value = 0;

    Status.Text = "Loading Files...";

    fileTracker = 0;

    foreach (File fle in docs.RootFolder.Files)

    {

    clientCtx.Load(fle);

    clientCtx.ExecuteQueryAsync(addFileToUI, null);

    }

    }

    void addFileToUI(Object sender, ClientRequestSucceededEventArgs e)

    {

    //This method starts on a background thread, but needs to update the progress bar and label in the UI

    //It can now also render the files, which is another UI operation

    //Therefore, it calls Dispatcher.BeginInvoke() to perform the UI updating on the main thread

    Dispatcher.BeginInvoke(addFile);

    }

    StackPanel row = new StackPanel();

    void addFile()

    {

    //Called by Dispatcher.BeginInvoke() in the function above

    //The code is now running back on the main UI thread, and so can update the UI

    string fName = docs.RootFolder.Files[fileTracker].Name;

    string fUrl = docs.RootFolder.Files[fileTracker].ServerRelativeUrl;

    fUrl = clientCtx.Url + fUrl;

    //Simple logic to lay out the files in a three-column configuration

    if ((rowTracker % 3) == 0)

    {

    row = new StackPanel();

    row.Orientation = Orientation.Horizontal;

    MyContainer.Children.Add(row);

    }

    if ((fName.EndsWith(".png")) || (fName.EndsWith(".jpg")))

    {

    Image img = new Image();

    img.MaxWidth = 100;

    img.Stretch = Stretch.Uniform;

    BitmapImage bitMap = new BitmapImage(new Uri(fUrl, UriKind.Absolute));

    img.Source = bitMap;

    HyperlinkButton mediaButton = new HyperlinkButton();

  • 7/27/2019 Developing on SharePoint 2010

    21/27

    mediaButton.Margin = new Thickness(5);

    mediaButton.Content = img;

    mediaButton.TargetName = "_blank";

    mediaButton.NavigateUri = new Uri(fUrl);

    mediaButton.Cursor = Cursors.Hand;

    row.Children.Add(mediaButton);

    rowTracker++;

    }

    if (fName.EndsWith(".wmv"))

    {

    MediaElement media = new MediaElement();

    media.MaxWidth = 100;

    media.Stretch = Stretch.Uniform;

    media.Source = new Uri(fUrl, UriKind.Absolute);

    media.AutoPlay = true;

    HyperlinkButton mediaButton = new HyperlinkButton();

    mediaButton.Margin = new Thickness(5);

    mediaButton.Content = media;

    mediaButton.TargetName = "_blank";

    mediaButton.NavigateUri = new Uri(fUrl);

    mediaButton.Cursor = Cursors.Hand;

    row.Children.Add(mediaButton);

    rowTracker++;

    }

    Loader.Value++;

    fileTracker++;

    if (fileTracker >= docs.RootFolder.Files.Count)

    {

    Status.Text = "All files have now been loaded";

    }

    }

    Module 9: Sandboxed Solutions for Web Parts in SharePoint

    2010

    SharePoint 2010 provides a new sandboxed environment that enables you to run user

    solutions without affecting the rest of the SharePoint farm. This environment means

    that users can upload their own custom solutions without requiring intervention from

    administrators, and without putting the rest of the farm at risk.

  • 7/27/2019 Developing on SharePoint 2010

    22/27

    Sandboxing provides non-developers and organizations with agility stability andsecurity.

    The Sandbox type for a particular solution can be set in the wizard during projectcreation. It can also be set from the properties window in visual studio when you

    are developing the project.

    The Sandboxed code is run in the context of a specific worker process calledSPUCWorkerProcess.The code is then reviewed against a set of allowed objects

    and methods on the subset of the object model and ,where allowed calls are

    made against the full object model.

    The Sandboxed feature offers advanced resource management that is capable ofidentifying code that is consuming more resources than acceptable and the

    reducing the impact of that code by notifying the administrator and if necessary

    disabling code.

    Number of operations is not allowed in sandboxed solution. These include usingthe SPFarm object and performing asynchronous post backs.

    Module 9 - Code Snippets: Sandboxed Solutions for Web Parts in SharePoint 2010

    The following example shows code that attempts to run in a sandboxed solutuon. There are four

    buttons, each of which attempt a different type of action, as follows:- renderWebInfo_Click: This operation will be allowed to run in the sandbox.

    - renderWebInfoElevated_Click: This operation will notbe allowed to run in the sandbox.

    The sandbox will catch the exception, so the catch{} block will not run.- accessProhibitedNamespace_Click: This operation will notbe allowed to run in the

    sandbox. However, the exception will be caught by the catch{} block.

    - renderCrossSiteData_Click: This operation will notbe allowed to run in the sandbox. Thesandbox will catch the exception, so the catch{} block will not run

    namespace SBWebPart.SandboxedWebPart

    {

    [ToolboxItemAttribute(false)]

    public class SandboxedWebPart : WebPart

    {

    public SandboxedWebPart()

    {

    }

    LiteralControl output;

    protected override void CreateChildControls()

    {

  • 7/27/2019 Developing on SharePoint 2010

    23/27

    Button renderWebInfo = new Button();

    renderWebInfo.Text = "Access data in this site";

    renderWebInfo.Click += new EventHandler(renderWebInfo_Click);

    Button renderWebInfoElevated = new Button();

    renderWebInfoElevated.Text = "Use elevated privileges";

    renderWebInfoElevated.Click += new

    EventHandler(renderWebInfoElevated_Click);

    Button accessProhibitedNamespace = new Button();

    accessProhibitedNamespace.Text = "Create an HTTP connection ";

    accessProhibitedNamespace.Click += new

    EventHandler(accessProhibitedNamespace_Click);

    Button renderCrossSiteData = new Button();

    renderCrossSiteData.Text = "Access data in other site collections";

    renderCrossSiteData.Click += new

    EventHandler(renderCrossSiteData_Click);

    output = new LiteralControl();

    output.Text = "";

    this.Controls.Add(output);

    this.Controls.Add(new LiteralControl("
    "));

    this.Controls.Add(renderWebInfo);

    this.Controls.Add(renderWebInfoElevated);

    this.Controls.Add(accessProhibitedNamespace);

    this.Controls.Add(renderCrossSiteData);

    base.CreateChildControls();

    }

    void renderWebInfo_Click(object sender, EventArgs e)

    {

    try

    {

    SPWeb thisWeb = SPContext.Current.Web;

    string message = string.Format("This web contains {0} subwebs",

    thisWeb.Webs.Count);

    output.Text = message;

    }

    catch(Exception ex)

    {

    output.Text = ex.Message;

    }

    }

    void renderWebInfoElevated_Click(object sender, EventArgs e){

    try

    {

    SPSecurity.RunWithElevatedPrivileges(showWebCount);

    }

    catch (Exception ex)

    {

    output.Text = "My Caught Error: " + ex.Message;

  • 7/27/2019 Developing on SharePoint 2010

    24/27

    }

    }

    void showWebCount()

    {

    SPWeb thisWeb = SPContext.Current.Web;

    string message = string.Format("This web contains {0} subwebs",

    thisWeb.Webs.Count);

    output.Text = message;

    }

    void accessProhibitedNamespace_Click(object sender, EventArgs e)

    {

    try

    {

    System.Net.HttpWebRequest.Create("http://intranet.contoso.com");

    output.Text = "Success";

    }

    catch (Exception ex)

    {

    output.Text = "My Caught Error: " + ex.Message;

    }

    }

    void renderCrossSiteData_Click(object sender, EventArgs e)

    {

    try

    {

    SPWeb thisWeb = SPContext.Current.Web;

    SPSiteDataQuery crossSiteQuery = new SPSiteDataQuery();

    crossSiteQuery.Lists = "";

    crossSiteQuery.Webs = "";

    string message = string.Format("There are {0} lists",

    thisWeb.GetSiteData(crossSiteQuery).Rows.Count.ToString());

    output.Text = message;

    }

    catch (Exception ex)

    {

    output.Text = "My Caught Error: " + ex.Message;

    }

    }

    protected override void RenderContents(HtmlTextWriter writer)

    { base.RenderContents(writer);

    }

    }

    }

    http://intranet.contoso.com/http://intranet.contoso.com/http://intranet.contoso.com/
  • 7/27/2019 Developing on SharePoint 2010

    25/27

    Module 10: Creating Dialogs and Ribbon Controls for SharePoint 2010

    SharePoint 2010 provides new user interface components, such as server ribbons, and the new

    dialog platform. As a developer, you can create controls for the server ribbon and dialog boxes

    for the dialog platform.

    Modifying Server Ribbon is supported task in SharePoint 2010. The server ribbon uses AJAX, Dynamic Scaling as well as CSS Layouts, styling and hover

    effects.

    The Dialog user interface is a visual interface that helps users maintain context wheninteracting with content on the SharePoint site. The dialog user interface can be

    accessed by developers using the HTML elements and JavaScript.

    The dialog control is typically implemented in an HTML DIV that is made visibleprogrammatically when required.

    Module 10 - Code Snippets: Creating Dialogs and Ribbon Controls for SharePoint 2010

    The following markup is a simple example of how to add a control to the Site Actions menu.This example adds a menu item that navigates the user directly to the Solutions Gallery, without

    requiring them to go to the Site Settings page first:

    The following markup shows how to add a control to the server ribbon. This example adds a

    'Help' button to the ribbon in the same group as the built-in 'New Document', 'New Folder', and

    'Upload Document' ribbon controls:

    http://schemas.microsoft.com/sharepoint/http://schemas.microsoft.com/sharepoint/http://schemas.microsoft.com/sharepoint/http://schemas.microsoft.com/sharepoint/http://schemas.microsoft.com/sharepoint/http://schemas.microsoft.com/sharepoint/
  • 7/27/2019 Developing on SharePoint 2010

    26/27

    The following code is the source for a Visual Web Part that includes a dialog control that enablesthe user to change the site title. The JavaScript code uses the client object model to make the

    changes requested by the user.Note:The code shows good practice by only showing the hyperlink for changing the site titleafter the client object model has loaded the Web object.

    Change Site Title

    Site Title Changer


    var clientCtx;

    var thisWeb;

    var thisDialog;

  • 7/27/2019 Developing on SharePoint 2010

    27/27

    _spBodyOnLoadFunctionNames.push("Initialize()");

    function Initialize() {

    clientCtx = SP.ClientContext.get_current();

    thisWeb = clientCtx.get_web();

    clientCtx.load(thisWeb);

    clientCtx.executeQueryAsync(onWebLoaded,null);

    }

    function onWebLoaded() {

    var linkChanger = document.getElementById("linkChanger");

    linkChanger.style.display = "inline";

    }

    function showTitleChanger() {

    var divEditSiteTitle = document.getElementById("divEditSiteTitle");

    divEditSiteTitle.style.display = "block";

    var dialog = { html: divEditSiteTitle, width: 200, height: 200};

    thisDialog = SP.UI.ModalDialog.showModalDialog(dialog);

    }

    function hideTitleChanger() {

    thisDialog.close();

    }

    function changeTitle() {

    thisWeb.set_title(siteTitle.value);

    thisWeb.update();

    clientCtx.executeQueryAsync(onTitleUdated, null);

    }

    function onTitleUdated() {

    hideTitleChanger();

    }