我需要创建一个允许十进制文本独占或整数文本的WinForms文本框。另外,我不希望被要求指定掩码中文本的长度;用户应该能够输入他想要的任意数量的字符,只要文本适合小数或整数模具。但是,据我所知,MaskedTextBox不允许可变长度掩蔽;我也找不到这样做的预先存在的控件。
么?我想我可以继承TextBox,覆盖OnKeyPress并在那里完成工作,但我不知道预先存在的控件是否可以更优雅地完成任务。
答案 0 :(得分:1)
NumericUpDown控件具有一些内置的十进制/整数解析行为 - 听起来可能就是您正在寻找的内容。当然,您最终也会在文本框中使用updown控件。
答案 1 :(得分:1)
试试这个:
private void TextBox1_Validating(object sender, EventArgs e)
{
string expression = "^\d{1,8}(\.\d{2,2})?$";
if (System.Text.RegularExpressions.Regex.Match(this.txt_monto_total.Text, expression).Success)
this.label_total.Visible = false;
else
this.label_total.Visible = true;
}
这不是面具,但它会告诉用户他们是否输入了错误的格式(我是通过显示标签来做的),你可以使用任何正则表达式,在我的情况下我只想要1或8的数字“。”之前的数字。在它之后.2。
答案 2 :(得分:0)
这是一个解决方案。它并不完美 - 在某些情况下它可能会吃控制字符,并且它不能干净地处理粘贴 - 但它运作良好!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace WinFormsTest
{
public partial class MaskedTextBox : TextBox
{
public enum EntryTypeEnum
{
Any,
Integer,
Decimal
}
[DefaultValue(EntryTypeEnum.Any)]
public EntryTypeEnum EntryType { get; set; }
public MaskedTextBox()
{
InitializeComponent();
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
var keyIsValid =
(EntryType == EntryTypeEnum.Any)
|| char.IsControl(e.KeyChar)
|| isValid(Text + e.KeyChar);
e.Handled = !keyIsValid;
base.OnKeyPress(e);
}
protected override void OnValidating(CancelEventArgs e)
{
e.Cancel = !isValid(Text);
base.OnValidating(e);
}
protected bool isValid(string textToValidate)
{
switch (EntryType)
{
case EntryTypeEnum.Any:
break;
case EntryTypeEnum.Decimal:
{
decimal result;
if (!decimal.TryParse(textToValidate, out result))
{
return false;
}
}
break;
case EntryTypeEnum.Integer:
{
int result;
if (!int.TryParse(textToValidate, out result))
{
return false;
}
}
break;
}
return true;
}
}
}
答案 3 :(得分:0)
经过多次搜索后,我能够在codeproject上发现一个允许可变长度数的控件。
这是Nullable Masked Edit, and a Better Masked Edit Also!项目。
请注意,您需要使用“EditMask”字段来设置Mask属性。试图设置“掩码”字段是行不通的。
我能够设置一个999.9的掩码,然后输入1.1就可以工作而无需添加前导空格。