2014-12-11 3 views
1

Я пытаюсь найти код, который будет, в зависимости от того, какая клавиша нажата в текстовом поле только для чтения, добавляет или вычитает 1 в другие текстовые поля. Моя проблема в том, что мне нужно различать numpad # (0-9) от #s над клавиатурой qwerty. Когда я использую код ниже с NumLock ON, номер numpad действует точно так же, как и другое число (вычитает 1). Когда NumLock выключен, он ничего не делает. Я хочу, чтобы он добавил 1, когда я нажимаю numpad # и вычитаю 1, когда я нажимаю не numpad #. Я пробовал ответить Google, но я ничего не мог придумать.C# numpad действует как клавиатура

Спасибо за любую помощь.

void txtTotal_KeyPress(object sender, KeyPressEventArgs e)//when a key is pressed total text box, depending on key add or subtract 1 to another test box (txtTotal is set to read only) 
    { 


switch (e.KeyChar) 
     {     
      case (char)96://numpad 0 
       addNRBC(); 
       break; 
     case (char)48://keyboard 0 
       subtractNRBC(); 
       break; 
    } 

} 


public void addNRBC() 
    { 
     num1 = Convert.ToInt32(txtNRBC.Text); 
     txtNRBC.Text = Convert.ToString(num1 + 1);//adds 1 to NRBCs field 
     Total(); 
    } 
    public void subtractNRBC() 
    { 
     num1 = Convert.ToInt32(txtNRBC.Text); 
     txtNRBC.Text = Convert.ToString(num1 - 1);//subtract 1 
     Total(); 
    } 

public void Total()//totals all textboxes except NRBCs 
    { 

     total = int.Parse(txtSegs.Text) + int.Parse(txtLymphs.Text) + int.Parse(txtMonos.Text) + int.Parse(txtBands.Text) + int.Parse(txtEos.Text) + int.Parse(txtBasos.Text) + int.Parse(txtMetas.Text) 
        + int.Parse(txtMyelos.Text) + int.Parse(txtPros.Text) + int.Parse(txtBlasts.Text) + int.Parse(txtPlasmas.Text); 
     txtTotal.Text = Convert.ToString(total); 

    } 

ответ

0

Если возможно, изменить событие с KeyPress к KeyDown. Это позволит вам использовать KeyEventArgs вместо KeyPressEventArgs и решить вашу проблему, поскольку последний, похоже, не правильно распознает нумеру.

Вместо жесткого кодирования ваших значений вы также можете использовать перечисление Keys. Это чище, чем добавление комментария.

private void txtTotal_KeyDown(object sender, KeyEventArgs e) 
{ 
    switch (e.KeyCode) 
    { 
     case Keys.NumPad0: 
      addNRBC(); 
      break; 
     case Keys.D0: 
      subtractNRBC(); 
      break; 
    } 
} 
+0

Вопрос, если вы используете KeyDown и пользователь удерживает клавишу вниз, будет что петля выполнения до отпускания клавиши (т.е. продолжать добавлять или вычитать до тех пор, пока не будет отпущен)? Если да, могу ли я использовать KeyUp вместо этого, и не произойдет ли это? – DarkPhoenix86

+0

@ DarkPhoenix86 Да, это будет цикл. И да, 'KeyUp' будет запускаться только при выпуске ключа, поэтому один раз. Поэтому правильный выбор зависит от того, чего вы пытаетесь достичь. Ваш ввод поступает из текстового поля, поэтому я думаю, что будет напечатан код 0. Если пользователь удерживает нажатой клавишу «0», с «KeyUp» он увидит несколько 0 в текстовом поле, но будет выполнено только одно «добавление» (при выпуске). С 'KeyDown' он увидит несколько отображаемых 0, и будет выполняться одна операция' add' для каждого из этих 0. –

+0

Спасибо за помощь! В текстовом поле нажата клавиша I, я перешел в поле только для чтения. Поэтому в основном я хочу, чтобы пользователь мог позиционировать курсор в этом txtTotal только для чтения, а затем мог нажимать несколько разных клавиш для добавления или вычитания 1 в несколько разных текстовых полей, тогда этот txtTotal отобразит общее количество всех этих текс-боксов. Я помещаю оператор case для каждого ключа, который я хочу использовать в событии KeyUp для txtTotal. И я добавляю и вычитаю методы (т.е. addNRBC) для каждого текстового поля, которое необходимо добавить или вычесть из. Кажется, это работает. Еще раз спасибо. – DarkPhoenix86

Смежные вопросы