20 Jan 2011

Dev4Devs - it's coming!

Update: Event moved to the 5th March 2011 - details: http://blogs.msdn.com/b/southafrica/archive/2011/01/18/devs4devs-returns.aspx

Dev4Dev’s, my favourite event, is coming up soon! It is a free event which happens at Microsoft offices on a Saturday morning where you get to see a variety of topics! The key points that make this awesome:

  • Each presentation is 20min long – so all meat in the topics with no fluff!
  • Even though it is as Microsoft, it is not Microsoft – some fantastic non-Microsoft technologies has been shown before.
  • It’s developers presenting to developers – so no marketing nonsense.
  • You can apply to present in one of the slots – so if you want to present at bigger events (TechEd, DevDays etc…) this is a great way to get on the radar of those who make those decisions!

All the details at: Devs4Devs Returns

For me this is the first one I will miss as I will be in Seattle for MVP Summit Sad smile

12 Jan 2011

Finally an AWESOME competition for South African Developers

logoI often find too many competitions from Microsoft ignore the southern tip of Africa or focus on specific markets, like education with the great ImagineCup event. Finally us hard working developers get a great competition: Internet Explorer 9 Top Developer Competition

This competition wants* developers to either create an awesome IE 9 add-on or light up a web site with some of the new awesome IE 9 features – so if you a web dev, html monkey, C++ or .NET developer you can take part!

The prize? A trip to PDC – the conference were two years ago everyone got hand build super laptops and last year Windows Phone 7 devices**, not to mention it is where the top Microsoft development speakers meet!

So get coding, you only have until March!!

Some things you may want to check out:

* Side note: “The competition wants” really sounds like the competition is a living entity and will punish you if you don’t do this… it isn’t and it won’t.

** My guess for this year at PDC is giving everyone tablets - just looking at what was announced at CES.

11 Jan 2011

Presentation Dump: End of 2010

Previous presentation dumps:

All slides can be found at: http://www.slideshare.net/rmaclean

This is the smallest presentation dump so far, mostly because a lot of the work I did in the second half of 2010 was at public events, like Tech-Ed, and those have already been upload.  One of the big pushes I did in the last part of the year was around design of the presentation and I think the T4 presentation is a highlight of that work for me.

T4 Templates


Developing RESTful Services in .NET

Workflow Foundation 4

10 Jan 2011

What's in Microsoft.VisualBasic for C# Developers: Series Index

This page lists all the parts of the series, if a part is not hyper-linked it means that it will come up in the near future and you should subscribe to the RSS feed to get notified when it arrives.

This list is subject to change as I write posts.

04 Jan 2011

It's MVP time again


Exactly a year and a day ago, I blogged about being awarded a MVP from Microsoft and I am proud to announce that I have been awarded a MVP for a second time!

Thank you to all that were part of making this happen, I am very honoured by all of you.

What is an MVP? In short it is a thank you for helping Microsoft communities. The long version can be found here.

My planning for MVP Summit in Feb/Mar has already been done so I am looking forward to seeing the other MVP’s and product team!

I would also like to congratulate my fellow January MVP’s in particular the South African ones: Zayd Kara (ALM for the second time) and new to the MVP’s Veronique Palmer (SharePoint).

14 Dec 2010

Pulled Apart - Part XV: Understanding usage with Runtime Intelligence

Note: This is part of a series, you can find the rest of the parts in the series index.

A vital component of keeping a piece of software alive, is to keep it useful to your users – but how do you know what your users are thinking about your software and what do they think are valuable pieces of functionality?

Pull does this using a fantastic piece of software called Runtime Intelligence from PreEmptive Solutions which is easy to plug in to your application to get interesting and useful details on the usage of your application.

Lottery Winner?

Yesterday I blogged about DevExpress and today another toolset (which isn’t free) so maybe thinking I won the lottery recently – unfortunately I haven’t Sad smile 

What I found one July morning, is that PreEmptive gives away the software and services required for Runtime Intelligence FOR FREE,to CodePlex projects for them to use.

This may be the biggest secret of CodePlex and another fantastic reason to use CodePlex for your open source hosting.


imageThe first interesting stat given is how many times the application has run, for Pull that is over 700 times Open-mouthed smile It is always great to see that it is used.


You can then drill down on to the stats, which are publically available and provide details on what features are used, what OS’s and versions of the .NET Framework are available and also where in the world it is being used!


How do you add this to your application? It is really simple, just follow the official guide. My one word of warning is the ClickOnce, another great feature of CodePlex, doesn’t play well with this and so you want to be aware of that.

13 Dec 2010

Bring your hard drive to Community Night

