我是编程的新手,我不太了解,但我正在制作一个计算器,我想使用只有数字和小数的文本框,当用户从剪贴板粘贴文本时,文本框会删除任何文字字符,如MS calc。
请花时间解释每个部分,以便我可以学习或编写它并告诉我要搜索的内容。
由于
编辑:我会更具体:
如何在C#中创建数字文本框?我使用了蒙面文本框,但它不会取小数。
我已经读过有关重载OnKeyPress方法的事情,所以它会纠正任何错误的字符,但我不知道这样做。
答案 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)可以做到这一点。您的选择是:
答案 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有一个数字文本框,可以完成你想要的工作。