Joel's SharePoint Architect Blog

SharePoint 2010, MOSS & WSS Tips and Consultancy Tales

Subscribe Subscribe  View Joel Jeffery's profile on LinkedIn
joelblogs.co.uk | joelj.co.uk | joeljeffery.co.uk | jfdiphoenix.co.uk

Category : Training

After much persuasion, I’ve decided to fly in the face of public opinion and record one of the songs from my SharePoint show Smile

Stop, Collaborate and Listen:
SharePoint’s Back with a Brand New Invention.

Technorati Tags: Comedy, Development, SharePoint, SharePoint 2010 Training, Songs, Videos

Joel’s SharePoint Show On Tour!

I’ve put an events calendar showing upcoming SharePoint Show tour dates here: http://joelblogs.co.uk/tour-dates/. I’ve got 10 shows booked in between now and the end of the 2011 in the UK and Sweden, some for SharePoint Administration and some for SharePoint Development.

Drop me a line if you’re interested!

Technorati Tags: SharePoint, SharePoint 2010, SharePoint 2010 Training

SharePoint 2010 in Visual Studio 2010 has made creating Windows Workflow Foundation (WF) workflows an awful lot easier. There are still one or two areas that can be confusing to new developers

One such region of confusion surrounds the Initiation Form – the form displayed whenever a user launches your workflow, that you can use to prompt for more information required to run your workflow. Similar uncertainty surrounds the Association Form – one that is displayed whenever a list administrator attaches your workflow to their list.

Thanks to the tooling in Visual Studio, it’s now easy to add either of these forms. Right-clicking your Workflow item in Solution Explorer and choosing “Add-> New Item” will give you:

Adding a New SharePoint Item in Visual Studio 2010

Selecting either Initiation Form or Association Form will add the appropriate artefacts to your code and also configures the Element manifest of the Workflow accordingly:

Element Manifest Changes to view Initiation Forms

Let’s say we wanted to ask the user a series of extra questions when they launch our workflow, such as their manager’s First Name, Last Name and Email Address, such that we can have access to that data within our running workflow later on.

We can now edit our new Initiation Form as an aspx page in Visual Studio. Let’s add some text boxes to capture the extra information:

image

The next question is often “how do we get this information to the workflow?” Inside the workflow itself is a SPWorkflowActivationProperties object which exposes two strings: InitiationData and AssociationData, which is respectively the data captured from the user during launch and association phases of the workflow.

The code behind for the Initiation Form has a string method called GetInitiationData(). Whatever string you return here is then available from inside your workflow using workflowProperties.InitiationData. It’s the same principle with Association Forms, GetAssociationData and AssociationData properties.

Clearly, we could go low-rent here and return a semi-colon delimited string or something naff of that ilk.

Alternatively you could store your properties temporarily in a class and then serialise that class to a string and return that. Then later in your workflow you could deserialise that back to an instance of your object.

You could put a lot of effort into this to get it really efficient, but the general principle is why not create a utility class to hold Serialise and Deserialise methods?

I’ve implemented the following candidate code using Generics to show how powerful the technique is:

public static string Serialise<T>(T item)
{
    XmlSerializer ser = new XmlSerializer(item.GetType());
    TextWriter sw = new StringWriter();
    ser.Serialize(sw, item);
    return sw.ToString();
}

public static T Deserialise<T>(string xml) where T : new()
{
    T returnObject = new T();
    XmlSerializer ser = new XmlSerializer(returnObject.GetType());
    XmlTextReader xtr = new XmlTextReader(new StringReader(xml));
    return (T)ser.Deserialize(xtr);
}

So, given a class, for example, to hold contact information:

public class Contact
{
    public string FirstName;
    public string LastName;
    public string Email;
}

You could put the following in your code behind for the Initiation Form:

// This method is called when the user clicks the button to start the workflow.
private string GetInitiationData()
{
    contact.FirstName = firstName.Text;
    contact.LastName = lastName.Text;
    contact.Email = email.Text;
    return Serialise<Contact>(contact);
}

Then in the code beside for your workflow you can get at the data again like this:

private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
    Contact contact = Deserialise<Contact>(workflowProperties.InitiationData);
    historyDescription = string.Format("Received Contact information: {0} {1} {2}",
        contact.FirstName, contact.LastName, contact.Email);
}

Hopefully this code will save you some searching and typing.

