2015-07-02 1 views
-1

Я пытаюсь сделать простую программу викторины географии на C# (Visual studio 2013). Я могу получить большинство из них, однако мне нужно определить, когда пользователь выбрал ответ и нажал кнопку «Ввод». Для этого я использую цикл do-while, чтобы пользователь выполнил оба этих требования перед тем, как продолжить, однако, когда цикл do-wile добавлен, он не скомпилируется. По ошибке я имею в виду, что компиляция никогда не дает ошибку и не останавливается или ничего не делает и просто сидит там. Я попытался прокомментировать цикл do-while, и он компилируется отлично, поэтому ошибка должна быть с этим. Что мне не хватает?Do While цикл, вызывающий сбой компиляции

public partial class Form1 : Form 
{ 
    int anselct = 0; 
    bool buttonclick = false; 
    bool runme = true; 

    public Form1() 
    { 
     InitializeComponent(); 
     Q1.Text = Q1.Text.Replace("null", "Hello, welcome to the Geography quiz. Press 'A' and then 'Enter' to begin the quiz."); //replaces base text with introduction 
     A1.Text = A1.Text.Replace("radioButton1", "A"); 
     A2.Text = A2.Text.Replace("radioButton3", "B"); 
     A3.Text = A3.Text.Replace("radioButton4", "C"); 
     A4.Text = A4.Text.Replace("radioButton2", "D"); 
     do { 
      if (A1.Checked && buttonclick == true) 
      { 
       buttonclick = false; 
       Q1.Text = Q1.Text.Replace("Hello, welcome to the Geography quiz. Press 'A' and then 'Enter' to begin the quiz.", "Question 1: What is the capital of Cuba"); //Changes text to that of the first question 
       A1.Text = A1.Text.Replace("A", "Greenwich"); 
       A2.Text = A2.Text.Replace("B", "Berlin"); 
       A3.Text = A3.Text.Replace("C", "Bogota"); 
       A4.Text = A4.Text.Replace("D", "Havana"); 
       runme = false; 
      } //end of if statement 
     } while (runme == true); //end of do loop, should be infinate unless told to close 
    } 

// различные неуместные вещи здесь

public void Button_Click_1(object sender, EventArgs e) 
    { 
     buttonclick = true; 
    } //end of Button_Click_1 
} 
+1

«А1» когда-либо проверялся? звучит как бесконечный цикл. вы установили точки останова и прошли через код? – user1666620

+1

Я должен быть честным, я не вижу, чтобы это было так. Если это так, компилятор C# не работает. Я сомневаюсь. Вы уверены, что не имеете в виду, что он висит во время выполнения? В стороне это не рекомендуемый способ проверки состояний. Вы должны использовать обработчики событий, но это еще одна проблема. –

+0

@ user1666620 - он сказал, что проблема во время компиляции. –

ответ

0

Вы должны уничтожить свой цикл вы строите вверх бесконечный цикл в конструкторе.

Попытайтесь использовать События в вашей форме, такие как Charles Mager, написал в комментарии.

Вы можете найти информацию о событиях здесь:

https://msdn.microsoft.com/en-us/library/system.windows.forms.form_events%28v=vs.110%29.aspx

0

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

namespace Photoviewer 
{ 
    public partial class Form1 : Form 
    { 
     int anselct = 0; 
     //bool buttonclick = false; 
     //bool runme = true; 


     public Form1() 
     { 
      InitializeComponent(); 
      Q1.Text = Q1.Text.Replace("null", "Hello, welcome to the Geography quiz. Press 'A' and then 'Enter' to begin the quiz."); //replaces base text with introduction 
      A1.Text = A1.Text.Replace("radioButton1", "A"); 
      A2.Text = A2.Text.Replace("radioButton3", "B"); 
      A3.Text = A3.Text.Replace("radioButton4", "C"); 
      A4.Text = A4.Text.Replace("radioButton2", "D"); 

     } 

//various irrelevant things are here 

