Continuing on my thoughts from yesterday regarding Windows Forms validation, I first began using Michael Weinhardt’s validation library on MSDN after doing a project conversion from 1.1 to 2.0, but there were a few things that I personally wanted to do that weren’t currently supported, like validation on controls like the DateTimePicker. It would have been quite easy to add support, but I began developing a picture in my mind of a slightly different approach to validation. His solution was very designer oriented, but I wanted a more code-centric approach.
What I came up with was basically a GroupValidator class that took a control and a delegate to a provided validation function. The class took care of calling the validation function by hooking into the Validating event and then setting the appropriate error message. It added the control and delegate to a collection which could then be looped through so that you could check to see if the entire group was valid. It is pretty basic, but it works quite well so far. I’d like to expand it a little bit to add more automation, but it gets the job done right now.
Here’s an example of usage:
Public Class Form1 Private _validator As New GroupValidator() Public Sub New() ' This call is required by the Windows Form Designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. _validator.AddControl(Me.TextBox1, AddressOf IsTextValid, "Text not valid") _validator.AddControl(Me.TextBox2, AddressOf IsTextValid, "Test not valid2") _validator.AddControl(Me.TextBox3, AddressOf IsTextValid, "Enter something") _validator.AddControl(Me.TextBox4, AddressOf IsTextValid, "Please") End Sub Private Function IsTextValid(ByVal c As Control) As Boolean If c.Text.Length > 0 Then Return True Else Return False End If End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MessageBox.Show(_validator.IsValid.ToString) End Sub End Class
It is pretty simple as you can see. If you’re interested in the code, drop a line and I’ll email it or post it.