【问题标题】:How do I make a error message appear when a number is types in?输入数字时如何显示错误消息?
【发布时间】:2013-03-19 19:16:54
【问题描述】:

我已将文本框设置为只能输入字母,我想知道如何在输入字母以外的任何内容时显示错误消息。以下是我的代码:

private void FirstName_KeyPress_1(object sender, KeyPressEventArgs e)
        {

            if (e.KeyChar < 65 || e.KeyChar > 122)
            {

                e.Handled = true;
            }
        }

        private void FirstName_TextChanged_1(object sender, EventArgs e)
        {

            FirstName.KeyPress += new KeyPressEventHandler(FirstName_KeyPress_1);

        }

我也试过了

         if (e.KeyChar < 65 || e.KeyChar > 122)
            {

                e.Handled = true;
            }
else 
{
MessageBox.Show (" Please enter a letter",
                            "Error Message");
}

但是一旦在数字后面输入一个字母就会出现此消息,并且在单击“确定”时不会出现此消息。它出现大约 4 次,直到消失。

谁能帮我解决这个问题?

谢谢

【问题讨论】:

  • 使用 MaskedTextBox。或者至少不要在每次更改时分配事件处理程序,而是一次,例如在表单的 Load 事件中。
  • 这是winforms,还是控制台应用,还是asp.net,还是什么?
  • @Melanie 它是 asp.net
  • 您尝试过 CustomValidator 吗?在用户移过文本框之前它不会引发错误,因此这可能不是您想要的。
  • @Melanie 我真的不知道如何使用它,因为我是 .net 的新手。

标签: c# message


【解决方案1】:

问题在于你对这个逻辑的放置。如果您希望在用户单击确定/提交按钮时显示消息,您需要在此处执行检查并显示消息。您的示例在每次输入后进行检查(因此可能会显示错误消息)。

所以你想要类似的东西;

// generate this stub by double clicking the ok/submit button in the GUI builder
private void FirstName_EnterButtonClicked(object sender, EventArgs e)
{
      char[] chars = FirstNameTextBox.Text.ToCharArray();
      bool good = true;
      int placeholder;

      for (int i = 0; i < chars.length; i++)
      {
           if (int.TryParse(chars[i], placeholder)
           {
                good = false;
                break;
           }
      }
      if (!good)
         MessageBox.Show("Names cannot contain numbers."); 
}

代码的快速解释 - 首先,我们等待用户尝试提交完整的输入,然后再验证它,而不是在添加每个字符之后。此时我们将输入字符串转换为字符数组并循环遍历它。 TryParse 如果输入是整数,则返回 true,并将占位符的值设置为该整数。如果用户输入了一个 int,如果我们将标志更改为 false,那么我们会中断,因为不需要继续检查字符串的其余部分。在循环之外,我们执行MessageBox.Show

【讨论】:

  • 这是一个非常漫长的过程,可以大大缩短
  • @DJKRAZE 更短!= 更好。
  • 更短 = 如果您可以基于使用已经内置的功能/方法获得相同的结果,则更好
  • 您的回答非常好,但我通常不同意这种心态。代码质量不是通过行数来衡量的。为缩短代码而采取的大多数措施都没有任何目的,也不会使其更具可读性。
  • 我并不是说越短越好我是说 char.IsDigit 是许多编码人员不知道的内部函数,而且在检查有效的 Alpa @987654324 方面我还没有失败@characters 这就是我要说的一切..您的代码看起来一样好我可能已经让您看到了一种更简单的方法,该方法的工作方式与您的代码相同,我最终编辑的答案考虑到检查 TextBox 中的所有值
【解决方案2】:

我更喜欢使用 javascript 来实现这些功能

函数是字母(e){ var keynum var keychar var numcheck

    if (e.keyCode >= 91 && e.keyCode <= 96)
        return false;
    keynum = e.keyCode
    keychar = String.fromCharCode(keynum)
    numcheck = /[a-zA-z ]/
    return e.returnValue = numcheck.test(keychar);

}

提交按钮的Onclientclick事件可以调用如下函数。

希望这会有所帮助:)

【讨论】:

    【解决方案3】:

    如果您想使用 Linq 并获取列表中无效项目的计数 执行以下操作

    string vStr = FirstNameTextBox.Text;
    var isValid = (from tmp in vStr
                   where char.IsDigit(tmp)
                   select tmp).ToList();
    

    你可以做一个

    ShowMessage(string.Join(",",isValid));
    

    yields 2,3,3,3 在消息框中

    【讨论】:

    • @evanmcdonnal 它确实提出了 4 个消息框
    • user2158786 开箱即用,编辑后的代码没有拿出 4 它拿出 1
    • @DJKRAZE 抱歉,我在编辑之前谈论了代码。
    • 这也不是问题,这只是您可以做什么的想法,然后我想我也会向您展示另一种方法
    • 您甚至可以再迈出一步,创建一个为您检查所有这些的方法以及一个自定义的 ShoMessage 方法,并在您只想验证 A-X、a-z 字符的任何地方使用代码相同的作品如果您只想检查数字,请在您的方法中添加一个额外的参数并传入 true 或 false,这样一种方法可以根据设置条件语句检查两者
    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2021-06-01
    相关资源
    最近更新 更多