none
Como hacer que el combobox cuando se despliegue RRS feed

Respuestas

  • Hola JETET

    Lo que puedes hacer es recorrer los elements, y mediante MeasureText (TextRenderer). Aquí hay ejemplos :

    auto-width of combobox content

    Full view of ComboBox drop-down list

    Están en C#, pero si usas Vb.Net puedes usar Code Converted, la lógica no cambia.

    Impleméntalo y si tienes problemas, lo posteas para ayudarte.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Propuesto como respuesta César A. Cámara sábado, 16 de julio de 2016 21:46
    • Marcado como respuesta JETET domingo, 17 de julio de 2016 20:24
    sábado, 16 de julio de 2016 7:29
  • JETET,

    Entiendo que no hay una manera simple de lograrlo y la solución pasa por crear un control custom que se adapte al ancho de la longitud de sus elementos (ya resuelto) y que además actualice la posición del desplegable según el contenedor (problema que presentas actualmente), te recomiendo que leas el siguiente artículo: Building a Better ComboBox, muestra como resolver ambos casos.

    Sin embargo, así lograras resolver el problema que presentas nota que el ComboBox limita el contenido del texto que muestra, ganas ampliando el desplegable pero el área que muestra el texto está limitado por el ancho del control. Te recomiendo que olvides adaptar el ancho del desplegable según la longitud de sus elementos (o has uso de la propiedad DropDownWidth para limitar el ancho del desplegable), coloca el control debajo de la etiqueta 'Levadura' e incrementa el ancho del ComboBox hasta donde sea posible, no olvides la recomendación anterior de tener un desplegable dependiente para la categoría, vas a ganar en rapidez de selección, lectura y elementos con menor longitud.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta JETET domingo, 17 de julio de 2016 20:24
    domingo, 17 de julio de 2016 16:22
  • JETET,

    Efectivamente, la solución pasa por obtener la medida de cada elemento y ajustar el ancho de la lista desplegable según la mayor longitud. Hay varios acercamientos con la misma propuesta, te muestro el que me parece mas completo (fuente Adjust combo box drop down list width to longest string width).

    Private Sub comboBox1_DropDown(sender As Object, e As System.EventArgs)
    	Dim senderComboBox As ComboBox = DirectCast(sender, ComboBox)
    	Dim width As Integer = senderComboBox.DropDownWidth
    	Dim g As Graphics = senderComboBox.CreateGraphics()
    	Dim font As Font = senderComboBox.Font
    	Dim vertScrollBarWidth As Integer = If((senderComboBox.Items.Count > senderComboBox.MaxDropDownItems), SystemInformation.VerticalScrollBarWidth, 0)
    
    	Dim newWidth As Integer
    	For Each s As String In DirectCast(sender, ComboBox).Items
    		newWidth = CInt(g.MeasureString(s, font).Width) + vertScrollBarWidth
    		If width < newWidth Then
    			width = newWidth
    		End If
    	Next
    	senderComboBox.DropDownWidth = width
    End Sub
    

    Por otro lado, imagino que la parte -por ejemplo [Wyeast Labs]- es la categoría, ¿verdad?. Puedes omitirla y hacer la lista mas fácil de buscar y leer si implementas un primer desplegable con la categoría y luego otro desplegable con la levadura (desplegables en cascada), ganas en usabilidad y facilitas la selección de un elemento al usuario.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta JETET domingo, 17 de julio de 2016 20:24
    sábado, 16 de julio de 2016 15:12

