【问题标题】:How to prevent a textbox from entering a character more than once如何防止文本框多次输入字符
【发布时间】:2015-02-17 13:02:30
【问题描述】:

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

 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);
            }
        }

【问题讨论】:

  • MaskedTextBox 可以阻止你输入数字或字母或符号,我想输入符号但只允许用户输入允许的符号一次。
  • 如果您需要通用解决方案,那么您可以检查已经输入的文本 (textBox3.Text),如果它包含应该只输入一次的内容,则阻止它。但是,看看你在做什么,你确定MessageBox 是在用户输入中间显示的好东西吗?如果用户要编辑文本并发现他无法插入例如- 因为已经有- 他必须先删除?如果我期望用户格式化输入,那么我会使用MaskedTextBox,否则 - 将在按下确认按钮后检查他的输入。
  • 此代码不允许您输入除数字和第 2 行中提到的几个符号之外的任何内容。但是,当输入禁止字符时,会弹出一个消息框,告诉他们为什么该字符没有'未在消息框中输入...无论如何我没有遇到问题,我在阻止用户多次输入上述符号时遇到问题...您知道答案吗?
  • 小心按键...有一些方法可以在文本字段中输入数据而不会触发“按键”。就像使用鼠标拖动文本一样。

标签: c# textbox keypress


【解决方案1】:

我同意评论者 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&lt;char&gt; 来存储每个已输入的字符。如果按下某个键且字符已在集合中(即Add() 返回false),代码将跳转到用于无效字符的相同错误处理。

您当然可以修改上面的示例,以与“无效字符”不同的方式处理“已输入”场景,即显示不同的错误消息,甚至忽略那些按键。

另请注意,该集合仅添加到此处。您可能希望跟踪从字段中删除的字符,同时从HashSet&lt;char&gt; 中删除它们。您可以通过直接检查每次按键而不是使用HashSet&lt;char&gt; 的文本字段来简化这方面。那就是:

    TextBox textBox = (TextBox)sender;

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

对于非常长的文本条目,这可能比基于HashSet&lt;char&gt; 的方法慢一些。但否则我怀疑你会注意到差异,对于非常短的文本条目,这可能会更快。

直接使用textBox.Text属性的好处是更简单;您不必担心与迄今为止输入的数据保持同步,因为您始终只是直接检查该数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2015-06-11
    相关资源
    最近更新 更多