数字文本框

时间:2009-02-03 19:28:14

标签: c# textbox numeric

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

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

由于

编辑:我会更具体:

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

我已经读过有关重载OnKeyPress方法的事情,所以它会纠正任何错误的字符,但我不知道这样做。

13 个答案:

答案 0 :(得分:11)

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

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,以及退格(有用的恕我直言)。允许通过'。'字符,如果你想支持小数

答案 1 :(得分:7)

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

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

答案 2 :(得分:4)

最简单的方法:)

关于文本框上的Keypress事件


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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

        if ("1234567890".IndexOf(e.KeyChar.ToString()) > 0)
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }

答案 5 :(得分:0)

这里如何在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

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

答案 6 :(得分:0)

研究MaskedTextBox。

这个问题有点宽泛,可以解释一切。如果你想要具体细节,请尝试集中这个问题,因为你要求很多社区“解释每个部分”。如果您提出一些具体问题(并排除“请及时解释......”),您会得到更好的回复。

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

伪代码:

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 :(得分:0)

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

答案 10 :(得分:0)

对于十进制数字输入很有用,但如果(右键单击并粘贴)其他文本则会出现一些错误。 :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;
        }

    }

答案 11 :(得分:0)

这是我根据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.
    }

答案 12 :(得分:-1)

作为一个新手,你可能最好投资一个好的第三方工具包。例如,Telerik的Radcontrols有一个数字文本框,可以完成你想要的工作。