Blue Male Student in a Graduation Cap, Reading a Book and Leaning Against a Stack of Books Clipart IllustrationIf you are coming to tomorrow’s community night, you want to bring your hard drive along because I will have some stuff to fill it up with:

Plus I hear that some prizes may be given away at the events too Winking smile

File DevExpress.csv3 KB
13 Dec 2010

Pulled Apart - Part XIV: DevExpress

Note: This is part of a series, you can find the rest of the parts in the series index.

I make no attempt to hide my love for a company called DevExpress which produces enhancements for Visual Studio and additional controls for WinForms, ASP.NET Web Forms, ASP.NET MVC, WPF & Silverlight.

When I started with Pull I used mostly the standard WinForm controls and over time have changed it be almost 100% DevExpress controls for a number of reasons:

  • Rudi Grobler, Silverlight expert sits across the partition from me and loves to point out how ugly standard WinForms is compared to Silverlight. DevExpress helps me make my applications look MUCH better.
  • Every line of code has a cost to it and the value of that line of code decreases overtime. So standing on the shoulders of giants means my cost of development is MUCH less. This also means I focus on the business aspects and not on the UI aspects.
  • There is a lot of parity between DevExpress controls over different platforms, so if I want to change platform (for example to Silverlight) then I know the feature set will be close, lot’s of code could be reused.

Below is the first public version of Pull, which uses just DevExpress GroupBoxes, the rest is all WinForms:


versus the UI currently in development (for the January 2011 release) where only the status bar and web browser control are not from DevExpress! I think you will agree it looks way better now, plus there are many new features there (like filtering grids) which were not supported previously.


Grid Extensions

For the January 2011 release we switched to the DevExpress grids, which meant a lot of code needed to be changed (or just deleted) and I ended up writing a few extensions for the grids which I believe may be of use to other people:

Return a collection selected items

Rather than working with a collection of selected rows, this allows you to get the values of the selected rows:

public static IEnumerable<T> SelectedItems<T>(this ColumnView view) where T : class
    foreach (int selectedRowHandle in view.GetSelectedRows())
        T item = view.GetRow(selectedRowHandle) as T;
        yield return item;

Select a collection of items

The grid normally lets you select a single row or a continuous range, however often I want to provide a list of item values and have the rows which match those values selected:

public static void SelectRows<T>(this GridView view, IList<T> selectedItems) where T : class
    foreach (T selectedItem in selectedItems)
        for (int counter = 0; counter < view.DataRowCount; counter++)
            T item = view.GetRow(counter) as T;
            if (item == selectedItem)

Layouts and Strings

You can persist the layout of the grid to a stream, the registry or XML file. However I have a settings file and I would like to save and restore the layout from strings so I can easily add it to my settings file:

public static string SaveLayoutToString(this GridView view)
    MemoryStream gridStream = new MemoryStream();
    view.SaveLayoutToStream(gridStream, OptionsLayoutBase.FullLayout);
    gridStream.Position = 0;
    using (StreamReader reader = new StreamReader(gridStream))
        return reader.ReadToEnd();

public static void RestoreLayoutFromString(this GridView view, string layout)
    if (!string.IsNullOrWhiteSpace(layout))
        using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(layout)))
            stream.Position = 0;
            view.RestoreLayoutFromStream(stream, OptionsLayoutBase.FullLayout);

Enum + Grid + Images = Headache

imageI have an enum for the podcast state and rather than show the text, which is the default, I want to show an image on the cell. However this is not the easiest thing to figure out since there is no designer support for this Sad smile However you can do most of this in the designer and then only need one line of code per enum value Smile.

Step 1

Set the Column Edit property of the column to an ImageComboxBoxEdit: image

imageStep 2

On the ImageComboBoxEdit editor settings set the small images (and/or large images) property to the image list which contains the items you want to show.

It is important that you know the position (or index) of image in the image list.

Step 3

Now all you need to do is add the item values for the editor in code using the Items.Add method, which takes an ImageComboBoxItem. That class has some overloads which accept an Object for the value and here you can put in the enum value. Once this is done it all works fantastically.

You’ll note in the demo code below that I have an image index of –1 for the first item, this is so that no image is shown!

editor.Items.Add(new ImageComboBoxItem("None", PodcastState.None, -1));
editor.Items.Add(new ImageComboBoxItem("Downloading", PodcastState.Downloading, 0));
editor.Items.Add(new ImageComboBoxItem("Pending", PodcastState.Pending, 1));
editor.Items.Add(new ImageComboBoxItem("New Episodes", PodcastState.NewEpisodes, 3));
editor.Items.Add(new ImageComboBoxItem("Error", PodcastState.Error, 2));