В качестве обходного пути для проблемы, я думаю, мне нужно обрабатывать события 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);
}





Взгляните на System.Text.Encoding.ASCII и System.Text.Encoding.Default
Пытаться:
KeysConverter converter = new KeysConverter();
string key = converter.ConvertTo(e.KeyCode, typeof(string));
Но очень странно поведение, которое вы описываете. В таких случаях вы должны получить KeyPress ... Попробуйте сделать простой пример (просто форму с KeyPreview = true и обработанным событием KeyPress) и посмотрите, что вы получите. Также проверьте на языковой панели, когда форма отображается, возможно, есть способ ввода, отличный от ожидаемого.
Если вам кажется, что ваш DataGridView перехватывает события клавиатуры до того, как они достигнут вашего дочернего элемента управления, вы можете предоставить свои собственные обработчики для событий клавиатуры, которые вас интересуют, непосредственно на DataGridView и в обработчике. метод (ы), (1) подавить нормальную обработку события DataGridView и / или (2) вручную передать событие вашему дочернему элементу управления?
Я все еще отлаживаю это. Секретный маленький дочерний элемент управления редактированием поля со списком - это получение сообщений WM_KEYDOWN, WM_CHAR и WM_KEYUP. Я не понимаю ....
Смотрите мой пост выше. Я не думаю, что вам вообще нужно идти по этому пути. Кроме того, переопределение этих сообщений может доставить вам больше проблем, чем вы просите, поскольку базовый элемент управления может ожидать определенного ввода и реагировать на него, то есть так, что раскрывающийся список не закрывается автоматически, когда он должен.
Многие элементы управления переопределяют события ввода с клавиатуры по умолчанию. Например, по умолчанию 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 в отдельном файле и поместить туда код отвергать. Извините, если я описываю что-то очевидное, но немного сложно угадать ваше точное происхождение.
Простое поле со списком в простом приложении дает мне события KeyPress. Я подозреваю, что DataGridView перехватывает сообщения. Он не знает об этих инопланетных детях, которых я поместил в его коллекцию Control.