11

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
  • 26,994
  • 10
  • 93
  • 143

2 Answers2

14

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;
}
Breeze
  • 2,010
  • 2
  • 32
  • 43
user1120193
  • 252
  • 3
  • 11
  • 1
    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 – Matt Wilko Jan 13 '12 at 09:01
  • 2
    If I implement this, as soon as I will click on panel1 the dropdown will close hence causing the panel to hide. – Adnan Bhatti Feb 13 '14 at 23:04
  • I have the same problem as @MSStp – Mattias Nordqvist Mar 24 '14 at 13:15
  • 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 – sindhu jampani Apr 14 '14 at 07:48
  • 2
    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). – Digambar Malla Jan 28 '16 at 09:57
  • 1
    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; } } – Adarsh Ravi May 31 '17 at 07:41
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.

APrough
  • 2,671
  • 3
  • 23
  • 31
  • 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 Jan 11 '12 at 17:04