让我用这个例子来解释,假设我们有一个带有以下掩码的__-__-____
MaskedTexBox它是mm-dd-yyyy
格式日期的掩码。
在第一个位置,只有有效月份的数量为0或1。
这部分我开始工作,所以当用户按下2到9时,它会自动生成MaskedTextBox = 02-__-____
或03-__-____
或04-__-____
... 09-__-____
等。
看到它是如何工作的,我试着继续前进到下一个位置。第二个位置,如果第一个数字为0,则唯一有效的条目为1-9;如果第一个数字为1,则为0-2。
但是,按第一个位置的第一个数字,第二个位置设置正确。但是如果用户在第二个位置退格或点击并按下假设0我想阻止用户在第一个位置已经包含0的情况下按0,因为目前它看起来像00-__-____
那是一个无效的月份。
在“日”位置(第3和第4)第3位应该只允许输入0,1,2,3。在第4位只允许某些数字取决于第3位已经有的位数。
位置4的逻辑:
如果3rd为0,则位置4只允许1-9
如果3rd为1或2,则位置4只允许0-9
如果3rd为3,则位置4只允许0-1
“年”职位(第5,第6,第7,第8)也有其自己的逻辑。但为了防止这个问题变得复杂或令人困惑,因为它可能已经存在,除非有人要求,否则我将避免发布该逻辑。
因此,MaskedTextBox字符串中的每个位置基本上都有自己需要遵循的逻辑。我已经尝试了以下代码,但我无法阻止用户在所述位置输入无效数字。我开始怀疑这样的事情是否可能是不可能的,因为我发现的其他例子阻止用户输入/输入一个不需要的字符只有1个IF / ELSE子句而且只有1 e.Handled = false
和1 e.Handled = true
。虽然我的要求很多都放在IF / ELSE的深层条款中。
使用KeyPress事件在C#中是否可以实现?
我到目前为止尝试过的代码。请原谅我一直在尝试许多选择而没有运气。我还没有完成下面代码中的“年份”逻辑,因为我想让月和日部分首先工作。
private void mtbTest_KeyPress(object sender, KeyPressEventArgs e)
{
Char pressedKey = e.KeyChar;
mtbTest.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;
int[] formatLengths = { 0 };
if (Char.IsNumber(pressedKey))
{
if (formatLengths.Contains(mtbTest.Text.Length) && Convert.ToInt32(Char.GetNumericValue(pressedKey)) > 1)
{
mtbTest.Text = String.Format("{0}0", mtbTest.Text);
}
if (mtbTest.Text.Length == 1)
{
if (Convert.ToInt32(mtbTest.Text.Substring(0, 1)) == 0)
{
if (Convert.ToInt32(Char.GetNumericValue(pressedKey)) > 1)
{
e.Handled = false;
}
}
if (Convert.ToInt32(mtbTest.Text.Substring(0, 1)) == 1)
{
if (Convert.ToInt32(Char.GetNumericValue(pressedKey)) < 2)
{
e.Handled = false;
}
}
}
if (mtbTest.Text.Length == 2 && Convert.ToInt32(Char.GetNumericValue(pressedKey)) > 3)
{
mtbTest.Text = String.Format("{0}0", mtbTest.Text);
}
if (mtbTest.Text.Length == 3)
{
if (Convert.ToInt32(mtbTest.Text.Substring(2, 1)) == 0)
{
if (Convert.ToInt32(Char.GetNumericValue(pressedKey)) > 0)
{
e.Handled = false;
}
}
}
if (mtbTest.Text.Length == 4 && Convert.ToInt32(Char.GetNumericValue(pressedKey)) > 1)
{
e.Handled = false;
}
e.Handled = true;
}
else
{
e.Handled = true;
}
mtbTest.TextMaskFormat = MaskFormat.IncludePromptAndLiterals;
}