C # - отключение ввода с клавиатуры в текстовое поле - PullRequest
3 голосов
/ 19 июля 2011

Я пытаюсь отключить все нажатия клавиш, введенные в текстовое поле, кроме следующих:

0 1 2 3 4 5 6 7 8 9. (поэтому все клавиши, кроме цифр и '.' Должны быть отключены)

Сейчас у меня есть следующий код, но он только проверяет, была ли буква введена в качестве первого значения (не говоря уже о том, что она действительно небрежная):

    private void yDisplacementTextBox_TextChanged(object sender, EventArgs e)
    {
         if (yDisplacementTextBox.Text.ToUpper() == "A" || yDisplacementTextBox.Text.ToUpper() == "B" || yDisplacementTextBox.Text.ToUpper() == "C" ||
             yDisplacementTextBox.Text.ToUpper() == "D" || yDisplacementTextBox.Text.ToUpper() == "E" || yDisplacementTextBox.Text.ToUpper() == "F" || 
             yDisplacementTextBox.Text.ToUpper() == "G" || yDisplacementTextBox.Text.ToUpper() == "H" || yDisplacementTextBox.Text.ToUpper() == "I" ||
             yDisplacementTextBox.Text.ToUpper() == "J" || yDisplacementTextBox.Text.ToUpper() == "K" || yDisplacementTextBox.Text.ToUpper() == "L" ||
             yDisplacementTextBox.Text.ToUpper() == "M" || yDisplacementTextBox.Text.ToUpper() == "N" || yDisplacementTextBox.Text.ToUpper() == "O" ||
             yDisplacementTextBox.Text.ToUpper() == "P" || yDisplacementTextBox.Text.ToUpper() == "Q" || yDisplacementTextBox.Text.ToUpper() == "R" ||
             yDisplacementTextBox.Text.ToUpper() == "S" || yDisplacementTextBox.Text.ToUpper() == "T" || yDisplacementTextBox.Text.ToUpper() == "U" ||
             yDisplacementTextBox.Text.ToUpper() == "V" || yDisplacementTextBox.Text.ToUpper() == "W" || yDisplacementTextBox.Text.ToUpper() == "X" ||
             yDisplacementTextBox.Text.ToUpper() == "Y" || yDisplacementTextBox.Text.ToUpper() == "Z")
        {
            MessageBox.Show("Please enter a numeric value for the Y Displacement.", "Y Displacement: Numbers Only Error",
                       MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }

Есть ли в любом случае его так, чтобы при нажатии все клавиши на клавиатуре (кроме цифр и кнопки с периодом) не регистрировали (или отключали) действительное значение клавиши и ничего не вводили?

Ответы [ 9 ]

5 голосов
/ 19 июля 2011

Использовать textBox1.KeyPress += textBox1_KeyPress

Этот код допускает только цифры и . и клавишу возврата.

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if ((e.KeyChar > (char)Keys.D9 || e.KeyChar < (char)Keys.D0) && e.KeyChar != (char)Keys.Back && e.KeyChar != '.')
    { 
        e.Handled = true; 
    }
    //Edit: Alternative
    if (!char.IsDigit(e.KeyChar) && e.KeyChar != (char)Keys.Back && e.KeyChar != '.')
    {
        e.Handled = true;
    }
}
1 голос
/ 19 июля 2011

Есть два способа приблизиться к этому:

  1. Подождите, пока пользователь закончит ввод данных, затем введите double.TryParse(), чтобы убедиться, что это верный номер.

  2. Используйте событие KeyPress TextBox для проверки данных при нажатии каждой клавиши.

0 голосов
/ 13 июля 2018

Самое короткое исправление для того, чтобы сделать текст / поле cmb доступным только для чтения, добавьте следующее к соответствующему событию нажатия клавиши:

private void cmbDisable_KeyPress(object sender, KeyPressEventArgs e) { e.KeyChar = (char)(0); }

0 голосов
/ 02 декабря 2013

Это также может быть использовано

if (!Char.IsDigit(e.KeyChar) && e.KeyChar != '\b' && e.KeyChar != '.'){
            e.Handled = true;}
0 голосов
/ 29 ноября 2012

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

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if ((e.KeyChar > (char)Keys.D9 || e.KeyChar < (char)Keys.D0) && e.KeyChar != (char)Keys.Back && e.KeyChar != '.')
    { 
        e.Handled = true;
        return; 
    }
    if(e.KeyChar == '.' && textBox1.Text.Contains('.'))
    {
        e.Handled = true;
    }
}
0 голосов
/ 19 июля 2011

Лучше разрешить вводить что-либо, но уведомлять поставщика ошибок об ошибке проверки (событие Validating и double.TryParse ()).

Но если вы настаиваете, обязательно замените '.' с десятичным разделителем системы. Если вы не предполагаете, что все значения являются английскими, вы легко можете столкнуться с проблемой невозможности ввода десятичного значения.

Например, я нахожусь в Хорватии, и здесь мы должны ввести запятую (,). В какой-то исламской стране я не помню, чтобы десятичный разделитель был хешем (#).

Так что будьте осторожны с проблемами локализации.

0 голосов
/ 19 июля 2011

Многие сторонние управляющие библиотеки также имеют встроенную функцию такого рода, если вы когда-либо используете одну из них.

0 голосов
/ 19 июля 2011

Вы должны подключиться к событиям KeyDown и KeyPress, чтобы предотвратить ввод нежелательных символов. Есть образец на MSDN

0 голосов
/ 19 июля 2011

Посмотрите здесь: Простой числовой текстовый блок

РЕДАКТИРОВАТЬ: В других ответах объясняется, что делать с событиями OnKeyPress / OnKeyDown, в этой статье показано, как работать с другими сценариями, каквставьте текст, поэтому я сохраню этот ответ.

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