Я в настоящее время обрабатываю событие KeyDown управления DataGridView. Один из столбцов заполнен расчетными значениями, и я хочу, чтобы пользователь смог переопределить значение ячейки, если они хотят.
Когда пользователь нажимает числовую клавишу, ячейка входит в EditMode и позволяет пользователю переопределять значение. Если ключ не является числовым, ничего не происходит...
Это работает вполне прилично..., проблема состоит в том, что я нахожу код для него ужасным... Я, может казаться, не нахожу аккуратный способ обработать все числовые ключи в единственном условии, таким образом, я переключился конструкция случая для контакта со всеми возможными числовыми ключами, как это:
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...]
Несомненно, это работает, но должен быть лучший и более короткий путь, правильно?
Все я мог найти Google использования, преобразовывает e. KeyCode к символу, но при использовании числовых ключей, это идет, дает буквы даже для числовых значений...
Спасибо.
Если вы используете событие KeyPress
, подпись события будет иметь KeyPressEventArgs
с элементом KeyChar
, который дает вам символ для клавиш цифровой панели. Вы можете выполнить TryParse, чтобы выяснить, число это или нет.
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
int i;
if (int.TryParse(e.KeyChar.ToString(), out i))
{
MessageBox.Show("Number");
}
}
void dataGridView1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
// Used this to find they key values.
//label1.Text += e.KeyValue;
// Check if key is numeric value.
if((e.KeyValue >= 48 && e.KeyValue <= 57) || (e.KeyValue >= 97 && e.KeyValue <= 105))
System.Console.WriteLine("Pressed key is numeric");
}
Попробуйте
if ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) ||
(e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9) ||
e.KeyCode == Keys.Decimal)
{
// Edit mode
}
На странице справки msdn они используют этот код в своем примере:
// Determine whether the keystroke is a number from the top of the keyboard.
if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
...
// Determine whether the keystroke is a number from the keypad.
if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)