Je ne parviens pas à afficher correctement le DropDownHeight du ComboBox pour afficher tous les éléments.Impossible de définir DropDownHeight de ComboBox
J'utilise un contrôle qui hérite du ComboBox. J'ai substitué les méthodes OnDrawItem et OnMeasureItem afin de créer plusieurs colonnes et l'habillage de texte dans une colonne si cela est nécessaire. Tout cela fonctionne très bien.
Le problème se produit lorsque j'essaie de définir DropDownHeight. J'ai mis le DropDownHeight à une valeur arbitrairement grande, un peu plus grande que la liste des éléments. Le contrôle ComboBox semble tronquer automatiquement toute valeur pour DropDownHeight qui est supérieure à la taille de tous les éléments affichés dans la liste. (En supposant que vous avez la propriété MaxDropDownItems réglée plus haut que le nombre d'articles que je fais.) Normalement, ce comportement fonctionne parfaitement, comme indiqué ci-dessous: alt text http://www.freeimagehosting.net/uploads/dd09404697.png
Non, ce n'est pas mes données réelles dans la liste déroulante .
Le problème se produit lorsque j'ai une entrée dans la liste déroulante qui doit envelopper pour afficher le texte intégral. Cette entrée s'affiche correctement, mais le composant ComboBox calcule le DropDownHeight. Il ignore le fait que l'une des entrées est deux fois plus grande que la normale. Vous devez donc faire défiler une ligne pour accéder à la dernière entrée de la liste déroulante. alt text http://www.freeimagehosting.net/uploads/d0ef715f83.png
Voici le code que j'utilise pour déterminer si un élément a besoin habillage de texte et de régler la hauteur de chaque élément:
Protected Overrides Sub OnMeasureItem(ByVal e As System.Windows.Forms.MeasureItemEventArgs)
MyBase.OnMeasureItem(e)
//Determine the proper height of the current row in the dropdown based on
//the length of the OptionDescription string.
Dim tmpStr As String = FilterItemOnProperty(Items(e.Index), "OptionDescription")
Dim lng As Single = e.Graphics.MeasureString(tmpStr, Me.Font).Width
//Use the length of the item and the width of the column to calculate if wrapping is needed.
Dim HeightMultiplier As Integer = Math.Floor(lng/_ColumnWidths(1)) + 1
e.ItemHeight = e.ItemHeight * HeightMultiplier
End Sub
Je ne peux pas déterminer comment forcer la propriété DropDownHeight être exactement la valeur que je veux ou comment laisser le contrôle ComboBox savoir qu'un (ou plusieurs) des éléments de la liste sont plus grands que la normale.
J'ai essayé de
Remplacer
Ombre la propriété DropDownHeight, mais cela n'a apparemment pas eu d'impact.
EDIT:
Est-ce que le passage à ce problème WPF faire disparaître? (Y at-il assez customizability dans les contrôles standard WPF pour que je ne ai pas besoin d'écrire un contrôle personnalisé pour un 3-colonne, combobox hauteur variable?)
JDHnz, merci pour votre réponse. J'essaie d'éviter de détourner les messages Windows, mais votre solution semble fonctionner pour moi si je ne trouve pas d'autre moyen. Je devrais ajouter quelques fonctionnalités supplémentaires à mon contrôle qui stocke le ItemHeight pour chaque élément de la liste déroulante, mais cela ne devrait pas être trop difficile. – Stewbob
Merci JDHnz. J'ai réussi à implémenter ceci dans mon application. – Stewbob