WinForms - MaskedTextBox - возможно ли маскирование с переменной шириной? - PullRequest
3 голосов
/ 22 января 2010

Мне нужно создать текстовое поле WinForms, которое допускает исключительный или целочисленный текст десятичного текста. Кроме того, я не хочу указывать длину текста в маске; пользователь должен иметь возможность вводить столько символов, сколько он хочет, при условии, что текст соответствует десятичной или целочисленной форме. Однако, насколько я знаю, MaskedTextBox не допускает маскирование переменной длины; Я также не могу найти уже существующий элемент управления, который делает это.

Совет? Я полагаю, что мог бы унаследовать TextBox, переопределить OnKeyPress и выполнить там работу, но я не знаю, будет ли уже существующий элемент управления действовать более изящно.

Ответы [ 4 ]

1 голос
/ 28 июня 2011

Попробуйте это:

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 после него.

1 голос
/ 22 января 2010

элемент управления NumericUpDown имеет некоторые встроенные десятичные / целочисленные параметры синтаксического анализа - похоже, это то, что вы ищете Конечно, вы также получите обновленные элементы управления в текстовом поле.

0 голосов
/ 20 января 2012

После долгих поисков мне удалось обнаружить элемент управления для codeproject, который допускает номер переменной длины.

Это Редактируемый Nullable Masked, и Лучше Маскированный Edit также! .

Обратите внимание, что вам нужно использовать поле 'EditMask', чтобы установить свойства маски. Попытка установить поле «Маска» не будет работать.

Я смог установить маску 999,9, а затем ввести 1,1, будет работать без добавления начальных пробелов.

0 голосов
/ 23 января 2010

Вот решение. Он не идеален - в некоторых случаях он может съедать управляющие символы, и он плохо обрабатывает вставку, но работает достаточно хорошо!

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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...