3

作为解决问题的方法,我认为我必须处理 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);
    }
4

4 回答 4

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

于 2009-11-26T01:39:45.247 回答
0

Just as an idea to throw out there, if it looks like your DataGridView is intercepting keyboard events before they can reach your child control, can you provide your own handlers for the keyboard events you are interested in directly on the DataGridView, and in the handler method(s), (1) suppress the DataGridView's normal handling of the event, and/or (2) manually pass the event along to your child control?

于 2008-10-14T13:25:11.367 回答
0

看看 System.Text.Encoding.ASCII 和 System.Text.Encoding.Default

于 2008-10-13T19:27:35.753 回答
0

尝试:

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

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

于 2008-10-13T19:52:26.377 回答