Thomas Johansen
Thomas Johansen

Reputation: 15227

Trouble reading only one character from ReadKey()

I'm new to c# and I'm creating a little console application. I want a smooth menu system changing on key inputs. I have a loop registering

public void MainMenu()
{
    ConsoleKeyInfo _key;
    do
    {
        Console.WriteLine("Main Menu");
        Console.WriteLine("Press 1 for cars");
        Console.WriteLine("Press 2 for planes");
        Console.WriteLine("Press 3 for boats");
        Console.WriteLine("Enter 'q' to exit");
        _key = Console.ReadKey();
        switch ((char)_key.Key)
        {
            case '1':
                {
                    Console.Clear();
                    CarMenu();
                    break;
                }
            case '2':
                {
                    Console.Clear();
                    PlaneMenu();
                    break;
                }
            case '3':
                {
                    Console.Clear();
                    BoatMenu();
                    break;
                }
            case 'Q':
                {
                    Environment.Exit(0);
                    break;
                }
            default:
                {
                    Console.WriteLine("No options to that key...");
                    Console.WriteLine("-------------------------\n\n");
                    break;
                }
        }
    } while (true);
}

public void CarMenu()
{



    do
    {
        Console.Clear();
        Console.WriteLine("Car menu");
        Console.WriteLine("Press 1 to list all cars");
        Console.WriteLine("Press 2 to list single car");
        Console.WriteLine("Press 3 to register a new car");
        Console.WriteLine("Press 0 for main menu");
        Console.WriteLine("Enter 'q' to exit");
        _key = Console.ReadKey();
        Console.WriteLine((char)_key.Key);
        Console.ReadKey();
        switch ((char)_key.Key)
        {
            case '1':
                {
                    Console.Clear();
                    _handler.listAllDevices();
                    break;
                }
            case '2':
                {
                    Console.Clear();
                    PlaneMenu();
                    break;
                }
            case '3':
                {
                    Console.Clear();
                    BoatMenu();
                    break;
                }
            case '0':
                {
                    Console.Clear();
                    MainMenu();
                    break;
                }
            case 'Q':
                {
                    Environment.Exit(0);
                    break;
                }
            default:
                {
                    Console.WriteLine("No options to that key...");
                    Console.WriteLine("-------------------------\n\n");
                    break;
                }
        }
    } while (true);
}

I have several cases, amongst case '1' and case 'Q'. First time I press any of them it works but next time I need to press 1 twice and q thrice. No matter SHIFT + q or Caps Lock. I tried a number of different solutions, clearing buffers etc but haven't really accomplished much.

Seems strange to me but I guess I'm missing something. Any clues? Thanks

Upvotes: 0

Views: 900

Answers (1)

user5147454
user5147454

Reputation:

So the full snippet is:

{
    private static void Main(string[] args)
    {
        do
        {
            Console.WriteLine("Main Menu");
            Console.WriteLine("Press 1 for cars");
            Console.WriteLine("Press 2 for planes");
            Console.WriteLine("Press 3 for boats");
            Console.WriteLine("Enter 'q' to exit");
            ConsoleKeyInfo _key = Console.ReadKey();

            switch ((char) _key.Key)
            {
                case '1':
                {
                    Console.Clear();
                    CarMenu();
                    break;
                }
                case '2':
                {
                    Console.Clear();
                    //PlaneMenu();
                    break;
                }
                case '3':
                {
                    Console.Clear();
                    //BoatMenu();
                    break;
                }
                case 'Q':
                {
                    Environment.Exit(0);
                    break;
                }
                default:
                {
                    Console.WriteLine("No options to that key...");
                    Console.WriteLine("-------------------------\n\n");
                    break;
                }
            }
        } while (true);
    }

    public static void CarMenu()
    {
        do
        {
            Console.Clear();
            Console.WriteLine("Car menu");
            Console.WriteLine("Press 1 to list all cars");
            Console.WriteLine("Press 2 to list single car");
            Console.WriteLine("Press 3 to register a new car");
            Console.WriteLine("Press 0 for main menu");
            Console.WriteLine("Enter 'q' to exit");
            ConsoleKeyInfo _key = Console.ReadKey();
            Console.WriteLine((char) _key.Key);
            //Console.ReadKey();
            switch ((char) _key.Key)
            {
                case '1':
                {
                    Console.Clear();
                    Console.WriteLine("1");
                    //_handler.listAllDevices();
                    break;
                }
                case '2':
                {
                    Console.Clear();
                    Console.WriteLine("1");
                    break;
                }
                case '3':
                {
                    Console.Clear();
                    Console.WriteLine("1");
                    break;
                }
                case '0':
                {
                    Console.Clear();
                    return;
                }
                case 'Q':
                {
                    Environment.Exit(0);
                    return;
                }
                default:
                {
                    Console.WriteLine("No options to that key...");
                    Console.WriteLine("-------------------------\n\n");
                    break;
                }
            }
        } while (true);
    }
}

As you can see, I have coomented second call to ReadKey(). This was original problem.

Upvotes: 1

Related Questions