2013-10-14 243 views
1

我想一次只選中一個複選框。我的程序從文本文件中讀取並根據文本文件中有多少「答案」創建複選框。只有一個複選框被選中

有人知道代碼有什麼問題嗎?

public partial class Form1 : Form 

    { 
     string temp = "questions.txt"; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      StreamReader sr = new StreamReader(temp); 
      string line = ""; 
      List<string> enLista = new List<string>(); 
      while ((line = sr.ReadLine()) != null) 
      { 
       string[] myarray = line.Split('\r'); 
       enLista.Add(myarray[0]); 


      } 
      sr.Close(); 


      for (int i = 0; i < enLista.Count; i++) 
      { 
       if (enLista[i].Contains("?")) 
       { 
        Label lbl = new Label(); 
        lbl.Text = enLista[i].ToString(); 
        lbl.AutoSize = true; 
        flowLayoutPanel1.Controls.Add(lbl); 
       } 
       else if (enLista[i] == "") 
       { 

       } 
       else 
       { 
        CheckBox chk = new CheckBox(); 
        chk.Text = enLista[i].ToString(); 
        flowLayoutPanel1.Controls.Add(chk); 
        chk.Click += chk_Click; 
       } 
      } 

     } 
     private void chk_Click(object sender, EventArgs e) 
     { 
      CheckBox activeCheckBox = sender as CheckBox; 
      foreach (Control c in Controls) 
      { 
       CheckBox checkBox = c as CheckBox; 
       if (checkBox != null) 
       { 
        if (!checkBox.Equals(activeCheckBox)) 
        { checkBox.Checked = !activeCheckBox.Checked; } 
        else 
        { checkBox.Checked = true; } 
       } 
      } 
     } 
    } 

回答

6

它是如此簡單的實現你想要什麼,但它也使奇怪

//We need this to hold the last checked CheckBox 
CheckBox lastChecked; 
private void chk_Click(object sender, EventArgs e) { 
    CheckBox activeCheckBox = sender as CheckBox; 
    if(activeCheckBox != lastChecked && lastChecked!=null) lastChecked.Checked = false; 
    lastChecked = activeCheckBox.Checked ? activeCheckBox : null; 
} 
+1

當然!它很簡單,當你看到代碼:)謝謝@王金 – grimsan55

6

我認爲你正在尋找無線電按鈕。

如果您堅持使用複選框,則將您的事件更改爲CheckedChanged,因爲這樣會更準確。不幸的是,複選框無需點擊就可以點擊!

+0

沒有我想使用複選框。我知道單選按鈕只允許一個選定的項目。但我可能想要兩個答案被檢查或類似的東西。 – grimsan55

+1

然後你的標題是誤導。 – Chris

+0

確定將您的活動從點擊更改爲CheckChanged。 – Ssc456

0

確定這應該做你想做的事,無論是的onClick或CheckChanged但得到的答覆是從CheckChanged。

將此放入chk_CheckChanged事件中,並將chk_CheckChanged事件添加到您添加的每個複選框。

 CheckBox tmp = (CheckBox)sender; 

     foreach (CheckBox c in flowLayoutPanel1.Controls) 
     { 
      c.CheckedChanged -= chk_CheckedChanged; 
      c.Checked = false; 
     } 

     tmp.Checked = true; 

     foreach (CheckBox c in flowLayoutPanel1.Controls) 
     { 
      c.CheckedChanged += chk_CheckedChanged; 
     } 
0
  1. 把複選框組框控件中。
  2. 循環控制組中的控件
  3. 找到循環中的複選框名稱,如果不匹配,則取消選中複選框,否則選中該複選框。

見樣本代碼:

//Event CheckedChanged of checkbox: 
private void checkBox6_CheckedChanged(object sender, EventArgs e) 
{ 
    CheckBox cb = (CheckBox)sender; 
    if (cb.CheckState == CheckState.Checked) 
    { 
     checkboxSelect(cb.Name); 
    } 
    } 

//Function that will check the state of all checkbox inside the groupbox 
private void checkboxSelect(string selectedCB) 
{ 
    foreach (Control ctrl in groupBox1.Controls) 
    { 
     if (ctrl.Name != selectedCB) 
     { 
      CheckBox cb = (CheckBox)ctrl; 
      cb.Checked = false; 
     } 
    } 
} 
相關問題