【问题标题】:specify char input only in textbox + to be able to use shortcuts仅在文本框 + 中指定字符输入,以便能够使用快捷方式
【发布时间】:2011-11-14 22:12:57
【问题描述】:

我想在 C# 中有一个只接受数字的文本框。我的做法:

    private void textBoxStart_KeyPress(object sender, KeyPressEventArgs e)
    {
        char i = e.KeyChar;
       
        if (!((i >= '0' && i <= '9') || i == 8))
            e.Handled = true;
    }

它工作正常。但我希望能够使用快捷方式(如 ctrl + v)。我该怎么做?

编辑

我想简化我的问题。但是像“使用 numericUpDown”这样的回答让我不得不展示所有问题。确切的问题是能够接受所有的数字、大写和小写字母。 NumericUpDown 只接受数字;p

编辑 2

我在 winForms 应用程序中执行此操作。

【问题讨论】:

  • 如果您没有处理它并且没有明确禁止它,则需要将控制权传递给基类 KeyPress 事件处理程序。
  • Numeric Data Entry in WPF的可能重复

标签: c# winforms textbox shortcuts


【解决方案1】:

请改用 NumericUpDown 框。

【讨论】:

  • 我想简化我的问题。确切的问题是能够接受所有的数字、大写和小写字母。 NumericUpDown 只接受数字;p
【解决方案2】:

查看 silverlight 特定的数字文本框。尽管它是 Silverlight 特定的,但这应该适用于所有 C# 代码隐藏。

How to create a numeric textbox in Silverlight?

我最终使用了 Sameh Serag 的实现并对其进行了一些修改以设置最大/最小值。它工作得很好。

【讨论】:

    【解决方案3】:

    为什么要重新创建轮子?你应该check out the masked textbox in the WPF toolkit

    你应该看看this SO question。似乎与您的问题相似。

    【讨论】:

      【解决方案4】:

      你可以用这个,虽然它可能有点矫枉过正......

      if (Regex.IsMatch(subjectString, @"[a-z\d]", RegexOptions.IgnoreCase)) {
              // Successful match
      }
      

      【讨论】:

        【解决方案5】:

        Simple Numeric TextBox提炼,基本套路如下:

        private void textBox1_KeyDown(object sender, KeyEventArgs e) {
          bool numOK = ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9 ||
                         e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9) &&
                         e.Modifiers != Keys.Shift);
        
          bool editOK = ((e.Control && e.KeyCode == Keys.V) ||
                         (e.Control && e.KeyCode == Keys.C) ||
                         (e.Control && e.KeyCode == Keys.X) ||
                         (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back));
        
          bool moveOK = (e.KeyCode == Keys.Up ||
                         e.KeyCode == Keys.Right ||
                         e.KeyCode == Keys.Down ||
                         e.KeyCode == Keys.Left ||
                         e.KeyCode == Keys.Home ||
                         e.KeyCode == Keys.End);
        
          if (!(numOK || editOK || moveOK)) {
            e.SuppressKeyPress = true;
            e.Handled = true;
          }
        }
        

        当然,通过将键盘输入限制为数字但允许使用 Control-Paste,您在控制最终用户粘贴的内容(可能是字符串)时会遇到问题。如果需要,请仔细查看链接项目——您必须覆盖 WndProc 并拦截粘贴命令,然后检查剪贴板的内容。这将要求您在从 TextBox 继承的位置创建自己的控件。

        【讨论】:

          【解决方案6】:

          看到这个:http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b95b5197-e695-4e46-ae0c-9575c7c80c5b/

          您可以在键入后使用 Validating 或 TextChanged 事件处理程序来验证输入。对于该任务,正则表达式应该是好的。这并不完美,因为会以某种方式中断用户体验。

          我想不出立即拒绝无效字符的简单方法。您应该等到控件失去焦点或类似情况。

          然后你可以尝试使用 MaskedTextBox,但 Mask 不能包含任意数量的字符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-06-04
            • 2013-09-27
            • 1970-01-01
            • 2015-02-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多