public static CheckedListBox ShowCheckBoxes(string[] options, string caption, int w, int h, int wc = 110, int hc = 300) { Form prompt = new Form() { AutoSize = true, Width = w, Height = h, FormBorderStyle = FormBorderStyle.FixedDialog, Text = caption, StartPosition = FormStartPosition.CenterParent, ControlBox = false, AutoScaleMode = AutoScaleMode.Font, AutoSizeMode = AutoSizeMode.GrowOnly }; FlowLayoutPanel pnl = new FlowLayoutPanel { Dock = DockStyle.Fill, Visible = true, Name = caption, TabIndex = 0, AutoSize = true, AutoSizeMode = AutoSizeMode.GrowOnly, FlowDirection = FlowDirection.TopDown }; CheckedListBox cb = new CheckedListBox(); cb.ItemCheck += Cb_ItemCheck; cb.CheckOnClick = true; cb.Items.AddRange(options); cb.IntegralHeight = true; cb.SetItemCheckState(0, CheckState.Checked); for (int i = 1; i < cb.Items.Count; i++) { cb.SetItemChecked(i, false); cb.GetItemRectangle(i); //This is required for GetPreferredSize to function. Very confusing. } Button toggleAllSelection = new Button() { Anchor = AnchorStyles.Right, Dock = DockStyle.Top, Text = "Select/Deselect All", Left = 350, Width = 100, Top = 70, AutoSize = true }; toggleAllSelection.Click += (sender, e) => { bool isChecked = false; for (int i = 1; i < cb.Items.Count && isChecked == false; i++) { isChecked = cb.GetItemChecked(i); } for (int i = 1; i < cb.Items.Count; i++) { cb.SetItemChecked(i, !isChecked); } }; pnl.Controls.Add(toggleAllSelection); cb.ClientSize = cb.GetPreferredSize(new System.Drawing.Size()); pnl.Controls.Add(cb); Button confirmation = new Button() { Anchor = AnchorStyles.Right, Dock = DockStyle.Bottom, Text = "OK", Left = 350, Width = 100, Top = 70, DialogResult = DialogResult.OK, AutoSize = true }; confirmation.Click += (sender, e) => { prompt.Close(); }; pnl.Controls.Add(confirmation); prompt.AcceptButton = confirmation; prompt.Controls.Add(pnl); prompt.ShowDialog(); return(cb); }