Какой печатный символ, если таковой имеется, сделал пользовательский тип на основе значений в заданном System.Windows.Forms.KeyEventArgs?

В качестве обходного пути для проблемы, я думаю, мне нужно обрабатывать события KeyDown, чтобы получить печатный символ, который фактически ввел пользователь.

KeyDown предоставляет мне объект KeyEventArgs со свойствами KeyCode, KeyData, KeyValue, Modifiers, Alt, Shift, Control.

Моя первая попытка заключалась в том, чтобы просто рассматривать KeyCode как код ascii, но KeyCode на моей клавиатуре равен 46, точка ("."), Поэтому я в конечном итоге печатаю точку, когда пользователь нажимает клавишу удаления. Итак, я знаю, что моя логика неадекватна.

(Для тех, кому интересно, проблема в том, что у меня есть собственное поле со списком в коллекции элементов управления DataGridView, и почему-то НЕКОТОРЫЕ символы, которые я набираю, не вызывают события KeyPress и TextChanged ComboBox. Эти буквы включают Q, $,% ....

Этот код воспроизведет проблему. Создайте приложение формы и замените ctor этим кодом. Запустите его и попробуйте ввести букву Q в два поля со списком.

public partial class Form1 : Form
{
    ComboBox cmbInGrid;
    ComboBox cmbNotInGrid;
    DataGridView grid;

    public Form1()
    {
        InitializeComponent();

        grid = new DataGridView();

        cmbInGrid = new ComboBox();
        cmbNotInGrid = new ComboBox();

        cmbInGrid.Items.Add("a");
        cmbInGrid.Items.Add("b");
        cmbNotInGrid.Items.Add("c");
        cmbNotInGrid.Items.Add("d");

        this.Controls.Add(cmbNotInGrid);
        this.Controls.Add(grid);
        grid.Location = new Point(0, 100);
        this.grid.Controls.Add(cmbInGrid);
    }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
545
4

Ответы 4

Взгляните на System.Text.Encoding.ASCII и System.Text.Encoding.Default

Пытаться:

KeysConverter converter = new KeysConverter();
string key = converter.ConvertTo(e.KeyCode, typeof(string));

Но очень странно поведение, которое вы описываете. В таких случаях вы должны получить KeyPress ... Попробуйте сделать простой пример (просто форму с KeyPreview = true и обработанным событием KeyPress) и посмотрите, что вы получите. Также проверьте на языковой панели, когда форма отображается, возможно, есть способ ввода, отличный от ожидаемого.

Простое поле со списком в простом приложении дает мне события KeyPress. Я подозреваю, что DataGridView перехватывает сообщения. Он не знает об этих инопланетных детях, которых я поместил в его коллекцию Control.

Corey Trager 14.10.2008 00:02

Если вам кажется, что ваш DataGridView перехватывает события клавиатуры до того, как они достигнут вашего дочернего элемента управления, вы можете предоставить свои собственные обработчики для событий клавиатуры, которые вас интересуют, непосредственно на DataGridView и в обработчике. метод (ы), (1) подавить нормальную обработку события DataGridView и / или (2) вручную передать событие вашему дочернему элементу управления?

Я все еще отлаживаю это. Секретный маленький дочерний элемент управления редактированием поля со списком - это получение сообщений WM_KEYDOWN, WM_CHAR и WM_KEYUP. Я не понимаю ....

Corey Trager 14.10.2008 18:22

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

Pedery 26.11.2009 04:51

Многие элементы управления переопределяют события ввода с клавиатуры по умолчанию. Например, по умолчанию Panel вообще не отвечает на них. Что касается простых элементов управления, вы можете попробовать:

protected override bool IsInputKey(Keys keyData) {
    // This snippet informs .Net that arrow keys should be processed in the panel (which is strangely not standard).

    switch (keyData & Keys.KeyCode) {
        case Keys.Left:
            return true;
        case Keys.Right:
            return true;
        case Keys.Up:
            return true;
        case Keys.Down:
            return true;
    }
    return base.IsInputKey(keyData);

}

Функция IsInputKey сообщает вашей программе, от каких ключей получать события. Есть вероятность, что вы получите странное поведение, если переопределите клавиши, которые явно имеют специальные функции, но немного поэкспериментируете и сами убедитесь, что работает, а что нет.

Теперь для более сложных элементов управления, таких как DataGridView или ComboBox, обработка клавиш может быть еще более сложной. Следующий ресурс должен дать вам несколько советов о том, как решить вашу проблему:

http://www.dotnet247.com/247reference/msgs/29/148332.aspx

Или этот ресурс может решить вашу проблему:

http://dotnetperls.com/previewkeydown

Ваш код редактировать просто добавляет что-то в форму. Судя по вашей оценке репутации, я предполагаю, что вы достаточно знакомы с Windows Forms. То, что вы пытаетесь сделать может, немного сложно. Все зависит от контроля и того, чего вы хотите добиться. Взгляните на две опубликованные мной ссылки. Они описывают некоторые функции, которые вы хотите изучить. Не забудьте переопределить класс ComboBox в отдельном файле и поместить туда код отвергать. Извините, если я описываю что-то очевидное, но немного сложно угадать ваше точное происхождение.

Pedery 26.11.2009 06:05

Другие вопросы по теме