Что, если есть, печатный символ сделал пользовательский тип на основе значений в данном System.Windows.Forms.KeyEventArgs? - PullRequest
3 голосов
/ 13 октября 2008

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

KeyDown предоставляет мне объект KeyEventArgs с правами KeyCode, KeyData, KeyValue, Модификаторы, 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);
    }

Ответы [ 4 ]

3 голосов
/ 26 ноября 2009

Многие элементы управления отменяют события ввода по умолчанию. Например, 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

0 голосов
/ 13 октября 2008

Попробуйте:

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

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

0 голосов
/ 14 октября 2008

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

0 голосов
/ 13 октября 2008

Посмотрите на System.Text.Encoding.ASCII и System.Text.Encoding.Default

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