4

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

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

谢谢

编辑:我会更具体:

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

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

4

13 回答 13

13

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

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

于 2009-05-04T07:20:30.637 回答
7

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

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

于 2009-02-03T19:47:38.247 回答
4

最简单的方法:)

在文本框上的 Keypress 事件


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

于 2009-02-03T20:29:02.547 回答
2

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

于 2009-02-03T22:34:33.527 回答
1
        if ("1234567890".IndexOf(e.KeyChar.ToString()) > 0)
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }
于 2010-08-31T13:54:16.167 回答
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

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

于 2009-02-03T19:36:51.937 回答
0

研究 MaskedTextBox。

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

于 2009-02-03T19:37:53.633 回答
0

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

  1. 创建一个继承自文本框控件并且只允许数字输入的自定义控件。这具有可以重复使用控件的优点。
  2. 处理 KeyPress 事件并检查 charCode 以仅允许数字击键。这更容易,但可重用性要低得多。
于 2009-02-03T19:39:58.840 回答
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
   }

}
于 2009-02-03T19:40:22.630 回答
0

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

于 2009-02-03T20:08:27.800 回答
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;
        }

    }
于 2012-11-04T21:47:20.850 回答
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.
    }
于 2013-06-06T21:06:02.060 回答
-1

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

于 2009-02-03T20:19:24.470 回答