作为问题的解决方法,我认为我必须处理KeyDown事件以获取用户实际键入的可打印字符。
KeyDown为我提供了KeyEventArgs对象,其中包含KeyCode,KeyData,KeyValue,Modifiers,Alt,Shift,Control等特性。
我的第一次尝试只是将KeyCode视为ascii代码,但键盘上的KeyCode是46,句号(“。”),所以当用户键入删除键时,我最终打印一段时间。所以,我知道我的逻辑不足。
(对于那些好奇的人来说,问题是我在DataGridView的控件集合中有自己的组合框,不知何故我输入的某些字符不会产生KeyPress和TextChanged ComboBox事件。这些字母包括Q,$,%。 ...
此代码将重现该问题。生成一个表单应用程序并用此代码替换ctor。运行它,尝试在两个combox中键入字母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);
}
答案 0 :(得分:3)
许多控件覆盖默认键输入事件。例如,小组默认情况下不会对它们作出回应。至于简单控件的情况,您可以尝试:
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
或者这个资源可能解决您的问题:
答案 1 :(得分:0)
查看System.Text.Encoding.ASCII和System.Text.Encoding.Default
答案 2 :(得分:0)
尝试:
KeysConverter converter = new KeysConverter();
string key = converter.ConvertTo(e.KeyCode, typeof(string));
但是你所描述的行为很奇怪。在这些情况下你应该得到KeyPress ...... 尝试做一个简单的例子(只是一个KeyPreview = true和KeyPress事件处理的表单),看看你得到了什么。同时在显示表单时检查语言栏,可能存在与预期不同的输入法。
答案 3 :(得分:0)
就像扔掉那里的想法一样,如果您的DataGridView
看起来像是在拦截键盘事件才能触及您的子控件,您是否可以直接为您感兴趣的键盘事件提供自己的处理程序DataGridView
,以及处理程序方法,(1)抑制DataGridView
对事件的正常处理,和/或(2)手动将事件传递给您的子控件?