I am currently handling the KeyDown event of a DataGridView control. One of the columns is filled by calculated values and I want the user to be able to override the cell value if they want.
When the user presses a numeric key, the cell goes into EditMode and allows the user to override the value. If the key is not numeric, nothing happens...
That is working pretty well... the problem is that I find the code for it ugly... I can't seem to find a neat way to handle all the numeric keys in a single condition, so I've made a switch case construct to deal with all the possible numeric keys, like this:
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...]
Sure, it works, but there has to be a better and shorter way, right?
All I could find using Google is converting e.KeyCode to a char, but when using numeric keys, it goes gives letters even for the numeric values...
Thanks.
If you use the
KeyPress
event, the event signature has aKeyPressEventArgs
with aKeyChar
member that gives you the character for the numberpad keys. You can do a TryParse on that to figure out if its a number or not.Sorcerer86pt's solution was the simplest, however, when a user presses a control key, like backspace, then it breaks. To solve that problem, you can use the following snippet:
If you're using WPF, you might find that a TextBox doesn't have a KeyPressed event. To fix this, I used the following code.
You may notice the weird function call
WPFUtils.Interop.Keyboard.GetCharFromKey(e.Key)
this is one of the useful functions I've collected. You can find it here.Just get the last char from the Key that will be number if a number was pressed. This method works with KeyDown events not needing any other conditions.
Just call this static method and pass in the Key to check
Try
On the msdn help page they use this code in their example:
...