数字文本框

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

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

谢谢

编辑:我会更具体:

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

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

最简单的方法:)

在您的文本框上的Keypress事件


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

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

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

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

所以看一下表单上的KeyPressed和KeyDown事件。

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

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

研究MaskedTextBox。

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

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

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

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

伪代码:

 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 } } 

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

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

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

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

这是我根据马哈森的回答制作的自定义控件 。 将它放在它自己的类文件中,并将命名空间修复为您想要的任何内容。 重建解决方案后,它应该在“工具箱”菜单选项卡中显示为可以拖放到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. } 

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