2017-02-20 3 views
3

я не понимаю, что я здесь отсутствует, но это, кажется, что Console.ReadKey() все еще активен и вызывает консоль, чтобы заставить меня дважды войти, используя Console.ReadLine() после вызова Console.ReadKey().C# Console.ReadLine после ReadKey ожидает ввода в два раза

Я искал вверх и вниз, как избежать ReadKey() после того, как был сделан выбор, но безрезультатно.

Чтобы уточнить, это непредвиденное поведение: Когда консоль всплывает, пользователю представлены эти три варианта в качестве примера. Когда пользователь затем вводит «u» или «h», консоль не ждет; он немедленно выполняет действие без нажатия на пользователя . Введите.

Я сделал что-то неправильно, реализуя это?

static void Main(string[] args) 
{ 
    Console.WriteLine("u up"); 
    Console.WriteLine("h home"); 
    Console.WriteLine("x exit"); 
    Console.WriteLine("---------------------------------"); 
    Console.WriteLine("  [Enter Your Selection]"); 
    Console.WriteLine("---------------------------------"); 
    Console.Write("Enter Selection: "); 
    ConsoleKeyInfo selection; 
    Console.TreatControlCAsInput = true; 
    int value; 
    selection = Console.ReadKey(); 
    if (char.IsDigit(selection.KeyChar)) 
    { 
     value = int.Parse(selection.KeyChar.ToString()); 
     value -= 1; 
     Console.WriteLine("You've entered {0}", value); 
    } 
    else 
    { 
     switch (selection.Key) 
     { 
      case ConsoleKey.U: 
       blurp(); 
       break; 

      case ConsoleKey.H: 
       blurp(); 
       break; 

      case ConsoleKey.X: 
       System.Environment.Exit(0); 
       break; 

      default: 
       Console.WriteLine("Invalid Input..."); 
       break; 
     } 
    } 
} 

public static void blurp() 
{ 
    Console.WriteLine(""); 
    Console.Write("Enter Another Value: "); 
    string value = Console.ReadLine(); 
    Console.WriteLine("You've entered {0}", value); 
} 
+1

Я не понимаю проблему. Вы останавливаетесь до нажатия клавиши. Если это U или H, вы остановитесь, ожидая, пока пользователь нажмет Enter. Чем это отличается от того, что вы испытываете? – hoodaticus

+1

Пожалуйста, уточните свой вопрос, трудно понять, что вы просите. –

+0

, если вы запустите код, когда пользователь выбирает либо u, h, либо x, консоль не ждет, он выполняет действие без нажатия клавиши enter ... в этом примере я разместил метод «blurp» внутри u и h case, который затем предлагает пользователю ввести другое значение. Когда пользователь вводит значение и нажимает кнопку ввода, консоль заставляет вас вводить 2x до того, как он уйдет, и никогда не пишет «вы ввели бла» – Autonomic

ответ

2

Я тестировал этот код и получил такое же поведение:

Console.Write("Enter Selection: "); 
Console.TreatControlCAsInput = true; 
ConsoleKeyInfo selection = Console.ReadKey(); 
if (selection.Key == ConsoleKey.U) 
{ 
    Console.Write("Enter Another Value: "); 
    string valueStr = Console.ReadLine(); 
    Console.WriteLine("You've entered {0}", valueStr); 
} 

Решение состоит в том, чтобы не использовать Console.TreatControlCAsInput = true;, так как это вызывает проблемы.

Дополнительная информация в Stack   Вопросы переполнения TreatControlCAsInput issue. Is this a bug?.

+0

Да, подтверждено, .. Console.TreatControlCAsInput = true; была проблема. Спасибо Татранский Медведь – Autonomic

2

Что касается консоли, заканчивающейся не выписывая

"You've entered ..." 

, что происходит, потому что программа завершается, когда она покидает метод и консоль закрывается. Либо запустите это без отладки (Ctrl + F5), либо добавьте Console.ReadLine() в конец вашего основного.

Консоль не ждет после первого ввода из-за того, как работает Console.ReadKey(). Если вы хотите подождать, пока пользователь нажмет Введите, используйте ReadLine().

Что касается Console.ReadLine() дважды в ожидании перед сохранением ввода, то есть потому, что вы используете

Console.TreatControlCAsInput = true; 

который столовых с тем, как консоль принимает входные данные внутри. Просто избавься от этого.

1

Этот вопрос с установкой:

Console.TreatControlCAsInput = true; 

Если вы прокомментируете эту строку, все работает, как ожидалось. Это известная функциональность в C#.

Если вы все еще хотите установить консоль.TreatControlCAsInput = true; Вы можете добавить собственный метод для чтения ввода:

public static string CustomReadLine() 
{ 
    ConsoleKeyInfo cki; 
    string value = string.Empty; 

    do 
    { 
     cki = Console.ReadKey(); 

     value = value + cki.Key; 
    } while (cki.Key != ConsoleKey.Enter); 

    return value; 
} 

Изменить код

string value = Console.ReadLine(); 

, чтобы использовать эту пользовательскую функцию

string value = CustomReadLine(); 

Пожалуйста, обратитесь к статье MSDN Console.TreatControlCAsInput Property для чтения ввода, когда у вас есть Console.TreatControlCAsInput = true;

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