Todas las respuestas

  • Hola JETET

    Lo que puedes hacer es recorrer los elements, y mediante MeasureText (TextRenderer). Aquí hay ejemplos :

    auto-width of combobox content

    Full view of ComboBox drop-down list

    Están en C#, pero si usas Vb.Net puedes usar Code Converted, la lógica no cambia.

    Impleméntalo y si tienes problemas, lo posteas para ayudarte.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Propuesto como respuesta César A. Cámara sábado, 16 de julio de 2016 21:46
    • Marcado como respuesta JETET domingo, 17 de julio de 2016 20:24
    sábado, 16 de julio de 2016 7:29
  • JETET,

    Efectivamente, la solución pasa por obtener la medida de cada elemento y ajustar el ancho de la lista desplegable según la mayor longitud. Hay varios acercamientos con la misma propuesta, te muestro el que me parece mas completo (fuente Adjust combo box drop down list width to longest string width).

    Private Sub comboBox1_DropDown(sender As Object, e As System.EventArgs)
    	Dim senderComboBox As ComboBox = DirectCast(sender, ComboBox)
    	Dim width As Integer = senderComboBox.DropDownWidth
    	Dim g As Graphics = senderComboBox.CreateGraphics()
    	Dim font As Font = senderComboBox.Font
    	Dim vertScrollBarWidth As Integer = If((senderComboBox.Items.Count > senderComboBox.MaxDropDownItems), SystemInformation.VerticalScrollBarWidth, 0)
    
    	Dim newWidth As Integer
    	For Each s As String In DirectCast(sender, ComboBox).Items
    		newWidth = CInt(g.MeasureString(s, font).Width) + vertScrollBarWidth
    		If width < newWidth Then
    			width = newWidth
    		End If
    	Next
    	senderComboBox.DropDownWidth = width
    End Sub
    

    Por otro lado, imagino que la parte -por ejemplo [Wyeast Labs]- es la categoría, ¿verdad?. Puedes omitirla y hacer la lista mas fácil de buscar y leer si implementas un primer desplegable con la categoría y luego otro desplegable con la levadura (desplegables en cascada), ganas en usabilidad y facilitas la selección de un elemento al usuario.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta JETET domingo, 17 de julio de 2016 20:24
    sábado, 16 de julio de 2016 15:12
  • JETET,

    Efectivamente, la solución pasa por obtener la medida de cada elemento y ajustar el ancho de la lista desplegable según la mayor longitud. Hay varios acercamientos con la misma propuesta, te muestro el que me parece mas completo (fuente Adjust combo box drop down list width to longest string width).

    Private Sub comboBox1_DropDown(sender As Object, e As System.EventArgs)
    	Dim senderComboBox As ComboBox = DirectCast(sender, ComboBox)
    	Dim width As Integer = senderComboBox.DropDownWidth
    	Dim g As Graphics = senderComboBox.CreateGraphics()
    	Dim font As Font = senderComboBox.Font
    	Dim vertScrollBarWidth As Integer = If((senderComboBox.Items.Count > senderComboBox.MaxDropDownItems), SystemInformation.VerticalScrollBarWidth, 0)
    
    	Dim newWidth As Integer
    	For Each s As String In DirectCast(sender, ComboBox).Items
    		newWidth = CInt(g.MeasureString(s, font).Width) + vertScrollBarWidth
    		If width < newWidth Then
    			width = newWidth
    		End If
    	Next
    	senderComboBox.DropDownWidth = width
    End Sub

    Por otro lado, imagino que la parte -por ejemplo [Wyeast Labs]- es la categoría, ¿verdad?. Puedes omitirla y hacer la lista mas fácil de buscar y leer si implementas un primer desplegable con la categoría y luego otro desplegable con la levadura (desplegables en cascada), ganas en usabilidad y facilitas la selección de un elemento al usuario.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    Si funciona pero lo que pasa es me amplia hacia la derecha y se pierde por la pantalla

    domingo, 17 de julio de 2016 8:09
  • JETET,

    Entiendo que no hay una manera simple de lograrlo y la solución pasa por crear un control custom que se adapte al ancho de la longitud de sus elementos (ya resuelto) y que además actualice la posición del desplegable según el contenedor (problema que presentas actualmente), te recomiendo que leas el siguiente artículo: Building a Better ComboBox, muestra como resolver ambos casos.

    Sin embargo, así lograras resolver el problema que presentas nota que el ComboBox limita el contenido del texto que muestra, ganas ampliando el desplegable pero el área que muestra el texto está limitado por el ancho del control. Te recomiendo que olvides adaptar el ancho del desplegable según la longitud de sus elementos (o has uso de la propiedad DropDownWidth para limitar el ancho del desplegable), coloca el control debajo de la etiqueta 'Levadura' e incrementa el ancho del ComboBox hasta donde sea posible, no olvides la recomendación anterior de tener un desplegable dependiente para la categoría, vas a ganar en rapidez de selección, lectura y elementos con menor longitud.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta JETET domingo, 17 de julio de 2016 20:24
    domingo, 17 de julio de 2016 16:22
  • ok gracias a todos por la ayuda
    domingo, 17 de julio de 2016 20:24