Ограничение символов в текстовом поле - PullRequest
0 голосов
/ 13 апреля 2011

В текстовом поле оно должно позволять пользователю вводить только шесть десятичных знаков. Например, 1,012345 или 1,012345.

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

Пожалуйста, обратитесь к приведенному ниже коду.

private void textBox1_KeyDown_1(object sender, KeyEventArgs e)
{
    bool numericKeys = (
        ( ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) ||
           (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9)) &&
              e.Modifiers != Keys.Shift)  ||
              e.KeyCode == Keys.OemMinus  ||
              e.KeyCode == Keys.OemPeriod ||
              e.KeyCode == Keys.Decimal   ||
              e.KeyCode == Keys.Oemcomma
        );

    bool navigationKeys = (
        e.KeyCode == Keys.Up ||
        e.KeyCode == Keys.Right ||
        e.KeyCode == Keys.Down ||
        e.KeyCode == Keys.Left ||
        e.KeyCode == Keys.Home ||
        e.KeyCode == Keys.End ||
        e.KeyCode == Keys.Tab);

    bool editKeys = (e.KeyCode == Keys.Delete ||
                     e.KeyCode == Keys.Back);

    TextBox aTextbox = (TextBox)sender;
    aTextbox.Text = "2,33333";

    if (!string.IsNullOrEmpty(aTextbox.Text))
    {
        double maxIntensity;
        string aTextValue = aTextbox.Text;
        bool value = double.TryParse(aTextValue,
                                     NumberStyles.Any,
                                     CultureInfo.InvariantCulture.NumberFormat,
                                     out maxIntensity);

        if (value)
        {
            string aText = maxIntensity.ToString();
            MessageBox.Show("the value is {0}", aText);
            string[] args = aText.Split('.');

            if (numericKeys)
            {
                bool handleText = true;

                if (args.Length > 2)
                {
                    handleText = false;
                }
                else
                {
                    if (args.Length == 2 && args[1] != null && args[1].Length > 5)
                    {
                        handleText = false;
                    }
                }

                if (!handleText)
                {
                    e.SuppressKeyPress = true;
                    e.Handled = true;
                }
            }
        }
    }

    if (!(numericKeys || editKeys || navigationKeys))
    {
        e.SuppressKeyPress = true;
        e.Handled = true;
    }
}

Для достижения культурного нейтралитета текстовое значение сначала преобразуется в double, а затем значение double преобразуется в string.

bool value = double.TryParse(aTextValue,
                             NumberStyles.Any,
                             CultureInfo.InvariantCulture.NumberFormat,
                             out maxIntensity);

if (value)
{
    string aText = maxIntensity.ToString();
}

Разделение строк для разделения реальной части и части мантиссы (хранятся обе строки), затем я проверяю длину части мантиссы. Если длина строки больше 5, я бы хотел нажать клавишу.

Есть ли другой способ сделать это?

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Мне повезло с кодом, подобным следующему:

public class RegexMaskedTextBox : TextBox
{
    private Regex _regex = new Regex(string.Empty);

    public string RegexPattern
    {
        get { return _regex.ToString(); }
        set { _regex = new Regex(value); }
    }

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        string sNewText = this.Text;
        string sTextToInsert = e.KeyChar.ToString();
        if (this.SelectionLength > 0)
        {
            sNewText = this.Text.Remove(this.SelectionStart, this.SelectionLength);
        }
        sNewText = sNewText.Insert(this.SelectionStart, sTextToInsert);
        if (sNewText.Length > this.MaxLength)
        {
            sNewText = sNewText.Substring(0, this.MaxLength);
        }
        e.Handled = !_regex.IsMatch(sNewText);
        base.OnKeyPress(e);
    }
}
0 голосов
/ 13 апреля 2011

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

Может быть, вы хотите проверить это: Регулярное выражение для десятичного числа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...