Technorati Tags: SharePoint, SharePoint 2010, SharePoint 2010 Training, SharePoint Developer

If you’re creating or editing a JavaScript file in Visual Studio and you would like some help creating Client Object Model code, you’re not alone.

It’s a little bit cryptic, but we can tell IntelliSense to include any JavaScript libraries you have on your development machine.

Simply place the following two lines at the top of your source code (watch out for line breaks!):

/// <reference path="C:\\Program Files\\Common Files\\Microsoft Shared\\Web Server Extensions\\14\\TEMPLATE\\LAYOUTS\\MicrosoftAjax.js" />
/// <reference path="C:\\Program Files\\Common Files\\Microsoft Shared\\Web Server Extensions\\14\\TEMPLATE\\LAYOUTS\\SP.debug.js" />
/// <reference path="C:\\Program Files\\Common Files\\Microsoft Shared\\Web Server Extensions\\14\\TEMPLATE\\LAYOUTS\\SP.Core.debug.js" />

Then, you can get IntelliSense when you need it the most!

Enabling IntelliSense for the JavaScript Client Object Model in SharePoint 2010

Full article on MSDN available here.

Enjoy!

Technorati Tags: Development, SharePoint 2010, SharePoint 2010 Training, SharePoint Developer, SharePoint Training

I’m often asked for a list of the IDs of the most common Base Types, List Definitions and Content Types. Especially useful if you’re writing CAML definitions of Lists, List Instances, or Content Types. Here are the lists I’ve gleaned from MSDN.

Base Types

These Base Types come from the SPBaseType enumeration.

Base Type ID
Custom List0
Document Library1
Not used2
Obsolete. Use 0 for discussion boards.3
Surveys4
Issues List5

 

List Definitions

These List Definitions come from the SPListTemplateType enumeration.

Enumeration NameDescriptionID
InvalidTypeNot used -1
NoListTemplateunspecified list type 0
GenericListCustom list 100
DocumentLibraryDocument library 101
SurveySurvey 102
LinksLinks 103
AnnouncementsAnnouncements 104
ContactsContacts 105
EventsCalendar 106
TasksTasks 107
DiscussionBoardDiscussion board 108
PictureLibraryPicture library 109
DataSourcesData sources for a site 110
WebTemplateCatalogSite template gallery 111
UserInformationUser Information 112
WebPartCatalogWeb Part gallery 113
ListTemplateCatalogList Template gallery 114
XMLFormXML Form library 115
MasterPageCatalogMaster Page gallery 116
NoCodeWorkflowsNo Code Workflows 117
WorkflowProcessCustom Workflow Process 118
WebPageLibraryWiki Page Library 119
CustomGridCustom grid for a list 120
SolutionCatalogSolutions 121
NoCodePublicNo Code Public Workflow 122
ThemeCatalogThemes 123
DataConnectionLibraryData connection library for sharing information about external data connections 130
WorkflowHistoryWorkflow History 140
GanttTasksProject Tasks 150
MeetingsMeeting Series (Meeting) 200
AgendaAgenda (Meeting) 201
MeetingUserAttendees (Meeting) 202
DecisionDecisions (Meeting) 204
MeetingObjectiveObjectives (Meeting) 207
TextBoxText Box (Meeting) 210
ThingsToBringThings To Bring (Meeting) 211
HomePageLibraryWorkspace Pages (Meeting) 212
PostsPosts (Blog) 301
CommentsComments (Blog) 302
CategoriesCategories (Blog) 303
FacilityFacility 402
WhereaboutsWhereabouts 403
CallTrackCall Track 404
CirculationCirculation 405
TimecardTimecard 420
HolidaysHolidays 421
IMEDicIME (Input Method Editor) Dictionary 499
ExternalListExternal 600
IssueTrackingIssue tracking 1100
AdminTasksAdministrator Tasks 1200
HealthRulesHealth Rules 1220
HealthReportsHealth Reports 1221

 

Content Types

These content types come from the Content Type ID list.

Content TypeID
System0x
Item0×01
Document0×0101
Event0×0102
Issue0×0103
Announcement0×0104
Link0×0105
Contact0×0106
Message0×0107
Task0×0108
Workflow History0×0109
Post0×0110
Comment0×0111
East Asia Contact0×0116
Folder0×0120

Technorati Tags: SharePoint, SharePoint 2010, SharePoint Developer