Tengo un problema con el comportamiento de autocompletar de los cuadros combinados en VB.NET (con .NET framework 2.0).ComboBox de VB.NET - Comportamiento de autocompletado para los valores numéricos
estoy utilizando un cuadro combinado que escribir numéricos valores, y su lista desplegable para sugerir posibles numéricos valores. Esta lista está ordenada en orden ascendente, por ejemplo {"10", "92", "9000", "9001"}.
Las propiedades combobox se establecen de la siguiente manera:
- AutoCompleteMode: SuggestAppend
- AutoCompleteSource: ListItems
- DropDownStyle: desplegable
- Ordenada: Falso
la lista desplegable es simplemente lleno de esta manera:
- myCombobox.Items.Add ("10")
- myCombobox.Items.Add ("92")
- myCombobox.Items.Add ("9000")
- myCombobox.Items.Add (" 9001 ")
Cuando no escribo nada, el orden de los valores de la lista DropDown es correcto, en orden original/ascendente. Sin embargo, cuando empiezo a escribir algo, los valores sugeridos en la lista DropDown se ordenan (alfanuméricamente): si escribo "9", la lista de sugerencias se convierte en {"9000", "9001", "92"}.
Me gustaría evitar que este comportamiento obtenga los valores de la lista en el orden original/ascendente. No puedo entender cómo ...
Un posible problema sería rellenar con ceros los valores de la lista, p. {"0010", "0092", "9000", "9001"} pero me gustaría evitar esto.
Editar:
Como sugiere bendataclear, se puede utilizar un cuadro de lista para mostrar las sugerencias. Esto funcionará para listas pequeñas pero no se adapta bien a listas grandes. Puede ser útil para algunas aplicaciones. Basado en el código dado por bendataclear, me hizo trabajar de esta manera:
Private Sub ComboBox1_KeyUp(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles ComboBox1.KeyUp
Dim cursorPos As Integer = ComboBox1.SelectionStart
ListBox1.Items.Clear()
For Each s In ComboBox1.Items
If s.StartsWith(ComboBox1.Text) Then
ListBox1.Items.Add(s)
End If
Next
If ListBox1.Items.Count > 0 And ComboBox1.Text.Length > 0 Then
ComboBox1.Text = ListBox1.Items(0)
ComboBox1.SelectionStart = cursorPos
ComboBox1.SelectionLength = 0
End If
End Sub
El código no ha sido probado a fondo y se puede mejorar, pero la idea principal es que hay.
Edición 2:
Usando DataGridView conduce a un mejor rendimiento; fue suficiente para mí. Gracias bendataclear.
Sólo por curiosidad, cualquier otra respuesta es bienvenida :)
Gracias bendataclear. Esa es de hecho una forma de proceder. Sin embargo, se vuelve lento cuando crece la lista de elementos. Uno podría quizás usar mapas hash para construir previamente todas las listas posibles de elementos dependiendo del texto ingresado en el cuadro combinado, y así evitar pasar por toda la lista cada vez. Me resulta sorprendente que no pueda encontrar una forma más sencilla ... He agregado su solución a la pregunta. – DevelBD
Agregado para responder – bendataclear
Eso funciona. Las cadenas deben estar envueltas en una clase personalizada, de lo contrario, solo DataGridView mostrará la longitud de la cadena (ver http://stackoverflow.com/questions/479329/how-to-bind-a-string-list-to-a -cuadrícula de datos). Funciona bien para 10k artículos, y es razonablemente rápido para 100k artículos en mi computadora. ¡Gracias! – DevelBD