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

时间:2008-10-13 19:18:00

标签: .net winforms datagridview

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

4 个答案:

答案 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

或者这个资源可能解决您的问题:

http://dotnetperls.com/previewkeydown

答案 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)手动将事件传递给您的子控件?