Is there a simple way to implement a Checked Combobox in WinForms
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.
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, 2022Comments
-
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:
-
Matt Wilko over 12 yearsYes 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 over 12 yearsThanks I have implemented something very similar to this although I used a
ListView
withCheckBoxes = True
instead of a panel so that I don't have to worry about aligning the checkboxes -
Adnan Bhatti about 10 yearsIf I implement this, as soon as I will click on panel1 the dropdown will close hence causing the panel to hide.
-
Mattias Nordqvist about 10 yearsI have the same problem as @MSStp
-
sindhu jampani about 10 yearsIt 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 over 8 yearsThis 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 almost 7 yearsInstead of using the
DropDown
andDropDownClosed
events which causes the panel to go invisible immediately on clicking on the checkbox we could use theMouseClick
event private void comboBox1_MouseClick(object sender, MouseEventArgs e) { comboBox1.DroppedDown = false; if (panel1.Visible) { panel1.Visible = false; } else { panel1.Visible = true; } }