Updated:
bool IsMillennium = false;
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
string CurrentYear = DateTime.Now.Year.ToString();
if (e.KeyChar == 8)
{
e.Handled = false;
return;
}
if (!char.IsNumber(e.KeyChar))
{
e.Handled = true;
return;
}
if (textBox1.TextLength >= 4)
{
if (textBox1.Text[3] == '1')
{
IsMillennium = false;
}
else if (textBox1.Text[3] == CurrentYear[0])
{
IsMillennium = true;
}
}
if (textBox1.TextLength < 13)
{
if (textBox1.TextLength < 3)
{
if (char.IsNumber(e.KeyChar))
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
else
{
if (textBox1.TextLength == 3)
{
var yearchar1 = int.Parse(e.KeyChar.ToString());
if (yearchar1 <= int.Parse(CurrentYear[0].ToString()) && yearchar1 != 0)
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
else if (textBox1.TextLength == 4)
{
var yearchar2 = int.Parse(e.KeyChar.ToString());
if (textBox1.Text[3] == '1')
{
if (yearchar2 == 9)
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
else if (textBox1.Text[3] == CurrentYear[0])
{
if (yearchar2 <= int.Parse(CurrentYear[1].ToString()))
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
}
else if (textBox1.TextLength == 5)
{
var yearchar3 = int.Parse(e.KeyChar.ToString());
if (!IsMillennium)
{
if (yearchar3 >= 5 && yearchar3 <= 9)
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
else
{
if (yearchar3 <= int.Parse(CurrentYear[2].ToString()))
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
}
else if (textBox1.TextLength == 6)
{
var yearchar4 = int.Parse(e.KeyChar.ToString());
if (!IsMillennium)
{
if (yearchar4 >= 0 && yearchar4 <= 9)
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
else
{
if (int.Parse(textBox1.Text[5].ToString()) < int.Parse(CurrentYear[2].ToString()))
{
e.Handled = false;
}
else
{
if (yearchar4 <= int.Parse(CurrentYear[3].ToString()))
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
}
}
else if (textBox1.TextLength > 6)
{
if (char.IsNumber(e.KeyChar))
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
}
}
else
{
e.Handled = true;
}
}
Edit :
well, if you done validation on key press then why you need validation on leave you already made it hard to type keys and key press event accept specific keys only.
you can validate on leave if the text have the correct length or not in your case something like that
private void textBox1_Leave(object sender, EventArgs e)
{
if(textBox1.TextLength != 10)
{
textBox1.Focus();
}
}
Please Notice that will make it so hard to user because it will prevent him from leave the textbox until he enter the correct format.