Sie müssen Ihr eigenes Benutzersteuerelement erstellen. Erster Schritt ist die Unterklasse System.Windows.Forms.ComboBox
Klasse zu erstellen:
using System;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class CheckComboBox : ComboBox
{
public CheckComboBox()
{
this.DrawMode = DrawMode.OwnerDrawFixed;
}
}
}
Sie sollten setzen Sie die DrawMode Eigenschaft der ComboBox zu sagen, dass wir die Dropdown-Listenelemente selbst machen möchten. Der nächste Schritt bestand darin, eine Klasse zu definieren, die unsere Drop-Down-Listenelementdaten enthält und den Status verwaltet. Dies ist eine einfache Klasse:
namespace WindowsFormsApp1
{
public class CheckComboBoxItem
{
public CheckComboBoxItem(string text, bool initialCheckState)
{
_checkState = initialCheckState;
_text = text;
}
private bool _checkState = false;
public bool CheckState
{
get { return _checkState; }
set { _checkState = value; }
}
private string _text = "";
public string Text
{
get { return _text; }
set { _text = value; }
}
public override string ToString()
{
return "Select Options";
}
}
}
Danach auf Ihre CheckComboBox.cs
zurück und fügen die Delegierten DrawItem
und SelectedIndexChanged
Ereignis.
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
namespace WindowsFormsApp1
{
public partial class CheckComboBox : ComboBox
{
public event EventHandler CheckStateChanged;
public CheckComboBox()
{
this.DrawMode = DrawMode.OwnerDrawFixed;
this.DrawItem += new DrawItemEventHandler(CheckComboBox_DrawItem);
this.SelectedIndexChanged += new EventHandler(CheckComboBox_SelectedIndexChanged);
}
void CheckComboBox_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index == -1)
{
return;
}
if (!(Items[e.Index] is CheckComboBoxItem))
{
e.Graphics.DrawString(
Items[e.Index].ToString(),
this.Font,
Brushes.Black,
new Point(e.Bounds.X, e.Bounds.Y));
return;
}
CheckComboBoxItem box = (CheckComboBoxItem)Items[e.Index];
CheckBoxRenderer.RenderMatchingApplicationState = true;
CheckBoxRenderer.DrawCheckBox(
e.Graphics,
new Point(e.Bounds.X, e.Bounds.Y),
e.Bounds,
box.Text,
this.Font,
(e.State & DrawItemState.Focus) == 0,
box.CheckState ? CheckBoxState.CheckedNormal :
CheckBoxState.UncheckedNormal);
}
void CheckComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
CheckComboBoxItem item = (CheckComboBoxItem)SelectedItem;
item.CheckState = !item.CheckState;
CheckStateChanged?.Invoke(item, e);
}
}
}
In DrawItems Delegierten, das erste, was wir tun, ist zu überprüfen, ob das Element wir als ein CheckComboBoxItem hinzugefügt werden, zu machen. Wenn nicht, rendern wir es als einfache Zeichenfolge. Andernfalls erhalten wir das entsprechende CheckComboBoxItem aus der Items-Auflistung (mithilfe der DrawItemEventArgs.Index-Eigenschaft). Dann rufen wir die CheckBoxRenderer.DrawCheckBox() -Methode auf, übergeben das Graphics-Objekt, in das wir das CheckBox rendern wollen, und geben den Ort, die Größe, den Text, die Schriftart, den Fokus und die Check-Zustände an. Der zweite ermöglicht es uns, das Kontrollkästchen in den Dropdownlisten zu aktivieren, aber der Benutzer dieses Steuerelements kann nicht wissen, dass etwas passiert ist. So fügen wir auch eine öffentliche Veranstaltung der Kontrolle der Nutzer einer Änderung der Kontroll Status eines Elements in der Dropdown-Liste in Kenntnis zu setzen:
public event EventHandler CheckStateChanged;
Schließlich, wenn Sie dieses Steuerelement verwenden möchten, in der Standard-Form1 diesen Code Ihrer Anwendung eingeben:
using System;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
checkComboBox1.Items.Add(new CheckComboBoxItem("One", true));
checkComboBox1.Items.Add(new CheckComboBoxItem("Two", true));
checkComboBox1.Items.Add(new CheckComboBoxItem("Three", true));
this.checkComboBox1.CheckStateChanged += new EventHandler(this.checkComboBox1_CheckStateChanged);
}
private void checkComboBox1_CheckStateChanged(object sender, EventArgs e)
{
if (sender is CheckComboBoxItem)
{
CheckComboBoxItem item = (CheckComboBoxItem)sender;
}
}
}
}
Sie haben so viele Links, die für Sie nützlich sein können. Sie stellen keinen Code, so dass wir nicht wissen, was genau Sie brauchen ...
https://www.codeproject.com/Articles/31105/A-ComboBox-with-a-CheckedListBox-as-a-Dropdown
https://www.codeproject.com/Articles/21085/CheckBox-ComboBox-Extending-the-ComboBox-Class-and
https://www.codeproject.com/Articles/18929/An-OwnerDraw-ComboBox-with-CheckBoxes-in-the-Drop
Danke @ Rob und @Mamun mich zu korrigieren.
Setzen Sie Ihren Code !!! –
// Erstellen Sie eine neue Checkbox var comJect = new CheckBox(); // Definieren der Checkbox-Eigenschaft comJect.Name = headItem; comJect.Text = Kopfelement; this.Controls.Add (comJect); dllMethodParameters.Controls.Add (comJect); dllMethodParameters.Items.Add (comJect); –
dllMethodParameters.Controls.Add (comJect [Depth]); Diese Anweisung fügt dem Steuerelement das Kontrollkästchen hinzu, nicht jedoch die Dropdown-Liste. –