如何防止文本框多次输入字符

时间:2015-02-17 13:02:30

标签: c# textbox keypress

我不希望文本框让用户输入字母和以下字符' - ' ''不止一次,但允许他们按下“输入”#39;键。我使用以下代码:

 private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsNumber(e.KeyChar) || e.KeyChar == 8 || e.KeyChar == '.' || e.KeyChar == '-')
            {
                return;
            }
            else
            {
                e.Handled = e.KeyChar != (char)Keys.Back;
                MessageBox.Show("X Origin Can Only Accepts Numbers, a Point '.' and a minus '-'", "ATTENTION", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

1 个答案:

答案 0 :(得分:0)

我同意来自评论者Sinatr的建议,最好以其他方式显示验证结果。也就是说,从字面上理解你的问题 - 即为了防止用户多次输入甚至允许的字符 - 一个实现可能看起来像这样:

private readonly HashSet<char> _enteredChars = new HashSet<char>();

private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
{
    if ((char.IsNumber(e.KeyChar) || e.KeyChar == 8 || e.KeyChar == '.' || e.KeyChar == '-') &&
        _enteredChars.Add(e.KeyChar))
    {
        return;
    }
    else
    {
        e.Handled = e.KeyChar != (char)Keys.Back;
        MessageBox.Show("X Origin Can Only Accepts Numbers, a Point '.' and a minus '-'", "ATTENTION", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}

这使用HashSet<char>来存储已输入的每个字符。如果按下某个键并且该字符已在该集合中(即Add()返回false),则代码将跳转到用于无效字符的相同错误处理。

您当然可以修改上面的示例来处理已经输入的&#34;&#34;场景与&#34;无效字符&#34;不同,即呈现不同的错误消息,甚至忽略那些按键。

另请注意,该集仅在此处添加。您可能希望跟踪字段中字符的删除,同时将其从HashSet<char>中删除。您可以通过直接检查每个按键的文本字段而不是使用HashSet<char>来简化此方面。那就是:

    TextBox textBox = (TextBox)sender;

    if ((char.IsNumber(e.KeyChar) || e.KeyChar == 8 || e.KeyChar == '.' || e.KeyChar == '-') &&
        !textBox.Text.Contains(e.KeyChar))

对于非常长的文本条目,这可能比基于HashSet<char>的方法慢一点。但是否则我怀疑你是否注意到了差异,对于非常短的文本条目,这甚至可能更快。

直接使用textBox.Text属性的优点是它更简单;您不必担心与目前输入的数据保持同步,因为您始终只是直接检查数据。