2013-12-04 5 views
6

Я пытаюсь получить мое меню повторить, так что после выбора и делают вариант 1, он вернулся в меню и попросить другой вариант выбираемогоПростое меню в консольном приложении

class Program 
{ 
    static void Main(string[] args) 
    { 

     FootballTeams MyCode = new FootballTeams(); 

     MyCode.ListInit(); 
     MyCode.DisplayMenu(); 
     MyCode.AddTeams(); 
     Console.ReadLine(); 

     MyCode.ListInit(); 
     MyCode.DisplayMenu(); 
     MyCode.DisplayTeams(); 
     Console.ReadLine(); 

     MyCode.ListInit(); 
     MyCode.DisplayMenu(); 
     MyCode.Delete(); 
     Console.ReadLine(); 

     MyCode.ListInit(); 
     MyCode.DisplayMenu(); 
     MyCode.TeamSearch(); 
     Console.ReadLine(); 
    } 
} 

Вот методы с содержанием выносимые:

class FootballTeams 
{ 


    public FootballTeams(){ } 

    List<string> teams; 
    public void ListInit() 


    public void DisplayMenu() 
    { 
    Console.WriteLine("Football Manager"); 
    Console.WriteLine(); 
    Console.WriteLine("1. Add a Football team"); 
    Console.WriteLine("2. List the Football teams"); 
    Console.WriteLine("3. Search for a Football team"); 
    Console.WriteLine("4. Delete a team"); 
    Console.ReadLine(); 
    } 



    public void AddTeams() 
    { 
     Console.WriteLine("Enter a team to be added: "); 
     string userinput = Console.ReadLine(); 
     if (teams.Count < 10) 
     { 
     if (userinput != "Colchester") 
     { 
      teams.Add(userinput); 
      foreach (var item in teams) 
      Console.Write(item.ToString() + " "); 
     } 
     else 
      Console.Write("NOT ALLOWED"); 
     } 
     else 
     Console.Write("MAXIMUM LIMIT REACHED"); 
     } 


    public void DisplayTeams() 
    { 
    foreach(var item in teams) 
    Console.Write(item.ToString() + " "); 
    } 

    public void TeamSearch() 
    { 
    Console.WriteLine("Please enter the team you wish to search for: "); 
    string userinput = Console.ReadLine(); 
    if (teams.Contains(userinput)) 
    Console.WriteLine("Success, team " + userinput); 
    } 

    public void Delete() 
    { 
     Console.WriteLine("Enter a team you wish to delete: "); 
     string userinput = Console.ReadLine(); 
     teams.Remove(userinput); 
     foreach (var item in teams) 
     Console.Write(item.ToString() + " "); 
    } 

Я знаю, что сформулированное это плохо, так что я надеюсь, что кто-то понимает, что я спрашиваю: P

+0

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

ответ

8

См: http://msdn.microsoft.com/en-us/library/471w8d85(v=vs.110).aspx

Замените основную функцию с:

static void Main(string[] args) { 
    FootballTeams MyCode = new FootballTeams(); 

    MyCode.ListInit(); 

    ConsoleKeyInfo cki; 

    do { 
     MyCode.DisplayMenu(); 
     cki = Console.ReadKey(false); // show the key as you read it 
     switch (cki.KeyChar.ToString()) { 
      case "1": 
       MyCode.AddTeams(); 
       break; 
      case "2": 
       MyCode.DisplayTeams(); 
       break; 
      // etc.. 
     } 
    } while (cki.Key != ConsoleKey.Escape); 

} 

По существу, вы должны цикла, пока они не нажать клавишу Escape. Каждый раз, когда вы читаете ключ, вы можете выполнить выбранное действие.

+0

Когда я на самом деле запускаю его, ни один из методов не работает, поэтому скажем, что я нажимаю 1, чтобы добавить команду, вместо того, чтобы инициализировать этот метод, он просто печатает меню? – user2852418

+0

Методы, которые вы показали, на самом деле ничего не делают. Поэтому, когда вы выбираете вариант, ничего не выполняется, и затем выполняется перерыв, и затем меню перепечатывается. – tinstaafl

+0

Логическое значение в ReadKey - это перехват ключа, который не отображает его. Чтобы отобразить его, логическое значение должно быть ложным. – tinstaafl

15

Вы можете использовать делать во время цикла с целью сделать небольшую модификацию вашего метода DispalyMenu() и возвращает результат как этот

static public int DisplayMenu() 
{ 
    Console.WriteLine("Football Manager"); 
    Console.WriteLine(); 
    Console.WriteLine("1. Add a Football team"); 
    Console.WriteLine("2. List the Football teams"); 
    Console.WriteLine("3. Search for a Football team"); 
    Console.WriteLine("4. Delete a team"); 
    Console.WriteLine("5. Exit"); 
    var result = Console.ReadLine(); 
    return Convert.ToInt32(result); 
} 

и записать это в методе

Main()
int userInput = 0; 
do 
{ 
    userInput = DisplayMenu(); 
}while(userInput!=5); 

Так что пока пользователь не вводит «5», код будет выполняться в цикле. Надеюсь, что помогает.

+0

userinput не существует в текущем контексте? – user2852418

+0

@ user2852418 Да, я понял это и отредактировал свой ответ. Благодаря! –

4

Там есть NuGet пакет для этого сейчас

https://github.com/splttingatms/EasyConsole

Пример

После добавления NuGet пакет меню может быть реализован следующим образом, это очень простой вариант

static void Main(string[] args) 
{ 
    var menu = new EasyConsole.Menu() 
     .Add("foo",() => Console.WriteLine("foo selected")) 
     .Add("bar",() => Console.WriteLine("bar selected")); 
    menu.Display(); 
} 

В действии вы можете разместить любой метод для запуска, если выбрано

Этот выход будет что-то вроде этого

  1. Foo
  2. бар

Выберите вариант:

+1

Пожалуйста, не просто отправляйте какой-либо инструмент или библиотеку в качестве ответа. По крайней мере, продемонстрируйте [как он решает проблему] (http://meta.stackoverflow.com/a/251605) в самом ответе. – paper1111

+0

@ paper1111 Сделаны некоторые изменения – R2D2

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