2015-12-29 15 views
1

Я пытаюсь заставить пользователя выбрать рабиобуттон, прежде чем ему разрешат двигаться дальше. Я сделал кнопку «Далее» невидимой, но у меня есть 10 радиообъектов, которые должны быть проверены, если какой-либо из них проверен. По определению можно проверить только 1 радиообъект. Мой код выглядит примерно так:Держите кнопку невидимой до тех пор, пока не будет нажата кнопка RadioButton. C#

b1.Text = "Next"; 
b1.Parent = fpn1; 
fpn1.Controls.Add(b1); 
b1.Dock = DockStyle.Bottom; 
b1.BackColor = Color.LightGray; 
b1.Visible = false; 
RadioButton rb; 
while (b1.Visible == false) 
     { 
      MessageBox.Show("LOOOL"); 
      //Thread.Sleep(5000); 
      rb = fpn1.Controls.OfType<RadioButton>() 
          .FirstOrDefault(r => r.Checked); 
      if (rb != null) 
      { 
       b1.Visible = true; 
      } 
     } 

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

Что еще я могу сделать, чтобы получить желаемый результат?

ответ

5

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

Продолжайте делать кнопку невидимой, пока что-то не произойдет.

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

Сделать кнопку видимой когда что-то происходит.

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

private void radioButton_CheckedChanged(Object sender, EventArgs e) 
{ 
    // your logic here 
} 

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

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

if (allRadioButtonsSelected()) 
    b1.Visible = true; 

Если строка кода у вас есть делает то, что вы хотите:

rb = fpn1.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked) 

, то вы можете даже использовать только что:

if (fpn1.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked) != null) 
    b1.Visible = true; 

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


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

+1

Это отличный ответ: правильный, понятный и тщательный, оставаясь доступным для OP. Я бы поднял больше, если мог. – adv12

+0

@ adv12: Спасибо! – David

+0

Это RadioButtons, о которых мы говорим. Можно выбрать только одну кнопку. Это все. Когда один выбран, я хочу, чтобы видимость была правдой. Я не хочу использовать конструктора. Я хочу, чтобы это был весь мой код. – Mocktheduck

1

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

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