Click here to Skip to main content
13,899,749 members
Click here to Skip to main content
Add your own
alternative version


172 bookmarked
Posted 26 Jun 2005
Licenced MIT

Cristi Potlog's Wizard Control for .NET

, 21 Sep 2005
Rate this:
Please Sign up or sign in to vote.
This article introduces a sample wizard control for Windows Forms.

Sample Wizard screenshot


So I decided to make my contribution to the community. It's time to give something back.

Why do we need yet another wizard control sample, you might ask. My opinion on that is that there's never enough samples on any specific matter.


This control uses VS.NET designers to give you a native support in the IDE. You can add pages to the wizard in the same way you add pages to a tab control. You can place additional controls on the wizard pages.

The control provides run-time events for controlling page navigation. I provided a sample application, with code, to demonstrate this.

The layout of the pages is based on the Wizard 97 Specification from MSDN, particularly on Graphic Design for Wizard Art for welcome and completion pages and interior pages also.

Using the control

Start by creating a new Windows Forms application.

Change the form's name to SampleWizard. Also make the following settings:

FormBorderStyle = FormBorderStyle.FixedDialog;
MaximizeBox = false;
MinimizeBox = false;
StartPosition = FormStartPosition.CenterScreen;
Text = "Sample Wizard";

Add a reference to the compiled Controls.dll assembly. The control should appear in the toolbox now:

The control in the toolbox.

If you double click on the item in the toolbox, an empty wizard will appear on the form:

The control placed on a form.

I set the default docking style of the wizard control to DockingStyle.Fill because usually there is nothing else on a Wizard dialog than the wizard itself.

Notice that the wizard properties appear in the property grid grouped under the Wizard category.

The cotrol's properties.

There are not many properties. This is just a sample control. You can extend it in any way you like, or you may suggest new functionality to me and I just could add those properties in the future.

To add pages to the wizard, you need to click on the Pages properties ellipsis button. The WizardPage Collection Editor appears.

WizardPage Collection Editor.

Here I added the first page and set its style properties to WizardPageStyle.Welcome.

There possible values for the wizard page's Style properties are:

WizardPageStyle.Standard // Standard interior wizard page
                         // with a white banner at the top.
WizardPageStyle.Welcome  // Welcome wizard page with white background
                         // and large logo on the left.
WizardPageStyle.Finish   // Finish wizard page with white background,
                         // a large logo on the left and OK button.
WizardPageStyle.Custom   // Blank wizard page that you can
                         // customize any way you like.

There are also two properties used to specify the title and description of each page. The page draws these texts at the right location depending on the page style. Note that a Custom page does not draw its texts, you are responsible for drawing them or you may not set them at all.

To set the images that appear on the page you need to go on the wizard itself. Here is an example using the pictures I provided with this sample:

Control's image properties set.

I chose to implement the images properties at the main control level to provide a consistent look to the wizard pages. If you want each page to have its own images you may change this implementation.

The welcome page should look now like this screenshot:

The welcome page preview.

Adding and setting the other pages is pretty straightforward.

You can use the control in the same way you use a Tab control. You add pages to the Pages collection and then you place additional controls on the wizard page, just like on a TabPage.

The coolest thing is that you can switch wizard pages at design time by clicking on the Back and Next buttons.

Using the code

Here are some sample code bits of handling the wizard control's events to provide the user with validation and more interaction:

/// <summary>
/// Handles the AfterSwitchPages event of wizardSample.
/// </summary>
private void wizardSample_AfterSwitchPages(object sender, 
        CristiPotlog.Controls.Wizard.AfterSwitchPagesEventArgs e)
    // get wizard page to be displayed
    WizardPage newPage = this.wizardSample.Pages[e.NewIndex];

    // check if license page
    if (newPage == this.pageLicense)
        // sync next button's state with check box
        this.wizardSample.NextEnabled = this.checkIAgree.Checked;
    // check if progress page
    else if (newPage == this.pageProgress)
        // start the sample task

The above code shows you how to provide custom initialization of controls in the page about to be displayed.

