My Master's Thesis Problems and solutions encountered…

19Apr/100

Input validation

I needed to create a login feature, so only registered users could gain access to the Silverlight application, and I wanted to create a data validator, that would check the users' input. In the this example I just check if the user has entered an e-mail address.

Red lineError messageNo error
In the first image to the left, I have just entered my name in the E-mail address field, and entered my password. The textbox is marked with red, because there has not been registered an "@" in the field (of course, this is a very simple example. One could easily find more thorough ways of validating an e-mail address, which I will probably make a blog post about some time soon).

In the second image, the user has selected the textbox, and immediately an error message appears, explaining the user why there is a problem.

In the third image, the user has inserted a valid e-mail address and can proceed with the login feature.

So, the way to implement this feature is pretty straight-forward, especially since there is a brilliant video tutorial showing exactly how to do it. I just followed the steps on the tutorial, but I will nonetheless quickly go through the code here.

The first thing you need to know is that - as brilliant as the tutorial mentioned above may be - the code will not compile if you have the default settings on Visual Studio 2008. The tutorial does not explain that you need to make one quick settings change in order to avoid an "Arguement Exception was unhandled by User"-error message, that prevents the code from compiling.

You need to the following: Go to Visual Studio Options and then Debugging/General, and just uncheck the 'Enable Just my Code'. And that's it.

The tutorial also fails to mention a small piece of code necessary to compile, but Visual Studio helps by telling you where you need to insert the following code:

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

We'll come back to this.

How to implement the input validation:

Open your MainPage.xaml, and find the textbox whose input you want to validate. Then insert Binding statements into TextBox.Text like shown below. Notice the Path called Mail. We will use this name later.


  <TextBox width = "390" >
           <TextBox.Text>
                <Binding Mode="TwoWay"
                        Path="Mail"
                        ValidatesOnExceptions="True"
                        NotifyOnValidationError="True"
                />
          </TextBox.Text>
 </TextBox>

So, we now have a textbox that needs to be binded to a data object, so we can check when there are any changes made to it. We do this by creating a new class: Right click on your application name in the Solutions Explorer, choose Add and Class. I named my class validation.cs.

The first thing to do is to insert using System.ComponentModel; at the top, and you can delete all others system statements except the using System;. This supports the INotifyPropertyChanged, that ensures two-way binding, that is, checks if any changes are made to the object, and if there is, then the UI is updated accordingly.

Insert the following code into your validation.cs:

using System;
using System.ComponentModel;

namespace QM_v1
{
    public class validation : INotifyPropertyChanged
    {
        private string mail;

        public string Mail
        {
            get { return mail; }
            set {
                if (value.IndexOf('@') == -1)
                {
                    throw new ArgumentException("This is not a valid email address");
                }
                NotifyPropertyChanged("Mail"); // The code crashes here, if you don't change your settings, as described above.


                mail = value; }
        }

        public event PropertyChangedEventHandler propertyChanged; //mandatory event for this class. Checks the object for changes.

        private void NotifyPropertyChanged(string propertyName)
        {
                if (propertyChanged != null)
                {
                    propertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
    }
}

Notice lines 33-37: This code snippet is needed for the program to compile, but is not mentioned in the tutorial mentioned above.
Lastly, open your MainPage.xaml.cs and enter the following code in your class:

  public MainPage()
        {
            InitializeComponent();


            var m = new validation();
            LayoutRoot.DataContext = m;  //LayoutRoot = name of your Grid.

        }

And that's it!

See the working example here.

Comments (0) Trackbacks (0)

No comments yet.


Leave a comment


eight − 1 =

No trackbacks yet.