【发布时间】:2010-01-22 16:36:27
【问题描述】:
我需要创建一个允许十进制文本或整数文本的 WinForms 文本框。另外,我不希望被要求指定掩码中文本的长度;用户应该能够输入任意数量的字符,只要文本符合十进制或整数模式即可。但是,据我所知,MaskedTextBox 不允许变长屏蔽;我也找不到执行此操作的预先存在的控件。
建议?我想我可以继承 TextBox,覆盖 OnKeyPress 并在那里完成工作,但我不知道预先存在的控件是否会更优雅地做事。
【问题讨论】:
我需要创建一个允许十进制文本或整数文本的 WinForms 文本框。另外,我不希望被要求指定掩码中文本的长度;用户应该能够输入任意数量的字符,只要文本符合十进制或整数模式即可。但是,据我所知,MaskedTextBox 不允许变长屏蔽;我也找不到执行此操作的预先存在的控件。
建议?我想我可以继承 TextBox,覆盖 OnKeyPress 并在那里完成工作,但我不知道预先存在的控件是否会更优雅地做事。
【问题讨论】:
NumericUpDown 控件具有一些内置的十进制/整数解析行为 - 听起来可能就是您要查找的内容。当然,您最终也会在文本框上使用 updown 控件。
【讨论】:
试试这个:
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 之后。
【讨论】:
这里有一个解决方案。它并不完美 - 在某些情况下它可能会吃掉控制字符,并且它不能干净地处理粘贴 - 但它工作得很好!
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;
}
}
}
【讨论】:
经过大量搜索,我能够在 codeproject 上发现一个允许可变长度数字的控件。
这是Nullable Masked Edit, and a Better Masked Edit Also! 项目。
请注意,您需要使用“EditMask”字段来设置 Mask 属性。尝试设置“掩码”字段将不起作用。
我能够设置掩码 999.9,然后输入 1.1 即可,无需添加前导空格。
【讨论】: