No puedo obtener el DropDownHeight del ComboBox configurado correctamente para mostrar todos los elementos.No se puede establecer el DropDownHeight de ComboBox
Estoy usando un control que hereda del ComboBox. He reemplazado los métodos OnDrawItem y OnMeasureItem para crear varias columnas y ajuste de texto dentro de una columna si es necesario. Todo esto funciona bien
El problema se produce cuando intento establecer DropDownHeight. Establecí DropDownHeight en un valor arbitrariamente grande, un poco más grande que la lista de elementos. El control ComboBox parece truncar automáticamente cualquier valor para DropDownHeight que sea más grande que el tamaño de todos los elementos mostrados en la lista. (Asumiendo que usted tiene la propiedad MaxDropDownItems fija más alto que el número de elementos, lo que hago.) Normalmente este comportamiento funciona perfectamente, como se muestra a continuación: alt text http://www.freeimagehosting.net/uploads/dd09404697.png
No, eso no es mis datos reales en el cuadro desplegable .
El problema se produce cuando tengo una entrada en el menú desplegable que debe completarse para mostrar el texto completo. Esta entrada se muestra bien, pero sin embargo, el ComboBox está calculando DropDownHeight, ignora el hecho de que una de las entradas es dos veces más alta de lo normal, por lo que tiene que desplazarse hacia abajo una línea para llegar a la última entrada en el menú desplegable. alt text http://www.freeimagehosting.net/uploads/d0ef715f83.png
Este es el código que estoy usando para determinar si un artículo necesita ajuste de texto y para fijar la altura de cada elemento:
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
no puedo determinar cómo forzar la propiedad DropDownHeight ser exactamente el valor que quiero, o cómo dejar que el control ComboBox sepa que uno (o más) de los elementos en la lista son más altos de lo normal.
He intentado
Anular
Sombrear la propiedad DropDownHeight, pero esto no parece tener ningún impacto.
EDIT:
¿Podría cambiar a WPF hacen que este problema desaparezca? (¿Hay suficiente capacidad de personalización en el estándar de WPF controles para que no necesito escribir un control personalizado de 3 columnas, cuadro combinado de altura variable?)
JDHnz, gracias por su respuesta. Intento evitar secuestrar los mensajes de Windows, pero parece que tu solución podría funcionar si no puedo encontrar otra manera. Tendría que agregar alguna funcionalidad adicional a mi control que almacena el ItemHeight para cada elemento en el cuadro combinado, pero eso no debería ser demasiado difícil. – Stewbob
Gracias JDHnz. Pude implementar esto con éxito en mi aplicación. – Stewbob