Определить ключ в событии KeyUp - PullRequest
4 голосов
/ 11 мая 2011

У меня есть текстовое поле в форме, где я пытаюсь определить ключи, которые вводит пользователь. TextBox состоит из нескольких слов с включенным переносом слов. Я не хочу, чтобы пользователь нажимал клавишу ввода (как я хочу, чтобы весь текст вводился в ОДНУ строку, завернутый), поэтому я использовал следующий код:

private void txtPlain_KeyPress(object sender, KeyPressEventArgs e) {
    if (e.KeyChar == (char)13) {
        MessageBox.Show("Enter keys are not allowed");
        e.KeyChar = (char)0;
    }
}

В моих тестах это работало нормально, но когда я проверял CTRL + ENTER, это не работало, так как я не уверен, как определить управляющую клавишу. По поиску я обнаружил, что мне нужно использовать события KeyUp / Down, поэтому теперь у меня есть следующий код:

private void txtPlain_KeyUp(object sender, KeyEventArgs e) {
    //if (e.KeyData == (Keys.Control | Keys.Enter)) {

    if (e.KeyCode == Keys.Enter || (e.KeyCode == Keys.Enter && e.Control)) {            
        MessageBox.Show("Enter keys are not allowed:");
        //e.KeyValue = Keys.None;
    }
}

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

Проблема с событием KeyUp / Down заключается в том, что я не знаю, как УДАЛИТЬ клавишу ввода из текста - в отличие от события KeyPress, когда я могу установить KeyChar на ноль. Событие захватывает клавиши Enter и Ctrl + Enter, но курсор по-прежнему переходит на следующую строку в TextBox.

Спасибо за любую помощь в этом.

Ответы [ 3 ]

5 голосов
/ 11 мая 2011

Хм, нет никаких причин запрещать клавишу Enter , обрабатывая события KeyDown или KeyUp.Вы можете просто установить для свойства AcceptsReturn элемента управления textbox значение False.Это не позволит многострочному текстовому полю реагировать на нажатие клавиши Enter .

Конечно, это не решает проблему Ctrl + Введите .Фактически это ожидаемый способ создания новой строки, когда для свойства AcceptsReturn установлено значение False.Чтобы решить эту проблему, вам потребуется обработать одно из событий клавиатуры и не дать элементу управления получить этот ввод.

KeyDown - хорошее место для начала.Вам нужно отфильтровать любые события клавиатуры, которые включают флаг Keys.Enter.Это поймает их независимо от того, с какой другой клавишей-модификатором они могут сочетаться.Затем, найдя нажатие клавиши Enter, вы хотите установить для свойства e.Handled значение True, чтобы предотвратить его передачу в элемент управления.

Но, к сожалению, мы еще не закончилиеще.Элемент управления textbox пытается обработать определенные ключи внутренне, и вы не сможете переопределить это в методе обработки события ключа.Вы также должны указать элементу управления не интерпретировать эту конкретную клавишу как клавишу ввода.Есть два основных способа сделать это.Первый (и рекомендуемый способ) - наследовать от базового класса TextBox, чтобы создать собственный настраиваемый элемент управления, а затем переопределить защищенный IsInputKey метод .Второй (несколько более простой) способ - просто обработать событие PreviewKeyDown и установить для свойства IsInputKey значение False.

Пример кода:

private void txtPlain_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    // Check if the KeyCode value has the Keys.Enter flag set
    if ((e.KeyCode & Keys.Enter) == Keys.Enter)
    {
        // Set the IsInputKey property to False
        e.IsInputKey = false;
    }
}

private void txtPlain_KeyDown(object sender, KeyEventArgs e)
{
    // Check if the KeyCode value has the Keys.Enter flag set
    if ((e.KeyCode & Keys.Enter) == Keys.Enter)
    {            
        // Show the user a message
        MessageBox.Show("Enter keys are not allowed in this textbox.");

        // Prevent the key event from being passed on to the control
        e.Handled = true;
    }
}
* 1040И, хотя я предполагаю, что это только для целей тестирования, вы определенно хотите убрать этот вызов MessageBox для производственного кода.Найдите другой способ предупредить пользователя о том, что его ввод запрещен, например, короткий звуковой сигнал и ErrorProvider компонент , расположенный рядом с текстовым полем.Отображение окна сообщения очень резкое и не очень удобное.См. мой ответ здесь для других советов и подсказок.
1 голос
/ 11 мая 2011
private void txtPlain_KeyUp(object sender, KeyEventArgs e) {
    //if (e.KeyData == (Keys.Control | Keys.Enter)) {

    if (e.KeyCode == Keys.Enter || (e.KeyCode == Keys.Enter && e.Control)) {            
        MessageBox.Show("Enter keys are not allowed:");
        //e.KeyValue = Keys.None;
        // mark event as handled
        e.Handled = true;
    }
} 

из MSDN ссылка

редактирование:

Я думаю, вам нужно событие нажатия клавиши, а не нажатия клавиши вверх

EDIT2
Вот некоторый протестированный код, и он работает так, как вы хотели:

        bool invalid=false;
        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if ((e.KeyCode & Keys.Enter) == Keys.Enter)
            {
                invalid = true;
            }
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (invalid)
            {
                e.Handled = true;
            }
            invalid = false;
        }
0 голосов
/ 11 мая 2011

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

Вы хотели обнаружить Ctrl + Enter. if (e.KeyData == (Keys.Control | Keys.Enter)) {..

Keys.Control и Key.Enter - это не что иное, как некоторые значения , пожалуйста, укажите . Теперь делать логично или не обязательно приведет к нажатой клавише. Абсолютно нелогичная оговорка.

Хорошо, теперь перейдем к вашей реальной проблеме, которую вы хотите обнаружить Ввод штриха и Ctrl + Ввод штриха, которые будут рассматриваться как одинаковые. Кроме того, вы хотите отменить введенный символ новой строки. Попробуйте

PreviewKeyDown или Preview активируют обработчик событий со следующим условием

если (e.KeyCode == Keys.Enter)

Дайте мне знать, если это работает

...