First you can change the massive if-statement in the beginning as
txtsfn.Text != "" and txtsfn.Text.Length == 13 will be taken care of by the regex.
Then you have forgotten to actually add a group name to the regular expression.
private static Regex exprNumber = new Regex("^(405|505)(?19[5-9][0-9]|[2-9][0-9]{3})[0-9]{6}$");
should be
private static Regex exprNumber = new Regex("^(405|505)(?<year>(19[5-9][0-9]|[2-9][0-9]{3}))[0-9]{6}$");
This means that
m.Groups[year].Value
will
always be empty and as you have no check on that you don't notice this.
As this actually is a design issue and not a run time issue, you could add a debug print out so you at least will see the problem when debugging.
if (txtlrn.Text !="" && txtovrbn.Text != '' && txtovrts.Text != "" && txtfpfn.Text != "" && txtfpln.Text != "" && txtfpfn.Text.Length >= 2 && txtfpln.Text.Length >= 2 && txtlrn.Text.Length == 13)
{
Match m = exprNumber.Match(txtsfn.Text);
int testedYear = 0;
int.TryParse(m.Groups[year].Value, out testedYear);
if (testedYear < 1950)
Debug.WriteLine("The year is not correct: {0}", testedYear);
int currentYear = DateTime.Now.Year;
if (!m.Success || testedYear > currentYear)
{
txtsfn.Focus();
}
}