Is there a simple way to implement a Checked Combobox in WinForms

33,250

Solution 1

Here is what you want, I just coded this by myself
The concept is really simple, use a panel and add checkboxes onto it. Then force the combo box to disable it's drop down menu but still you can click on its down arrow. Use DropDown and DropDownClosed events of the combo box. When you make the combo box's list down set panel's Visible property to True, hide it when you close the drop down of the combo box.

//designer class

// 
// comboBox1
// 
this.comboBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.comboBox1.DropDownHeight = 1;
this.comboBox1.DropDownWidth = 1;
this.comboBox1.FormattingEnabled = true;
this.comboBox1.IntegralHeight = false;
this.comboBox1.Location = new System.Drawing.Point(256, 371);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(238, 21);
this.comboBox1.TabIndex = 5;
this.comboBox1.DropDown += new System.EventHandler(this.comboBox1_DropDown);
this.comboBox1.DropDownClosed += new System.EventHandler(this.comboBox1_DropDownClosed);
// 
// panel1
// 
this.panel1.BackColor = System.Drawing.Color.White;
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel1.Controls.Add(this.checkBox9);
this.panel1.Controls.Add(this.checkBox8);
this.panel1.Controls.Add(this.checkBox7);
this.panel1.Controls.Add(this.checkBox6);
this.panel1.Controls.Add(this.checkBox5);
this.panel1.Controls.Add(this.checkBox4);
this.panel1.Controls.Add(this.checkBox3);
this.panel1.Controls.Add(this.checkBox2);
this.panel1.Controls.Add(this.checkBox1);
this.panel1.Location = new System.Drawing.Point(252, 394);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(245, 68);
this.panel1.TabIndex = 6;
// 
// checkBox9
// 
this.checkBox9.AutoSize = true;
this.checkBox9.Location = new System.Drawing.Point(162, 48);
this.checkBox9.Name = "checkBox9";
this.checkBox9.Size = new System.Drawing.Size(80, 17);
this.checkBox9.TabIndex = 9;
this.checkBox9.Text = "checkBox9";
this.checkBox9.UseVisualStyleBackColor = true;
// 
// checkBox8
// 
this.checkBox8.AutoSize = true;
this.checkBox8.Location = new System.Drawing.Point(162, 27);
this.checkBox8.Name = "checkBox8";
this.checkBox8.Size = new System.Drawing.Size(80, 17);
this.checkBox8.TabIndex = 8;
this.checkBox8.Text = "checkBox8";
this.checkBox8.UseVisualStyleBackColor = true;
// 
// checkBox7
// 
this.checkBox7.AutoSize = true;
this.checkBox7.Location = new System.Drawing.Point(162, 4);
this.checkBox7.Name = "checkBox7";
this.checkBox7.Size = new System.Drawing.Size(80, 17);
this.checkBox7.TabIndex = 7;
this.checkBox7.Text = "checkBox7";
this.checkBox7.UseVisualStyleBackColor = true;
// 
// checkBox6
// 
this.checkBox6.AutoSize = true;
this.checkBox6.Location = new System.Drawing.Point(82, 47);
this.checkBox6.Name = "checkBox6";
this.checkBox6.Size = new System.Drawing.Size(80, 17);
this.checkBox6.TabIndex = 5;
this.checkBox6.Text = "checkBox6";
this.checkBox6.UseVisualStyleBackColor = true;
// 
// checkBox5
// 
this.checkBox5.AutoSize = true;
this.checkBox5.Location = new System.Drawing.Point(82, 26);
this.checkBox5.Name = "checkBox5";
this.checkBox5.Size = new System.Drawing.Size(80, 17);
this.checkBox5.TabIndex = 4;
this.checkBox5.Text = "checkBox5";
this.checkBox5.UseVisualStyleBackColor = true;
// 
// checkBox4
// 
this.checkBox4.AutoSize = true;
this.checkBox4.Location = new System.Drawing.Point(82, 4);
this.checkBox4.Name = "checkBox4";
this.checkBox4.Size = new System.Drawing.Size(80, 17);
this.checkBox4.TabIndex = 3;
this.checkBox4.Text = "checkBox4";
this.checkBox4.UseVisualStyleBackColor = true;
// 
// checkBox3
// 
this.checkBox3.AutoSize = true;
this.checkBox3.Location = new System.Drawing.Point(3, 47);
this.checkBox3.Name = "checkBox3";
this.checkBox3.Size = new System.Drawing.Size(80, 17);
this.checkBox3.TabIndex = 2;
this.checkBox3.Text = "checkBox3";
this.checkBox3.UseVisualStyleBackColor = true;
// 
// checkBox2
// 
this.checkBox2.AutoSize = true;
this.checkBox2.Location = new System.Drawing.Point(4, 24);
this.checkBox2.Name = "checkBox2";
this.checkBox2.Size = new System.Drawing.Size(80, 17);
this.checkBox2.TabIndex = 1;
this.checkBox2.Text = "checkBox2";
this.checkBox2.UseVisualStyleBackColor = true;
// 
// checkBox1
// 
this.checkBox1.AutoSize = true;
this.checkBox1.Location = new System.Drawing.Point(4, 4);
this.checkBox1.Name = "checkBox1";
this.checkBox1.Size = new System.Drawing.Size(80, 17);
this.checkBox1.TabIndex = 0;
this.checkBox1.Text = "checkBox1";
this.checkBox1.UseVisualStyleBackColor = true;

