Converting Enumerations

I love Enums – but I always have to look up how to convert them to one thing or another – so a reminder for myself:

Here’s my enumeration:

    public enum MyEnum
    {
        Alpha,
        Beta,
        Gamma
    }  

And the conversions (each enumeration item has a value (e.g. 1) and a string (e.g. “Beta”):

MyEnum someEnum = MyEnum.Beta;

//Convert to String
string someEnumString = someEnum.ToString();

//Convert to MyEnum again
MyEnum someEnum2 = (MyEnum)Enum.Parse(typeof(MyEnum), someEnumString);

//Convert to int value
int someEnumInt = (int)someEnum;

//Convert int to My Enum again
MyEnum someEnum3 = (MyEnum)someEnumInt;

List Type Icons for Custom List Definitions

In SharePoint, different types of list can have different icons:

That’s fine, but SharePoint 2010 adds a second icon – one that’s used in the Silverlight control for creating new Sites/Lists:

I wanted to specify that for a list definition I was upgrading from a 2007 version. But there doesn’t seem to be a property to set the name/url for this file.

In SharePoint 2007 the icons were usually .GIF files. In SharePoint 2010, those still seem to be in the IMAGES folder in 14-Hive, but there are .PNGs of the same images too. There are also the larger PNGs used by the SilverLight control.  The small sized ones all seem to be called ‘ITxxx.PNG’, and the larger ‘LTxxx.PNG’:

So, I tried changing the Image property of my list definition to use a file with a .png extension (e.g. ITandy.png )

I converted my GIF to PNG format, and I created a 64×64 pixel PNG for the SilverLight control. I called this new PNG file LTandy.png – and low, the SilverLight control picked it up. It seems that the Silverlight dialog replaces the IT at the start of the image file name with an LT when looking for an icon - but only for lists where the smaller icon also has the .png extention.

Therefore, I’d recommend always using PNGs for icons in SharePoint now.

Outlook Plugin – Finding the ImageMSO for the ribbon

Ages ago, I wrote an Outlook plugin for saving emails (.msg files) from Outlook 2003 to SharePoint 2007. Well, the time had come to upgrade that to Outlook 2010. Broadly speaking, that went well, with one exception – what icon to show in the ribbon?

I didn’t want to go through the pain of designing my own icon (in its various different sizes), so I decided to highjack one of the office ones. The customer I was dealing with wanted the ‘Filing cabinet’ icon of the ‘Auto Archive Settings’ button.

AutoArchive settings on the ribbon

Fine, no problem, it’s built in – in it’s various sizes and resolutions. Except – what is its ID? Continue reading

SharePoint 2010 Theme colours

Themes in SharePoint 2010 are so much better than 2007 – and so much easier to generate! You can either create them with a .thmx file from PowerPoint, or just set them up through the user interface.

One problem, though, is what areas of the page are controlled by these colours? Well, I’d been going to set up an experiment to find out, but fortunately Erik Swenson had already taken the time to map this out. So, rather than reinvent the wheel, I’ll just use that – it’s well worth a read.

SharePoint 2010 Certifications

A bit of a glory post, but I’m now SharePoint 2010 Certified:

Regarding the certifications, I was, to be honest, a little disappointed. I felt that the 2010 exams were actually easier than the 2007 ones. I suspect that this is due to the significant expansion of ways of developing with SharePoint 2010; the exams did feel like they were ‘shallow but wide’ rather than ‘focused but deep’. Certainly it seems like a big jump from this to Certified Master.

I do like the new two tier certification structure (Technical Specialist, then Professional developer), and the streaming into Admin/configuration and Development makes sense too. I just wonder if there needs to be further breakdown in these aspects, perhaps so a greater depth of knowledge can be tested.

Still, I’m offically not a total muppet.

Icons for SharePoint 2010′s ribbon

Came across something interesting today – I went looking for an icon in SharePoint 2010′s ribbon, and came to a file called formatmap32x32.png. Interestingly, it contains:

So, it actually holds lots of icons, but the image is cropped using CSS at display time to only show one of those icons. Nice to be able to see a bunch of the icons in one place easily.

(Though not all buttons come from this file – other icons are ‘stand alone’)

New Ribbon Tab Groups and their Templates

I had a curious problem today. I was registering Custom Actions to create a TabGroup with a single Button control on SharePoint’s ribbon:

I did this following Chris O’Brien’s post about “Adding ribbon items to existing tabs/groups“. It worked well, except that as we’re not registering the custom action against a particular list type (e.g. “101″), this button will appear on any list using the tab specified in the CommandUIDefinition‘s Location. Continue reading

Programmatically making a Field Required in SharePoint 2007

One of my colleagues asked an interesting question – programmatically, he’d just added a Site Column to a list, and now he wanted to make that column required on that list. The SPField class had a Required property, and on MSDN this is described as

Gets or sets a Boolean value that determines whether users must enter a value for the field on New and Edit forms.

However, this wasn’t what seemed to happen – although he’d set this to true and update the field, it didn’t make the field required.

He came and asked me why – and I didn’t really know. We knew that the radio button on the column settings did what we wanted …

… so we cracked open reflector to take a look. And this is what we found:

Yup, that’s right – if the field is on a list, the list uses content types, and “Advanced Management of Content Types” isn’t set, then the code gets the first (i.e. Default) content type, and sets the SPFieldLink that relates to that field to be required. Finally, it saves changes to the content type.

So, on a list that doesn’t use content types, to make a field required, you have to update the content type. Interesting…

Getting levels of the SharePoint Heirarchy and their Exceptions

Something that I have to do time and again is get some element of SharePoint’s heirarchy, such as a site collection, site, list or item. This is pretty typical – that’s why we all use USING to ensure proper disposal of SPSites and SPWebs, right? But what happens if the thing you’re after isn’t there? What exception get’s thrown?

Well, this should be pretty clear:

try
{
    //FileNotFoundException if doesn't exist
    using (SPSite site = new SPSite(siteGuid))
    {
        //FileNotFoundException if doesn't exist
        using (SPWeb web = site.OpenWeb(webGuid))
        {
            //SPException if doesn't exist
            SPList list = web.Lists[listGuid];

            //ArgumentException if doesn't exist
            SPListItem item = list.GetItemByUniqueId(itemGuid);
        }
    }
}
catch (System.IO.FileNotFoundException fileEx2)
{
    // Site or Site Collection Not Found
}
catch (SPException spEx2)
{
    // List not found
}
catch (ArgumentException argEx2)
{
    // Item not found
}

Hopefully that might prove useful to someone – and a good reminder for me.

Hide Column type from Lists

So, you’ve created a new custom Field (or column) type, but you don’t want it to be available to add directly to Lists and Libraries – that is, you want to force users to create columns as Site Columns, and add those to the list. Conversely, maybe you want to prevent a column being created as a Site column, and only available to add directly to lists (though I can’t thinik why).

Well, it turns out that that is possible. In the CAML defining your field in fldtypes_???.xml, you can have something like the following:

<FieldTypes>
    <FieldType>
        <Field Name="TypeName">MyCustomField</Field>
        <Field Name="ParentType">MultiChoice</Field>
        <Field Name="TypeDisplayName">My Custom Field</Field>
        <Field Name="ShowOnColumnTemplateCreate">TRUE</Field>
        <Field Name="ShowOnListCreate">FALSE</Field>
        <Field Name="ShowOnDocumentLibraryCreate">FALSE</Field>
        <Field Name="ShowOnSurveyCreate">FALSE</Field>       
        <Field Name="Sortable">FALSE</Field>
        <Field Name="Filterable">TRUE</Field>
        <Field Name="ShowInEditForm">FALSE</Field>
        <Field Name="UserCreatable">TRUE</Field>

ShowOnColumnTemplateCreate controls visibility as a Site Column type. The other ‘Show On X’ values control visibility as a List Column Type for different types of List. You could, therefore, have a Column Type that can only be used on, say, Document Libraries. Hope that helps.