.net 用户根据给定System.Windows.Forms.KeyEventArgs中的值键入了什么(如果有)可打印字符?
作为一个解决问题的方法,我认为我必须处理KeyDown事件以获得用户实际键入的可打印字符 KeyDown为我提供了一个KeyEventArgs对象,该对象的属性为KeyCode、KeyData、KeyValue、修饰符、Alt、Shift和Control.net 用户根据给定System.Windows.Forms.KeyEventArgs中的值键入了什么(如果有)可打印字符?,.net,winforms,datagridview,.net,Winforms,Datagridview,作为一个解决问题的方法,我认为我必须处理KeyDown事件以获得用户实际键入的可打印字符 KeyDown为我提供了一个KeyEventArgs对象,该对象的属性为KeyCode、KeyData、KeyValue、修饰符、Alt、Shift和Control 我的第一次尝试只是考虑键入代码是ASCII代码,但是KeyCode在我的键盘上是46,一个句号(“。”),所以我最终打印了一个用户键入删除键的时间。所以,我知道我的逻辑是不充分的 (对于那些好奇的人来说,问题是我在DataGridView的控件
我的第一次尝试只是考虑键入代码是ASCII代码,但是KeyCode在我的键盘上是46,一个句号(“。”),所以我最终打印了一个用户键入删除键的时间。所以,我知道我的逻辑是不充分的
(对于那些好奇的人来说,问题是我在DataGridView的控件集合中有自己的组合框,而我键入的某些字符不知何故不会产生KeyPress和TextChanged组合框事件。这些字母包括Q、$、% 此代码将重现此问题。生成一个表单应用程序并用此代码替换ctor。运行它,然后尝试在两个组合框中键入字母Qpublic 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));
但是你描述的行为很奇怪。在这种情况下你应该按一下键。。。
试着做一个简单的例子(只是一个KeyPreview=true且KeyPress事件已处理的表单)然后看看你得到了什么。当表单显示时,也在语言栏中检查一下,可能有一种输入方法与你期望的不同。如果你的
DataGridView
在键盘事件到达你的子控件之前就截取了,你能为它提供自己的处理程序吗直接在DataGridView
和处理程序方法中显示您感兴趣的键盘事件,(1)抑制DataGridView
对事件的正常处理,和/或(2)手动将事件传递给您的子控件?许多控件会覆盖默认的键输入事件。例如,面板在默认情况下根本不会响应这些事件。对于简单控件,您可以尝试:
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),键处理可能更复杂。以下资源应为您提供一些解决问题的方法:
或者,此资源可能会解决您的问题:
一个简单应用程序中的一个简单组合框给了我按键事件。我怀疑DataGridView正在拦截消息。它不知道我在它的控件集合中放了这些外来子项。我仍在调试这个。组合框的秘密小孩编辑控件是ketting WM_KEYDOWN、WM_CHAR和WM_KEYUP消息。我不明白…请看我上面的帖子。我认为你根本不需要走这条路。此外,覆盖这些消息可能会给你带来比你要求的更多的麻烦,因为底层控件可能需要某些输入并对此做出响应,即,这样你的下拉列表就不会在应该的时候自动关闭。你的编辑代码只是添加了一些东西从你的代表分数来看,我认为你对Windows窗体相当熟悉。你想做什么可能有点棘手。这完全取决于控件和你想要实现什么。看看我发布的两个链接。它们描述了一些你想要探索的功能。记得在单独的文件中重写ComboBox类抱歉,如果我描述的是一些显而易见的事情,但是很难猜出你的确切背景。