2009-12-27 6 views
5

Ich leitete eine Klasse von ComboBox, machte es zu einem Besitzer gezeichneten Listbox (DrawMode.OwnerDrawVariable Stil), und durch Überschreiben von OnMeasureItem und OnDrawItem füge ich spezielle Elemente in die Dropdown-Liste (Trennzeichen, zum Beispiel) sind kleiner/größer als die normalen Elemente, die die Kontrolle bewohnen.Variabler Besitzer-Zeichensatz ComboBox; Liste nicht korrekt sortiert

Nun, das Problem, das ich habe und nicht effektiv zu beheben scheint, ist die Größe der Dropdown-Liste: Es gibt einen hässlichen leeren Platz am Ende der Liste, wenn es fällt. Ich dachte, ich habe das angepackt, indem ich die DropDownHeight -Eigenschaft der ComboBox auf die Summe der Höhe aller Elemente gesetzt habe, aber das scheint nicht zu funktionieren die Zeit. Manchmal, bei einer zufälligen Anzahl von Gegenständen, kehrt der leere Leerraum des Schicksals zurück. Dies ist ein ungewöhnliches Problem, aber hoffentlich ein gemeinsames und leicht zu beheben.

Wie kann ich die Drop-down-Liste der ComboBox genau auf die Größe der darin enthaltenen Elemente anpassen?

Antwort

4

Ich sehe einen ziemlich dummen Fehler in der ComboBox.UpdateDropDownHeight() Methode. Wenn die DropDownHeight-Eigenschaft mit dem Standardwert übereinstimmt, berechnet sie eine benutzerdefinierte Höhe, um die Dropdown-Liste an die Anzahl der Elemente anzupassen. Selbst wenn du den DrawMode geändert hast, ist das völlig falsch.

Die Abhilfe:

int height = ...; // Your code here 
    if (height == 106) ++height; 
    comboBox1.DropDownHeight = height; 

Sie erhalten ein ein Pixel Lücke erhalten, sollten Sie in der Lage sein, dass in Ihrem OnDrawItem() Überlastung zu verstecken.

+0

Dieser Fehler erstreckt sich ein wenig tiefer als das. Der Standardwert von DropDownHeight basiert auf der Schriftgröße der Elemente in der Combobox. Jede Änderung der Höhe eines einzelnen Elements, die nicht auf einer Änderung der Schriftgröße basiert, führt zu einem Problem mit der DropDownHeight-Eigenschaft. – Stewbob

+1

Nein, die Standardgröße ist in einer Konstanten fest codiert, sehen Sie in der Referenzquelle nach. Es heißt "DefaultDropDownHeight". Wenn Ihre Theorie richtig ist, sollten Sie dies viel häufiger sehen. Vor allem, da Sie OnMeasureItem implementieren, wird die Artikelhöhe immer nicht standardisiert sein. Ich bin gezwungen, hier zu raten, Ihre Frage hat keinen Hinweis darauf, was das Aussehen der Lücke auslösen könnte. –

+0

@nobugz: Ja, du hast Recht. Ich tippte schneller als ich dachte. Die Artikelhöhe basiert auf der Schriftgröße.In bestimmten Fällen wird damit der maximale Wert von DropDownHeight bestimmt. – Stewbob

1

ich das Problem in der Art und Weise erraten, wie Sie Ihre Drop-Down-Liste Höhe sind zu berechnen, ich denke, es smth wie folgt ist:

comboBox.DropDownHeight = N_of_items * item_height; 

die Gesamthöhe der Dropdown-Liste sollte auch seine oberen und unteren Rand Höhe, so dass, wenn Sie tun würden, smth wie folgt aus:

comboBox.DropDownHeight = N_of_items * item_height + SystemInformation.BorderSize.Height*2; 

es den Trick tun sollten und zeigen die Dropdown-Liste ohne weiße Bereiche

hoffe, das hilft, r eggs

2

Ich verbrachte eine lange Zeit das gleiche Problem zu kämpfen.

Wenn Sie der Combobox benutzerdefinierte Objekte hinzufügen, wird DropDownHeight nicht ordnungsgemäß festgelegt. Um sicherzustellen, dass Sie es jedes Mal richtig einstellen, müssen Sie eine Windows-Nachricht entführen.

This post zeigt wie. Behalten Sie einfach die Höhe aller Elemente (Standard und benutzerdefiniert) in Ihrer Combobox im Auge und legen Sie dann die Gesamthöhe des Dropdown-Bereichs fest, wie im Beispiel gezeigt.

Verwandte Themen