【问题标题】:Validating if input is a letter in ListBox验证输入是否是 ListBox 中的字母
【发布时间】:2017-10-09 08:34:37
【问题描述】:

我有一个文本框元素,我只想接受字节值。请注意,我对 c# 很陌生,如果我遗漏了一些明显的东西,请见谅。

所以我有这段代码

  if (!byte.TryParse(last, out num) && last.Length > 1)
        {

            System.Media.SystemSounds.Asterisk.Play();
            zBox.Text = zBox.Text.Remove(last.Length - 1);

        }

所以,我希望用户在此处仅输入字节值,而除数字之外的任何其他内容都将被忽略(删除并播放声音表示输入错误)。那里的一段代码解决了第一个输入值可以是字母的问题。如果我不使用 .length > 1,那么我会得到预期。

验证输入的值是否为字节类型的最佳方法是什么?

【问题讨论】:

  • 这对你有帮助吗:stackoverflow.com/questions/5386434/…
  • 您需要删除一个已经输入的字符 - 您应该考虑在实际更改值之前进行验证。
  • @user6144226 我试图实现这一点,但我不知道该怎么做。有什么指点吗?
  • 看我的回答。该指针用于处理 PreviewTextInput 事件并设置 TextCompositionEventArgs 的 Cancel 属性。

标签: c# wpf textbox


【解决方案1】:

问题是您在if 语句中检查两个 条件,因此无论第一个字母是否为字节,检查都不会成功。尝试类似:

byte num;
if (!byte.TryParse(last, out num))
{
    System.Media.SystemSounds.Asterisk.Play();
    if (last.Length > 1)
        zBox.Text = zBox.Text.Remove(last.Length - 1);
    else if (last.Length == 1)
        zBox.Text = "";
}

阅读评论后编辑:添加else if声明

【讨论】:

  • 这里的问题是如果输入的第一个值是一个字母它不会删除它。我可以在第二个 if 语句之前添加 zBox.Text = "" 之类的东西。这适用于第一个字母,但输入第二个值并键入一个字母(例如 s)会引发 System.ArgumentOutOfRangeException。现在正试图找出原因。
  • @NikolaL.尝试编辑的代码。如果输入超过 1 个(不正确的)字母仍然会出现异常,这可能是由于 lastzBox.Text 之间的差异。在此之前缺少代码意味着我无法帮助您更正。
  • 同时,考虑到不同的 if 子句,我找到了一个似乎可以完美运行的解决方案。这是最终代码:dotnetfiddle.net/OuUGN2。你觉得可以吗?
  • @NikolaL。您的代码应该可以正常工作,但我不明白您为什么需要摆弄SelectionStartSelectionLength,因为zBox.Text = zBox.Text.Remove(zBox.Text.Length - 1); 在删除最后一个字母/数字时会自动移动插入符号。
  • 因为 Remove 出于某种原因将光标置于条目的开头。我没有进一步调查为什么会这样做,因此我做了 SelectionStart 和 SelectionLength 以将光标置于末尾。
【解决方案2】:

您可以处理PreviewTextInput 事件:

private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    TextBox tb = sender as TextBox;
    string s = tb.Text + e.Text;
    byte b;
    if (!byte.TryParse(s, out b))
    {
        e.Handled = true;
        //play sound
        System.Media.SystemSounds.Asterisk.Play();
    }
}

您可能还想处理粘贴命令:

Paste Event in a WPF TextBox

【讨论】:

  • 嗨。对不起,我只是要检查一下。这很好用。我知道这是更好的做法,所以我完全接受这个解决方案。这不是问题的直接解决方案,而是一种改进,因此我找到了它。在下面的答案中,Keyur Patel 解决方案是我最初想要的,所以这两种解决方案都很好。
猜你喜欢
  • 2016-03-05
  • 2020-03-26
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多