Stefan Cazacu

Stefan Cazacu

  • NA
  • 28
  • 27.1k

Navigate a keypad in winform using arrow keys

Sep 25 2013 10:48 AM
I'm currently working on a personal project and i have a bit of an issue. In the keypad display i ma unable to navigate up and down. Pressing the arrow keys only follows the button tabindex rather than the direction of the arrow key. For example: if i press the down arrow, instead of changing focus to button4, the focus moves to button2.
Although i have come up with some code that works, it does introduce a new problem. The OK button is initially hidden (until there have been 4 key presses), however in my code not only is the focus changed to it, it is also accessible through the keyboard. My question is: Is there a more elegant or efficient way of manipulating which button is focused?
Thank you.
(If it is of any help, i'm using visual studio 2008, C#, .NET3.5)

So far i have come up with this code:

private void frm_Login_KeyDown(object sender, KeyEventArgs e)
        {
           Control[] MyButtons = new Control[]{b1,b2,b3,b4,b5,b6,b7,b8,b9,btn_OK,b0,btn_Cancel}; 
switch (e.KeyValue)
{
   case 13: //return
         { e.Handled = false; break; }
   case 39:  //Right
          {
             if (IndexofFocussedButton < 11) { IndexofFocussedButton++; }
             else { IndexofFocussedButton = 0; }
             break;
           }
    case 38:  //Up
           {
               if (IndexofFocussedButton > 2) { IndexofFocussedButton-=3; }
               else { IndexofFocussedButton +=9; }
               break;
            }
    case 37: //Left
            {
               if (IndexofFocussedButton != 0) { IndexofFocussedButton--; }
               else { IndexofFocussedButton=11; }
            }
            break;
     case 40: //Down
            {
                if (IndexofFocussedButton < 9) { IndexofFocussedButton +=3; }
                else { IndexofFocussedButton-=9; }
                break;
             }


}


 if (e.KeyValue != 13)
{
    e.Handled = true;                 //Don't pass on the keystroke
    MyButtons[IndexofFocussedButton].Focus(); // Set the focus to the selected control
      Application.DoEvents();
}



Answers (7)