作为解决问题的方法,我认为我必须处理 KeyDown 事件来获取用户实际键入的可打印字符。
KeyDown 为我提供了具有 KeyCode、KeyData、KeyValue、Modifiers、Alt、Shift、Control 属性的 KeyEventArgs 对象。
我的第一次尝试只是将 KeyCode 视为 ascii 代码,但我键盘上的 KeyCode 是 46,一个句点(“.”),所以当用户键入删除键时,我最终打印了一个句点。所以,我知道我的逻辑是不充分的。
(对于那些好奇的人,问题是我在 DataGridView 的控件集合中有自己的组合框,并且不知何故我键入的某些字符不会产生 KeyPress 和 TextChanged ComboBox 事件。这些字母包括 Q、$、%...。
此代码将重现该问题。生成一个 Form App 并用此代码替换 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);
}