关于c#:如何防止用户在文本框中键入特殊字符

How to prevent users from typing special characters in textbox

本问题已经有最佳答案,请猛点这里访问。

我需要在一个文本框中验证一个密码条目,我有一些要求需要完全填写以允许创建用户配置文件,其中之一是拒绝注册,如果密码包含的不是数字和字母,系统需要拒绝该条目,我尝试的一切似乎都失败了。我现在站在这里:

1
2
3
4
5
6
     private void BUT_Signup_Click(object sender, EventArgs e)
    {
     string allowedchar ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    if (!(TXT_NewPassword.Text.ToString().Contains(allowedchar)))
                    MessageBox.Show("No special characters on the password are allowed");


您可以使用LINQ:

1
2
3
4
if (!TXT_NewPassword.Text.All(allowedchar.Contains))
{
    // Not allowed char detected
}


其他人提到但未证明的另一个建议。

正则表达式也可以实现这一点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void button1_Click(object sender, EventArgs e)
{
    if (String.IsNullOrEmpty(textBox1.Text))
    {
        MessageBox.Show("Invalid password. Password cannot be empty.");
        return;
    }

    System.Text.RegularExpressions.Regex regex = null;

    regex = new System.Text.RegularExpressions.Regex("^([a-zA-Z0-9])*$");

    if (regex.IsMatch(textBox1.Text))
    {
        MessageBox.Show("Valid password.");
    }
    else
    {
        MessageBox.Show("Invalid password. Password cannot contain any special characters.");
    }
}


为什么不控制这个而不是事后检查呢?

1
2
3
4
5
6
7
8
9
10
    private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
    {
        if (e.KeyChar == (Char)Keys.Back || !allowedChar.Any(chr => chr == e.KeyChar))
        {
            e.Handled = true;
            return;
        }

        e.Handled = false;
    }

只是另一个建议……

更新:

理论上,这现在可以处理用户传递他们想要的密码,但现在包括上面的首选答案。一旦出现这种情况,每按一次键都会比这种方法更有效。


这将永远失败,因为如果包含的所有字符都无效,您将告诉它失败。你想要的,而不是你的.contains(allowedchar)就像…

1
2
3
4
if( TXT_NewPassword.Text.ToString().Any(ch => bannedChars.Contains(ch)))
{
   MessageBox.Show("No special blah blah blah");
}

其中bannedchars是所有不允许使用的字符的集合。这将遍历密码中的每个字符,如果其中任何字符在BannedChars列表中,则显示消息框。

你也许可以用regex做些更整洁的事情,但我不想花一整天的时间再去寻找regex的工作原理,所以这是你从我这里得到的最好的结果。


您正在测试密码是否包含整个allowedchar字符串。您必须用另一种方法来做,您需要测试密码中的每个字符是否都包含在allowedchars中。

下面是带解决方案想法的伪代码(不是C,但希望您能意识到您需要做什么):

1
2
3
4
    String password = myTextbox.Text;
    foreach ( Char s in password )
        if ( !allowedchar.contains(s) )
            MessageBox.Show("No special characters on the password are allowed");