The most solid way is to use a calendar control, it stores it's result in a datetime variable which will by definition be "valid", and generates various formatted strings for any purpose.
If you need to use a an edit then an alternative to the TryParse would be to check that there are two and only two forward slashes in the string and then do a string.Split. This will give you the three elements seperately, and then validate each element (Is array[0] > 0 and < 13 is array[1] > 0 and < 29,30,31,32 as appropriate, is array[2] >= today.year and < today.year+2, etc)
This, way you can not just report an invalid date, but report which component of the date is invalid,and why. Since you will undoubtedly get specific when you reject a theoretically valid date that doesn't fit your business rules, it's better to maintain consistency with your users and be as specific as you can all the way through validation.