/// <summary>
/// Handles the BeforeSwitchPages event of wizardSample.
/// </summary>
private void wizardSample_BeforeSwitchPages(object sender, 
             CristiPotlog.Controls.Wizard.BeforeSwitchPagesEventArgs e)
    // get wizard page already displayed
    WizardPage oldPage = this.wizardSample.Pages[e.OldIndex];

    // check if we're going forward from options page
    if (oldPage == this.pageOptions && e.NewIndex > e.OldIndex)
        // check if user selected one option
        if (this.optionCheck.Checked == false && 
            this.optionSkip.Checked == false)
            // display hint & cancel step
            MessageBox.Show("Please chose one of the options presented.",
                            "Sample Wizard",
            e.Cancel = true;
        // check if user choosed to skip validation
        else if (this.optionSkip.Checked)
            // skip the next page

The above code shows you how to provide custom validation before leaving a page.

/// <summary>
/// Handles the Cancel event of wizardSample.
/// </summary>
private void wizardSample_Cancel(object sender, 
             System.ComponentModel.CancelEventArgs e)
    // check if task is running
    bool isTaskRunning = this.timerTask.Enabled;
    // stop the task
    this.timerTask.Enabled = false;

    // ask user to confirm
    if (MessageBox.Show("Are you sure you wand to exit the Sample Wizard?",
                        "Sample Wizard",
                        MessageBoxIcon.Question) != DialogResult.Yes)
        // cancel closing
        e.Cancel = true;
        // restart the task
        this.timerTask.Enabled = isTaskRunning;

This code shows you how to display a confirmation message to the user when one cancels the wizard.

/// <summary>
/// Handles the Finish event of wizardSample.
/// </summary>
private void wizardSample_Finish(object sender, System.EventArgs e)
    MessageBox.Show("The Sample Wizard finished succesfuly.",

The above code simply displays a notification message after the wizard finishes.

/// <summary>
/// Handles the Help event of wizardSample.
/// </summary>
private void wizardSample_Help(object sender, System.EventArgs e)
    MessageBox.Show("This is a realy cool wizard control!\n:-)",

The above code simply displays a notification when the user presses the Help button.


I need to mention that the code is based on Al Gardner's article on wizards: Designer centric Wizard control from which I took the design-time clicking functionality. I simplified the design of the component using less classes. Everything else is pretty much built from scratch.


  • September 5th 2005. Minor corrections.
  • August 12th 2005. Overrode NewIndex on BeforeSwitchPagesEventArgs to allow page skipping and provided a new sample page to be skipped.
  • July 2nd 2005. Fixed some behaviour and added Help button.
  • June 24th 2005. Initial release.


This article, along with any associated source code and files, is licensed under The MIT License


About the Author

Cristi Potlog
Software Developer
Romania Romania
No Biography provided

You may also be interested in...


Comments and Discussions

GeneralAccept Button Pin
dermfrench28-May-07 22:50
memberdermfrench28-May-07 22:50 
GeneralRe: Accept Button Pin
dermfrench28-Jun-07 22:56
memberdermfrench28-Jun-07 22:56 
QuestionHow do I ?? Pin
Attakin19-Mar-07 9:57
memberAttakin19-Mar-07 9:57 
AnswerRe: How do I ?? Pin
Cristi Potlog19-Mar-07 21:05
memberCristi Potlog19-Mar-07 21:05 
GeneralRe: How do I ?? Pin
Attakin20-Mar-07 2:23
memberAttakin20-Mar-07 2:23 
GeneralRe: How do I ?? Pin
Arlind Cela22-Mar-07 3:46
memberArlind Cela22-Mar-07 3:46 
QuestionFinish button? Pin
Jaime Stuardo16-Mar-07 16:55
memberJaime Stuardo16-Mar-07 16:55 
AnswerRe: Finish button? Pin
Cristi Potlog19-Mar-07 21:07
memberCristi Potlog19-Mar-07 21:07 
GeneralGreat control Pin
Arlind Cela7-Mar-07 1:55
memberArlind Cela7-Mar-07 1:55 
GeneralControl is great.. Pin
soven21-Feb-07 10:56
membersoven21-Feb-07 10:56 
AnswerRe: Control is great.. Pin
Cristi Potlog27-Feb-07 10:35
memberCristi Potlog27-Feb-07 10:35 
GeneralImpressive work Pin
jimmyryan7-Feb-07 12:05
memberjimmyryan7-Feb-07 12:05 
GeneralRe: Impressive work Pin
Cristi Potlog27-Feb-07 10:31
memberCristi Potlog27-Feb-07 10:31 
QuestionDetecting Back Button Click While Validating a TextBox? Pin
lasseran17-Jan-07 6:09
memberlasseran17-Jan-07 6:09 
AnswerRe: Detecting Back Button Click While Validating a TextBox? Pin
Cristi Potlog27-Feb-07 10:43
memberCristi Potlog27-Feb-07 10:43 
GeneralThank you Pin
josepaulino2-Jan-07 19:48
memberjosepaulino2-Jan-07 19:48 
GeneralControls.dll Pin
Monkeyopolis26-Dec-06 10:43
memberMonkeyopolis26-Dec-06 10:43 
GeneralRe: Controls.dll Pin
Monkeyopolis26-Dec-06 11:01
memberMonkeyopolis26-Dec-06 11:01 
GeneralThis is .. Pin
Raj Lal1-Dec-06 13:06
memberRaj Lal1-Dec-06 13:06 
QuestionAdding Navigation Control Pin
mwieder30-Nov-06 8:15
membermwieder30-Nov-06 8:15 
AnswerRe: Adding Navigation Control Pin
Philipp Tietjen4-Dec-06 6:31
memberPhilipp Tietjen4-Dec-06 6:31 
GeneralUsing with Vista Pin
Fred Mumble19-Nov-06 6:28
memberFred Mumble19-Nov-06 6:28 
GeneralGreat tool! Pin
Michael Mendelson11-Oct-06 6:55
memberMichael Mendelson11-Oct-06 6:55 
GeneralVS 2005 Pin
Yaron Sh17-Sep-06 6:20
memberYaron Sh17-Sep-06 6:20 
GeneralRe: VS 2005 Pin
Cristi Potlog21-Sep-06 10:25
memberCristi Potlog21-Sep-06 10:25 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web04 | 2.8.190306.1 | Last Updated 21 Sep 2005
Article Copyright 2005 by Cristi Potlog
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid