【问题标题】:Numeric TextBox数字文本框
【发布时间】:2009-02-03 19:28:13
【问题描述】:

我是编程新手,我不太了解,但我正在制作一个计算器,我想使用一个只接受数字和小数的文本框,当用户从剪贴板粘贴文本时,文本框会删除任何文字字符,例如 MS calc。

请花时间解释每个部分,以便我学习或编写它并告诉我要搜索的内容。

谢谢

编辑:我会更具体:

如何在 C# 中创建数字文本框?我使用了蒙面的文本框,但它不会带小数。

我已经阅读了有关重载 OnKeyPress 方法的内容,以便它可以更正任何错误的字符,但我不知道该怎么做。

【问题讨论】:

  • 这听起来像是一个典型的家庭作业问题,除了给人的印象之外,回答的人(和他/她的时间)似乎也是理所当然的。 -1
  • 这是一个足够公平的问题,我想。 +1
  • 虽然我同意提问者应该付出更多的努力,但没有明确的迹象表明这是一个家庭作业问题。

标签: c# textbox numeric


【解决方案1】:

为您只想为数字的文本框添加一个事件处理程序,并添加以下代码:

private void textBoxNumbersOnly_KeyPress(object sender, KeyPressEventArgs e)
{
   if (Char.IsDigit(e.KeyChar) || e.KeyChar == '\b')
   {
      e.Handled = false;
   }
   else
   {
      e.Handled = true;
   }
}

这允许数字 0 到 9,以及退格(恕我直言)。允许通过'.'字符,如果你想支持小数

【讨论】:

    【解决方案2】:

    如果您仔细观察,在 Windows 计算器中,数字显示在标签而不是文本框中(它没有获得焦点)。窗口接收键盘事件。

    因此请查看表单上的 KeyPressed 和 KeyDown 事件。

    【讨论】:

      【解决方案3】:

      最简单的方法:)

      在文本框上的 Keypress 事件


      if ((e.KeyChar <= 57 && e.KeyChar >= 48) || e.KeyChar == 13 || e.KeyChar == 8)
      {
      }
      else
      {
           e.Handled = true;
      }
      

      【讨论】:

        【解决方案4】:

        框架中有一个专门用于数字输入的控件:NumericUpDown 控件。它还管理十进制值。

        【讨论】:

          【解决方案5】:
                  if ("1234567890".IndexOf(e.KeyChar.ToString()) > 0)
                  {
                      e.Handled = false;
                  }
                  else
                  {
                      e.Handled = true;
                  }
          

          【讨论】:

            【解决方案6】:

            研究 MaskedTextBox。

            这个问题有点宽泛,无法解释一切。如果您需要细节,请尝试关注问题,因为您要求很多社区“解释每个部分”。如果你问一些具体的问题(并排除“请花时间解释......”),你会得到更好的回答。

            【讨论】:

              【解决方案7】:

              据我所知,.NET 框架(至少 2.0)中没有任何原生功能可以做到这一点。您的选择是:

              1. 创建一个自定义控件 继承自文本框控件 并且只允许数字输入。这 具有控制的优点 可以重复使用。
              2. 处理 KeyPress 事件并检查 charCode 只允许数字 击键。这更容易但很多 可重复使用性较差。

              【讨论】:

                【解决方案8】:

                我可能会使用正则表达式来筛选掉非数字。

                伪代码:

                for (each item in the input string) {
                   if (!match(some regular expression, item)) {
                        toss it out
                   } else {
                        add item to text box or whatever you were going to do with it
                   }
                
                }
                

                【讨论】:

                • 我认为一些示例代码或实际的正则表达式会更有帮助,因为这是针对初学者的。
                【解决方案9】:

                这里如何在 vb.net 中执行此操作

                Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
                    Dim reg As New System.Text.RegularExpressions.Regex("[^0-9_ ]")
                    TextBox1.Text = reg.Replace(TextBox1.Text, "")
                End Sub
                

                只需根据您的特定需求修复正则表达式

                【讨论】:

                  【解决方案10】:

                  您可以使用纯文本框或标签作为计算器显示,并确保值(字符串?)始终是数字。例如,您可以保留一个双精度并在您希望显示时将其转换为字符串。

                  【讨论】:

                    【解决方案11】:

                    对于十进制数字输入很有用,但如果(右键单击并粘贴)其他文本会有一些错误。 :D

                     private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
                        {
                            string original = (sender as TextBox).Text;
                            if (!char.IsDigit(e.KeyChar))
                            {
                                e.Handled = true;
                            }
                            if (e.KeyChar == '.')
                            {
                                if (original.Contains('.'))
                                    e.Handled = true;
                                else if (!(original.Contains('.')))
                                    e.Handled = false;
                    
                            }
                            else if (char.IsDigit(e.KeyChar)||e.KeyChar=='\b')
                            {
                                e.Handled = false;
                            }
                    
                        }
                    

                    【讨论】:

                      【解决方案12】:

                      这是我根据mahasen 的回答制作的自定义控件。将它放在它自己的类文件中,并将名称空间修复为您想要的任何内容。重建解决方案后,它应该会在您的工具箱菜单选项卡中显示为一个新控件,您可以将其拖放到 Form 上。

                      using System;
                      using System.Linq;
                      using System.Windows.Forms;
                      
                      namespace MyApp.GUI
                      {
                          public class FilteredTextBox : TextBox
                          {
                              // Fields
                              private char[] m_validCharacters;
                              private string m_filter;
                              private event EventHandler m_maxLength;
                      
                              // Properties
                              public string Filter
                              {
                                  get
                                  {
                                      return m_filter;
                                  }
                                  set
                                  {
                                      m_filter = value;
                                      m_validCharacters = value.ToCharArray();
                                  }
                              }
                      
                              // Constructor
                              public FilteredTextBox()
                              {
                                  m_filter = "";
                                  this.KeyPress += Validate_Char_OnKeyPress;
                                  this.TextChanged += Check_Text_Length_OnTextChanged;
                              }
                      
                              // Event Hooks
                              public event EventHandler TextBoxFull
                              {
                                  add { m_maxLength += value; }
                                  remove { m_maxLength -= value; }
                              }
                      
                              // Methods
                              void Validate_Char_OnKeyPress(object sender, KeyPressEventArgs e)
                              {
                                  if (m_validCharacters.Contains(e.KeyChar) || e.KeyChar == '\b')
                                      e.Handled = false;
                                  else
                                      e.Handled = true;
                              }
                              void Check_Text_Length_OnTextChanged(object sender, EventArgs e)
                              {
                                  if (this.TextLength == this.MaxLength)
                                  {
                                      var Handle = m_maxLength;
                                      if (Handle != null)
                                          Handle(this, EventArgs.Empty);
                                  }
                              }
                          }
                      }
                      

                      作为奖励,我希望它在输入 3 个字符后自动切换到另一个框,因此我将框的最大长度设置为 3,并在 Form 代码中挂钩了 TextBoxFull 事件并专注于旁边的框它。这是将 4 个过滤框链接在一起以输入 IP 地址。前两个框的表单代码如下...

                          private bool ValidateAddressChunk(string p_text)
                          {
                              byte AddressChunk = new byte();
                              return byte.TryParse(p_text, out AddressChunk);
                          }
                          private void filteredTextBox1_TextBoxFull(object sender, EventArgs e)
                          {
                              var Filtered_Text_Box = (FilteredTextBox)sender;
                      
                              if (!ValidateAddressChunk(Filtered_Text_Box.Text))
                                  filteredTextBox1.Text = "255";
                              else
                                  filteredTextBox2.Focus();
                          }
                          private void filteredTextBox2_TextBoxFull(object sender, EventArgs e)
                          {
                              var Filtered_Text_Box = (FilteredTextBox)sender;
                      
                              if (!ValidateAddressChunk(Filtered_Text_Box.Text))
                                  filteredTextBox2.Text = "255";
                              // etc.
                          }
                      

                      【讨论】:

                        【解决方案13】:

                        作为新手,您最好投资于一个好的第三方工具包。例如,来自 Telerik 的 Radcontrols 有一个数字文本框,可以完成您正在寻找的内容。

                        【讨论】:

                        • 不可能!作为一个新手,他应该明确地尝试弄清楚如何自己做。事实上,他最好寻找一个合适的解决方案,而不是仅仅在 SO 询问我们。作为一名优秀的程序员,大部分时间都在弄清楚如何找到最佳方法。
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-09-07
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2015-08-31
                        相关资源
                        最近更新 更多