After much persuasion, I’ve decided to fly in the face of public opinion and record one of the songs from my SharePoint show ![]()
Stop, Collaborate and Listen:
SharePoint’s Back with a Brand New Invention.
Subscribe
joelblogs.co.uk | joelj.co.uk | joeljeffery.co.uk | jfdiphoenix.co.uk
After much persuasion, I’ve decided to fly in the face of public opinion and record one of the songs from my SharePoint show ![]()
Stop, Collaborate and Listen:
SharePoint’s Back with a Brand New Invention.
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!
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:
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:
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:
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.
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!
Full article on MSDN available here.
Enjoy!
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.
These Base Types come from the SPBaseType enumeration.
| Base Type | ID |
| Custom List | 0 |
| Document Library | 1 |
| Not used | 2 |
| Obsolete. Use 0 for discussion boards. | 3 |
| Surveys | 4 |
| Issues List | 5 |
These List Definitions come from the SPListTemplateType enumeration.
| Enumeration Name | Description | ID |
| InvalidType | Not used | -1 |
| NoListTemplate | unspecified list type | 0 |
| GenericList | Custom list | 100 |
| DocumentLibrary | Document library | 101 |
| Survey | Survey | 102 |
| Links | Links | 103 |
| Announcements | Announcements | 104 |
| Contacts | Contacts | 105 |
| Events | Calendar | 106 |
| Tasks | Tasks | 107 |
| DiscussionBoard | Discussion board | 108 |
| PictureLibrary | Picture library | 109 |
| DataSources | Data sources for a site | 110 |
| WebTemplateCatalog | Site template gallery | 111 |
| UserInformation | User Information | 112 |
| WebPartCatalog | Web Part gallery | 113 |
| ListTemplateCatalog | List Template gallery | 114 |
| XMLForm | XML Form library | 115 |
| MasterPageCatalog | Master Page gallery | 116 |
| NoCodeWorkflows | No Code Workflows | 117 |
| WorkflowProcess | Custom Workflow Process | 118 |
| WebPageLibrary | Wiki Page Library | 119 |
| CustomGrid | Custom grid for a list | 120 |
| SolutionCatalog | Solutions | 121 |
| NoCodePublic | No Code Public Workflow | 122 |
| ThemeCatalog | Themes | 123 |
| DataConnectionLibrary | Data connection library for sharing information about external data connections | 130 |
| WorkflowHistory | Workflow History | 140 |
| GanttTasks | Project Tasks | 150 |
| Meetings | Meeting Series (Meeting) | 200 |
| Agenda | Agenda (Meeting) | 201 |
| MeetingUser | Attendees (Meeting) | 202 |
| Decision | Decisions (Meeting) | 204 |
| MeetingObjective | Objectives (Meeting) | 207 |
| TextBox | Text Box (Meeting) | 210 |
| ThingsToBring | Things To Bring (Meeting) | 211 |
| HomePageLibrary | Workspace Pages (Meeting) | 212 |
| Posts | Posts (Blog) | 301 |
| Comments | Comments (Blog) | 302 |
| Categories | Categories (Blog) | 303 |
| Facility | Facility | 402 |
| Whereabouts | Whereabouts | 403 |
| CallTrack | Call Track | 404 |
| Circulation | Circulation | 405 |
| Timecard | Timecard | 420 |
| Holidays | Holidays | 421 |
| IMEDic | IME (Input Method Editor) Dictionary | 499 |
| ExternalList | External | 600 |
| IssueTracking | Issue tracking | 1100 |
| AdminTasks | Administrator Tasks | 1200 |
| HealthRules | Health Rules | 1220 |
| HealthReports | Health Reports | 1221 |
These content types come from the Content Type ID list.
| Content Type | ID |
| System | 0x |
| Item | 0×01 |
| Document | 0×0101 |
| Event | 0×0102 |
| Issue | 0×0103 |
| Announcement | 0×0104 |
| Link | 0×0105 |
| Contact | 0×0106 |
| Message | 0×0107 |
| Task | 0×0108 |
| Workflow History | 0×0109 |
| Post | 0×0110 |
| Comment | 0×0111 |
| East Asia Contact | 0×0116 |
| Folder | 0×0120 |