WinForms - MaskedTextBox - “可变宽度”屏蔽可能吗?

时间:2010-01-22 16:36:27

标签: c# textbox winforms

我需要创建一个允许十进制文本独占或整数文本的WinForms文本框。另外,我不希望被要求指定掩码中文本的长度;用户应该能够输入他想要的任意数量的字符,只要文本适合小数或整数模具。但是,据我所知,MaskedTextBox不允许可变长度掩蔽;我也找不到这样做的预先存在的控件。

么?我想我可以继承TextBox,覆盖OnKeyPress并在那里完成工作,但我不知道预先存在的控件是否可以更优雅地完成任务。

4 个答案:

答案 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就可以工作而无需添加前导空格。