2014-02-18 3 views
0

Так я написал этот код в моем MainMenu классе и он работал отлично:Возвращаясь из цикла в то время как

public void Start() //Start method 
{ 
    bool done = false; 
    while (!done) 
    { 
     ShowMeny(); 
     SwitchMethod(); 

     NumChoice = InputHelper.ReadIntegerConsole(); 
     if (NumChoice == 0) // if the input is 0, set done to true and stop the loop 
      done = true; 

// ... 

Однако здесь я написал в другом классе, и при нажатии кнопки 0, то должен вернуться к моему MainMenu. Почему я не могу использовать один и тот же код? Все это делает цикл ShowMenu.

private void CalcMenu() 
{ 
    bool Done = false; 

    while (!Done) 
    { 
     ShowMenu(); 
     if (MenuChoice == 0) 
      Done = true; 
    } 
} 

Если вы нажмете 0 здесь, он повторяется 2 раза, а затем выходит. Вот весь класс:

namespace ConsoleApplication1 
{ 
class WorkingSchedule 
{ 
    int MenuChoice = -1; 

    public void Start() 
    { 
     ShowMenu(); 
     CalcMenu(); 
     //LoopOneWeeks(); 
     //LoopTwoNights 
     //ShowResults(); 

    } 

    private void ShowMenu() 
    { 
     Console.WriteLine("Välj det schema som du vill se:"); 
     Console.WriteLine("_______________________________"); 
     Console.WriteLine("1. Visa en lista de veckor du ska jobba"); 
     Console.WriteLine("2. Visa en lista de nätter du ska jobba"); 
     Console.WriteLine("0. För att återvända till huvudmenyn"); 
     MenuChoice = InputHelper.ReadIntegerConsole(); 
     Console.WriteLine("Ditt val: " + MenuChoice); 
    } 

    private void CalcMenu() 
    { 
     bool Done = false; 

     while (!Done) 
     { 
      ShowMenu(); 
      if (MenuChoice == 0) 
      { 
       Done = true; 
       ReturnMainMenu(); 
      } 
      else if (MenuChoice == 1) 
      { 

      } 
      else if (MenuChoice == 2) 
      { 

      } 
     } 
    } 

    private void ReturnMainMenu() 
    { 
     MenuProgram MPObj = new MenuProgram(); 
     MPObj.Start(); 
    } 

InputHelper.ReadIntegerConsole является входным вспомогательным классом

+0

Где произносится 'MenuChoice', и где он назначен? –

+0

@MichaelDunlap Его переменная экземпляра. – Baxtex

+0

И вызывает ли вызов ShowMenu() 'код, который присваивает' MenuChoice'? –

ответ

2

Вы не на самом деле покидаете свой цикл, когда у вас есть ветка MenuChoice == 0.

private void CalcMenu() 
{ 
    bool Done = false; 

    while (!Done) 
    { 
     ShowMenu(); 
     if (MenuChoice == 0) 
     { 
      Done = true; 
      //ReturnMainMenu(); 
     } 
     else if (MenuChoice == 1) 
     { 

     } 
     else if (MenuChoice == 2) 
     { 

     } 
    } 
    ReturnMainMenu(); //This should only happen when you exit the loop. 
} 

Edit:

Похоже, вы показываете меню в Пуск(), прежде чем снова показать меню в CALCMENU.

public void Start() 
{ 
    //ShowMenu(); 
    CalcMenu(); 
    //LoopOneWeeks(); 
    //LoopTwoNights 
    //ShowResults(); 

} 
+0

Да, я это видел и исправил, теперь он выходит, но меню повторяется 2 раза. – Baxtex

+0

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

+0

Я пробовал это, но это дало мне тот же результат. Если я вхожу в 0, то Меню повторяется, если я снова нажимаю 0, я возвращаюсь к своему MainMenu. Почему это меню повторяется два раза? – Baxtex

1

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

while (!Done) 
{ 
    ShowMenu();   
    if (MenuChoice == 0) 
    { 
    Done = true; 
    } 
} 

Ваш первый метод работает, потому что вы меняете значение переменной Done внутри while петли, которая разрывает петлю. Но во втором методе вы не меняете значение Done. Его всегда ложь; поэтому условие !Done всегда истинно, и цикл становится бесконечным.

0

Оба вышеуказанных ответа верны. Чтобы выйти из цикла while, вам нужно иметь логику выхода внутри самого цикла. В качестве альтернативы предлагаемым решениям вы также можете попробовать.

while(MenuChoice != 0) 
{ 
    ShowMenu(); 
} 
Смежные вопросы