The only problem with creating a per key filter algorithm for a textbox is that it can't handle a copy and paste operation by the user (say data copied from notepad then pasted into the textbox). To compensate, patching additional code in the change event to recheck the string can get messy since you'll have to worry about the cursor position after correcting the input.

The best approach IMO, is to use the validate event. Check the input only after the user has finished entering the data for the textbox and has attempted to moved to another control. All other controls will have to have their CausesValidation property set to True.