public Form1()
{
    InitializeComponent();
    panel1.Visible =false;
}


private void comboBox1_DropDown(object sender, EventArgs e)
{
    panel1.Visible = true;
}

private void comboBox1_DropDownClosed(object sender, EventArgs e)
{
    panel1.Visible = false;
}

Solution 2

Just a quick glance at the screenshot, it seems like there are actually two controls, a combobox, and a checklistbox. It should be possible for you to use the DropDown method of the combobox make the checklistbox visible, then once users leave the checklistbox, append the checked values to the combobox as text (and make the checklistbox non-visible again). Just a thought; don't have access to an editor to see if this is possible or not, but it seems likely.

Share:
33,250
Matt Wilko
Author by

Matt Wilko

My areas are mainly VB.NET, ASP.NET and VB6. If you code in VB.NET you should switch Option Strict On Now My pet hate is that coding in C# doesn't give the same user experience as coding in VB.NET like: Always automatically indenting code IntelliSense that works on Enums Having to add () to the end of methods Having to use a semi-colon at the end of each line

Updated on July 09, 2022

Comments

  • Matt Wilko
    Matt Wilko almost 2 years

    Does anyone know of a simple implementation of a checked combobox in WinForms? I haven't been able to find anything when googling.

    I want something that behaves like this windows scheduled task trigger edit:

    enter image description here

  • Matt Wilko
    Matt Wilko over 12 years
    Yes I had the same thought after posting - I think this is the approach I will take and see how much work is involved.
  • Matt Wilko
    Matt Wilko over 12 years
    Thanks I have implemented something very similar to this although I used a ListView with CheckBoxes = True instead of a panel so that I don't have to worry about aligning the checkboxes
  • Adnan Bhatti
    Adnan Bhatti about 10 years
    If I implement this, as soon as I will click on panel1 the dropdown will close hence causing the panel to hide.
  • Mattias Nordqvist
    Mattias Nordqvist about 10 years
    I have the same problem as @MSStp
  • sindhu jampani
    sindhu jampani about 10 years
    It was done but not allowing to check the checkbox.How can i do that as the checkbox was closing before checking the check box
  • Digambar Malla
    Digambar Malla over 8 years
    This is not working, as we are not adding the panel to combobox dropdown list, so whenever we are clicking on the panel item, combox thinks we are clicking outside of it, so it is closing the panel (which is default behavior of combobox).
  • Adarsh Ravi
    Adarsh Ravi almost 7 years
    Instead of using the DropDown and DropDownClosed events which causes the panel to go invisible immediately on clicking on the checkbox we could use the MouseClick event private void comboBox1_MouseClick(object sender, MouseEventArgs e) { comboBox1.DroppedDown = false; if (panel1.Visible) { panel1.Visible = false; } else { panel1.Visible = true; } }