2013-10-14 43 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; 
     } 
    } 
} 
相关问题