Only one checkbox to be selected

33,527

Solution 1

It's so simple to achieve what you want, however it's also so strange:

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

Solution 2

I think you are looking for Radio Buttons.

If you are insistent on using checkboxes then change your event to CheckedChanged as this will be more accurate. Check boxes can unfortunately be clicked without checking themselves!

Share:
33,527
grimsan55
Author by

grimsan55

Updated on February 03, 2022

Comments

  • grimsan55
    grimsan55 over 2 years

    I would like to only have single checkbox selected at a time. My program reads from a textfile and creates checkboxes according to how many "answers" there are in the textfile.

    Does anyone know what is wrong with the code?

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