【问题标题】:Only one checkbox to be selected只能选择一个复选框
【发布时间】:2013-10-21 21:52:25
【问题描述】:

我希望一次只选择一个复选框。我的程序从文本文件中读取并根据文本文件中有多少“答案”创建复选框。

有人知道代码有什么问题吗?

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; }
                }
            }
        }
    }

【问题讨论】:

    标签: c# winforms checkbox


    【解决方案1】:

    实现你想要的很简单,但它也很奇怪

    //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;
    }
    

    【讨论】:

    • 当然!看到代码就很简单了:)谢谢@King King
    【解决方案2】:

    我认为您正在寻找单选按钮。

    如果您坚持使用复选框,请将您的事件更改为 CheckedChanged,因为这样会更准确。不幸的是,复选框可以在不检查自身的情况下被单击!

    【讨论】:

    • 不,我想使用复选框。我知道单选按钮只允许一个选定的项目。但我可能想要检查两个答案或类似的东西。
    • 那你的标题有误导性。
    • OK 将您的事件从 Click 更改为 CheckChanged。
    • 就在这种情况下,我只想选中一个复选框。这就是我正在努力解决的问题。
    【解决方案3】:

    好的,这应该做你想做的事,无论是 onClick 还是 CheckChanged,但答案来自 CheckChanged。

    把它放在 chk_CheckChanged 事件中,并将 chk_CheckChanged 事件添加到您添加的每个 Checkbox 中。

            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;
            }
    

    【讨论】:

      【解决方案4】:
      1. 将复选框放在 groupbox 控件内。
      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;
              }
          }
      }
      

      【讨论】:

        【解决方案5】:

        尝试使用外部 Bool 变量来了解 CheckBox 何时“自动”更改

        CheckBox checkBox1;
        CheckBox checkBox2;
        Bool changed = false; //This one
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
                {
                    if (!changed)
                    {
                        if (checkBox2.Checked)
                        {
                            changed = true;
                            checkBox2.Checked = false;
                        }
                    }
                    else
                    {
                        changed = false;
                    }
                }
        
                private void checkBox2_CheckedChanged(object sender, EventArgs e)
                {
                    if (!changed)
                    {
                        if (checkBox1.Checked)
                        {
                            changed = true;
                            checkBox1.Checked = false;
                        }
                    }
                    else
                    {
                        changed = false;
                    }
                }
        

        【讨论】:

          【解决方案6】:

          添加一个checkedListBox并试试这个

          private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
              {
                  int index = checkedListBox1.SelectedIndex;
                  int count = checkedListBox1.Items.Count;
                  for(int i = 0; i < count; i++)
                  {
                      if(index != i)
                      {
                          checkedListBox1.SetItemChecked(i, false);
                      }
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-08-10
            • 2020-01-20
            • 1970-01-01
            • 2018-06-23
            • 2015-06-06
            • 1970-01-01
            • 2013-11-08
            相关资源
            最近更新 更多