     public void Button_Click_1(object sender, EventArgs e) 
     { 
       if (A1.Checked) 
       {      
        Q1.Text = Q1.Text.Replace("Hello, welcome to the Geography quiz. Press 'A' and then 'Enter' to begin the quiz.", "Question 1: What is the capital of Cuba"); //Changes text to that of the first question 
        A1.Text = A1.Text.Replace("A", "Greenwich"); 
        A2.Text = A2.Text.Replace("B", "Berlin"); 
        A3.Text = A3.Text.Replace("C", "Bogota"); 
        A4.Text = A4.Text.Replace("D", "Havana"); 

       } 
     } //end of Button_Click_1 
    } 
} 
2

Основываясь на предположении, вы имели в виду «времени выполнения» вместо «времени компиляции», я обращусь «висит».

public void Button_Click_1(object sender, EventArgs e) 
{ 
    if(A1.Checked) 
    { 
     ReplaceText(); 
    } 
} 

private void ReplaceText() 
{ 
    Q1.Text = Q1.Text.Replace("Hello, welcome to the Geography quiz. Press 'A' and then 'Enter' to begin the quiz.", "Question 1: What is the capital of Cuba"); //Changes text to that of the first question 
    A1.Text = A1.Text.Replace("A", "Greenwich"); 
    A2.Text = A2.Text.Replace("B", "Berlin"); 
    A3.Text = A3.Text.Replace("C", "Bogota"); 
    A4.Text = A4.Text.Replace("D", "Havana"); 
} 

Объяснение

Compile времени является моментом времени, при котором C# компилятор строит свой код. то есть он собирает его, когда он вызывается/запускается.

Когда он запущен, вы теперь находитесь в runtime.

Ошибки компиляции, как правило, происходят, когда ваш компилятор находит ошибки в вашем синтаксисе (как правило, существуют другие сценарии).

Ошибки времени выполнения (опять же, в общем, в двух словах) происходят в коде, который построил отлично (так синтаксически звучит), но имеет логические ошибки из-за пути, который он выполнил, или любого количества переменных окружения.

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

Висячие выпуск

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

0
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Windows; 
using System.Windows.Input; 



namespace Photoviewer 
{ 
    public partial class Form1 : Form 
    { 
     int anselct = 0; 
     bool runme = true; 


     public Form1() 
     { 
      InitializeComponent(); 
      Q1.Text = Q1.Text.Replace("null", "Hello, welcome to the Geography quiz. Press 'A' and then 'Enter' to begin the quiz."); //replaces base text with introduction 
      A1.Text = A1.Text.Replace("radioButton1", "A"); 
      A2.Text = A2.Text.Replace("radioButton3", "B"); 
      A3.Text = A3.Text.Replace("radioButton4", "C"); 
      A4.Text = A4.Text.Replace("radioButton2", "D"); 

     } 

//various irrelevant things are here 

     public void Button_Click_1(object sender, EventArgs e) 
     { 
      //do { 
       if (A1.Checked) 
       { 
        Q1.Text = Q1.Text.Replace("Hello, welcome to the Geography quiz. Press 'A' and then 'Enter' to begin the quiz.", "Question 1: What is the capital of Cuba"); //Changes text to that of the first question 
        A1.Text = A1.Text.Replace("A", "Greenwich"); 
        A2.Text = A2.Text.Replace("B", "Berlin"); 
        A3.Text = A3.Text.Replace("C", "Bogota"); 
        A4.Text = A4.Text.Replace("D", "Havana"); 
        //runme = false; 
       } //end of if statement 
      //} while (runme == true); //end of do loop, should be infinate unless told to close 
     } //end of Button_Click_1 
    } 
} 

Прокомментировал линии, так как было бы бессмысленно просто продолжать цикл путем нажатия на кнопку. В основном это так: вы хотите делать проверки на действие события. Не сидите в конструкторе и не пытайтесь повесить его для информации. Это не так, как работает Winforms.

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