2017-12-21 3 views
-1

Ich füge ein Kontrollkästchen zu einer ComboBox in einer WindowsForm hinzu. Das Kontrollkästchen hinzufügen und ich kann sie als Elemente auswählen, aber ich kann den Text des Kästchens zum Ankreuzen sehen. In der Combobox-Dropdown-Liste sind die Elemente leer, und wenn Sie auf das Objekt klicken, werden die korrekten Details angezeigt.Hinzufügen von Kontrollkästchen zu ComboBox in Dropdown nicht sichtbar

Wie mache ich sie sichtbar, um die Box und den Namen zu sehen?

+0

Setzen Sie Ihren Code !!! –

+0

// 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); –

+0

dllMethodParameters.Controls.Add (comJect [Depth]); Diese Anweisung fügt dem Steuerelement das Kontrollkästchen hinzu, nicht jedoch die Dropdown-Liste. –

Antwort

0

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.

+0

Ein Link zu einer Lösung ist willkommen, aber stellen Sie bitte sicher, dass Ihre Antwort ohne sie nützlich ist: [Fügen Sie einen Kontext um den Link hinzu] (// meta.stackexchange.com/a/8259), damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es da ist. Zitieren Sie dann den relevantesten Teil der Seite, auf die Sie verlinken, falls die Zielseite nicht verfügbar ist. [Antworten, die etwas mehr als ein Link sind, können gelöscht werden.] (// stackoverflow.com/help/deleted-answers) – Rob

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzubeziehen und bereitzustellen der Link als Referenz. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/18703794) – Mamun

Verwandte Themen