我目前正在处理DataGridView控件的KeyDown事件 . 其中一列由计算值填充,我希望用户能够在需要时覆盖单元格值 .
当用户按下数字键时,单元格进入EditMode并允许用户覆盖该值 . 如果密钥不是数字,则没有任何反应......
这工作得很好......问题是我发现它的代码很难看...我似乎找不到一个简洁的方法来处理单个条件下的所有数字键,所以我做了一个开关case构造来处理所有可能的数字键,如下所示:
switch (e.KeyCode)
{
case Keys.D0:
case Keys.D1:
case Keys.D2:
case Keys.D3:
case Keys.D4:
case Keys.D5:
case Keys.D6:
case Keys.D7:
case Keys.D8:
case Keys.D9:
case Keys.Decimal:
case Keys.NumPad0:
case Keys.NumPad1:
case Keys.NumPad2:
case Keys.NumPad3:
case Keys.NumPad4:
case Keys.NumPad5:
case Keys.NumPad6:
case Keys.NumPad7:
case Keys.NumPad8:
case Keys.NumPad9:
[code to make the cell go to editMode, etc...]
当然,它有效,但必须有更好更短的方式,对吧?
我用谷歌找到的只是将e.KeyCode转换为char,但是当使用数字键时,它甚至会为数字值提供字母...
谢谢 .
8 回答
尝试
如果使用
KeyPress
事件,则事件签名的KeyPressEventArgs
具有KeyChar
成员,该成员为您提供数字键盘的字符 . 您可以在其上执行TryParse以确定它是否为数字 .Sorcerer86pt的解决方案是最简单的,但是,当用户按下控制键(如退格键)时,它就会中断 . 要解决该问题,您可以使用以下代码段:
如果您正在使用WPF,您可能会发现TextBox没有KeyPressed事件 . 为了解决这个问题,我使用了以下代码 .
您可能会注意到奇怪的函数调用
WPFUtils.Interop.Keyboard.GetCharFromKey(e.Key)
这是我收集的有用函数之一 . 你可以找到here .更浓缩版本:
为什么使用密钥代码,当你可以使用它:
它更干净,即使微软决定改变所有的枚举,它仍然可以工作
在msdn help page上,他们在他们的示例中使用此代码:
...
如果按下一个数字,只需从Key键中获取最后一个字符 . 此方法适用于不需要任何其他条件的KeyDown事件 .
只需调用此静态方法并传入Key进行检查