2015-12-29 32 views
1

我試圖強制用戶在被允許移動下一個之前選擇一個rabibutton。我使「下一步」按鈕不可見,但我有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

這些是我們正在談論的RadioButton。只能選擇一個單選按鈕。就是這樣。當選擇一個時,我希望可見性爲真。我不想使用設計師。我希望這是我所有的代碼 – Mocktheduck

1

您正在阻止該線程,這是它未加載的原因。我沒有看到你需要一個循環的原因,因爲當用戶點擊一個單選按鈕時你可以引發一個事件。然後,當您處理事件時,將可見性設置爲true。

相關問題