2008-10-13 13 views
3

作为一个问题的解决方法,我想我必须处理KeyDown事件以获取用户实际键入的可打印字符。什么,如果有的话,可打印的字符根据给定的System.Windows.Forms.KeyEventArgs中的值做了一个用户类型?

KeyDown为我提供了一个KeyEventArgs对象,其中包含KeyCode,KeyData,KeyValue,Modifiers,Alt,Shift和Control。

我的第一次尝试只是将KeyCode作为ASCII代码,但我的键盘上的KeyCode是46,一个句点(“。”),所以我最终打印了一段时间,当用户键入删除键时。所以,我知道我的逻辑是不够的。 (对于那些好奇的人,问题是我在DataGridView的控件集合中有自己的组合框,并且某种程度上我键入的某些字符不会产生KeyPress和TextChanged组合框事件,这些字母包括Q,$,%, ....

此代码将重现该问题。生成表单应用程序,并替换此代码构造函数。运行它,尝试输入字母Q到两个comboxes。

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

有一个看看System.Text.Encoding.ASCII和System.Text.Encoding.Default

0

尝试:

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

但是很奇怪你所描述的行为。你应该在这些情况下得到KeyPress ... 尝试做一个简单的例子(只是一个KeyPreview = true和KeyPress事件处理的表单),看看你得到了什么。当显示表格时,也请检查语言栏,可能是您输入的方法与您期望的不同。

+0

在一个简单的应用程序的简单组合框给我KeyPress事件。我怀疑DataGridView正在拦截这些消息。它不知道我把它放在Control系列中的这些外星人孩子。 – 2008-10-13 20:02:53

+0

感叹,KeyConvert需要VS 2008,3.0/3.5框架... – 2008-10-13 20:05:31

+0

相似的行为:http://bytes.com/forum/thread548399.html – 2008-10-13 20:16:32

0

就像一个想法扔在那里,如果它看起来像你的DataGridView被截获键盘事件才可以达到你的孩子控制,你可以为你的DataGridView兴趣直接在键盘事件提供自己的处理程序,并在处理程序方法中,(1)抑制对事件的正常处理,和/或(2)手动将事件传递给您的子控件?

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

或者这个资源可能也许是解决问题:

http://dotnetperls.com/previewkeydown

相关问题