.net 用户根据给定System.Windows.Forms.KeyEventArgs中的值键入了什么(如果有)可打印字符?

.net 用户根据给定System.Windows.Forms.KeyEventArgs中的值键入了什么(如果有)可打印字符?,.net,winforms,datagridview,.net,Winforms,Datagridview,作为一个解决问题的方法,我认为我必须处理KeyDown事件以获得用户实际键入的可打印字符 KeyDown为我提供了一个KeyEventArgs对象,该对象的属性为KeyCode、KeyData、KeyValue、修饰符、Alt、Shift和Control 我的第一次尝试只是考虑键入代码是ASCII代码,但是KeyCode在我的键盘上是46,一个句号(“。”),所以我最终打印了一个用户键入删除键的时间。所以,我知道我的逻辑是不充分的 (对于那些好奇的人来说,问题是我在DataGridView的控件

作为一个解决问题的方法,我认为我必须处理KeyDown事件以获得用户实际键入的可打印字符

KeyDown为我提供了一个KeyEventArgs对象,该对象的属性为KeyCode、KeyData、KeyValue、修饰符、Alt、Shift和Control

我的第一次尝试只是考虑键入代码是ASCII代码,但是KeyCode在我的键盘上是46,一个句号(“。”),所以我最终打印了一个用户键入删除键的时间。所以,我知道我的逻辑是不充分的

(对于那些好奇的人来说,问题是我在DataGridView的控件集合中有自己的组合框,而我键入的某些字符不知何故不会产生KeyPress和TextChanged组合框事件。这些字母包括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));
但是你描述的行为很奇怪。在这种情况下你应该按一下键。。。
试着做一个简单的例子(只是一个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类抱歉,如果我描述的是一些显而易见的事情,但是很难猜出你的确切背景。