Laden...

eigene Gruppen-ComboBox, Anzeige beim DropDown nicht richtig

Erstellt von lukasS vor 10 Jahren Letzter Beitrag vor 10 Jahren 921 Views
lukasS Themenstarter:in
65 Beiträge seit 2009
vor 10 Jahren
eigene Gruppen-ComboBox, Anzeige beim DropDown nicht richtig

Hallo,

ich möchte eine ComboBox haben, wo ich Gruppen und deren Werte anzeigen möchte:


Gruppe1 | Wert1
        | Wert2
        | Wert3
Gruppe2 | Wert9
        | Wert54 

Das habe ich auch mit der OnDrawItem-Methode hinbekommen. Damit die Gruppen nicht beim jedem Wert zusehen sind, habe ich mri eine Liste mit bereits vorhandenen Gruppen erstellt. Falls eine Gruppe vorhanden ist, soll diese nicht angezeigt werden, nur der Wert.

Problem hier bei ist jetzt, wenn cih die ComboBox öffne und über die Felder gleite, so dass der blaue Selektionsbalken über die Items wandert, verschwinden die Gruppenfelder, da die schon in der Liste drin stehen. Das Feld wird ja immer neu gezeichnet und von der Logik her werden die vorhandenen Gruppen halt nicht gezeichnet.

Leider kenne ich mich in diesem Bereich nicht sonderlich gut aus. Sollte ich dafür lieber eine andere Methode verwenden oder gibt es vielleicht einen bestimmten Zustand wo ich meine Liste leeren könnte?
ÜBer die Sortierung muss mich auch noch Gedanken machen.

Ich wollte hier mit dem Items.Add arbeiten, anstatt mit einem DataSource. Mit dem DS bin ich schon gescheitert, da ich im Programm immer wieder die ComboBox aktualisieren muss (Werte kommen und gehen) und das hat nicht funktioniert, aber das ist eine andere Geschichte.

Würde mich über ein paar Tipps freuen!

Gruß

Lukas


      List<string> lstGroupExist = new List<string>();

      protected override void OnDrawItem(DrawItemEventArgs e)
      {
         base.OnDrawItem(e);

         if (DesignMode)
            return;

         if (e.Index == -1)
            return;

         e.DrawBackground();
         Rectangle rec = e.Bounds;

         using (Pen lnPen = new Pen(SystemColors.GrayText))
         {
            using (SolidBrush brush = new SolidBrush(ForeColor))
            {
               Program.cEntitaet curEnti = Items[e.Index] as Program.cEntitaet;

               if (!DroppedDown)
               {
                  //Nur ein Wert soll nach dem Auswahl angezeigt werden
                  e.Graphics.DrawString(curEnti.Wert, Font, brush, rec);
               }
               else
               {
                  //Prüfen ob Gruppen schon eingetragen ist
                  if (!lstGroupExist.Exists(delegate(string s) { return s == curEnti.Gruppe; }))
                  {
                     e.Graphics.DrawString(curEnti.Gruppe, new Font(Font, FontStyle.Bold), brush, rec);
                     lstGroupExist.Add(curEnti.Gruppe);
                  }
                  //Linie zeichnen
                  e.Graphics.DrawLine(lnPen, rec.Right, rec.Top, rec.Right, rec.Bottom);
                  rec.Width = (int)clWidths[0] + columnPadding;
                  rec.X = rec.Right;
                  //Wert einfügen
                  e.Graphics.DrawString(curEnti.Wert, Font, brush, rec);
               }
            }
         }

         e.DrawFocusRectangle();
      }

T
156 Beiträge seit 2012
vor 10 Jahren

Hallo LukasS,

merke Dir doch zu Deiner Listen von Gruppen gleich das Item, in dem dieses vorhanden ist. Beispielsweise in einem Dictionary.
Dann kannst Du nicht nur prüfen ob vorhanden sondern auch ob in diesem Item angezeigt und die Anzeige entsprechend steuern.

Viele Grüße,
telfa

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo lukasS,

du kannst als ComboBox-Item ein beliebiges Objekt verwenden, in dem du dir dann auch genau merken kannst, was wie gezeichnet werden soll.

herbivore