如何防止用户在MaskedTextBox的某些位置键入字符?

时间:2013-07-08 15:17:32

标签: c# maskedtextbox

让我用这个例子来解释,假设我们有一个带有以下掩码的__-__-____ 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;
    }

0 个答案:

没有答案