我是编程新手,我不太了解,但我正在制作一个计算器,我想使用一个只接受数字和小数的文本框,当用户从剪贴板粘贴文本时,文本框会删除任何文字字符,比如MS计算。
请花时间解释每个部分,以便我可以学习或编写它并告诉我要搜索的内容。
谢谢
编辑:我会更具体:
如何在 C# 中制作数字文本框?我使用了蒙面的文本框,但它不会带小数。
我已经阅读了有关重载 OnKeyPress 方法的内容,因此它可以更正任何错误的字符,但我不知道该怎么做。
为您只想为数字的文本框添加一个事件处理程序,并添加以下代码:
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 事件。
最简单的方法:)
在文本框上的 Keypress 事件
if ((e.KeyChar <= 57 && e.KeyChar >= 48) || e.KeyChar == 13 || e.KeyChar == 8)
{
}
else
{
e.Handled = true;
}
框架中有一个专门用于数字输入的控件:NumericUpDown 控件。它还管理十进制值。
if ("1234567890".IndexOf(e.KeyChar.ToString()) > 0)
{
e.Handled = false;
}
else
{
e.Handled = true;
}
在这里如何在 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
只需根据您的特定需求修复正则表达式
研究 MaskedTextBox。
这个问题有点宽泛,无法解释一切。如果您需要细节,请尝试关注问题,因为您要求很多社区“解释每个部分”。如果你问一些具体的问题(并排除“请花时间解释......”),你会得到更好的回答。
据我所知,.NET 框架(至少 2.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
}
}
您可以使用纯文本框或标签作为计算器显示,并确保值(字符串?)始终是数字。例如,您可以保留一个双精度并在您希望显示它时将其转换为字符串。
对于十进制数字输入很有用,但如果(右键单击并粘贴)其他文本会有一些错误。: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;
}
}
这是我根据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.
}
作为新手,您最好投资于一个好的第三方工具包。例如,来自 Telerik 的 Radcontrols 有一个数字文本框,可以完成您正在寻找的内容。