una - Combobox VB.NET-Comportamiento de autocompletado para valores numéricos
insertar datos en combobox vb net (1)
Parece ser un problema cuando el cuadro combinado muestra los datos, ya que incluso si configura una fuente personalizada, reordena en orden alfabético:
ComboBox1.Items.Add("10")
ComboBox1.Items.Add("92")
ComboBox1.Items.Add("9000")
ComboBox1.Items.Add("9001")
ComboBox1.AutoCompleteCustomSource.Add("10")
ComboBox1.AutoCompleteCustomSource.Add("92")
ComboBox1.AutoCompleteCustomSource.Add("9000")
ComboBox1.AutoCompleteCustomSource.Add("9001")
ComboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource
Creo que la única forma en que puedo pensar es crear tu propio autocompletar algo así como (no probado):
Dim cbotxt As String = ComboBox1.Text
Dim key As String
key = ChrW(e.KeyCode)
ListBox1.Items.Clear()
For Each i In ComboBox1.Items
Dim s As String = i.ToString()
If s.StartsWith(ComboBox1.Text & key) Then
ListBox1.Items.Add(s)
End If
Next
If ListBox1.Items.Count > 0 Then
ListBox1.Visible = True
ComboBox1.Text = ListBox1.Items(0)
End If
Editar:
Un buen enfoque para muchos elementos (estoy usando más de 10000 en una aplicación):
Primero cambie de un cuadro de lista a una vista de cuadrícula de datos. A continuación, declare una lista de cadenas y complete los valores que desea autocompletar
Dim Numberlist as List<Of String>
'' Fill List using Numberlist.Add("String")
Luego, en la propiedad de cambio de texto:
Filter = NumberList.FindAll(AddressOf checkNum)
DataGridView1.DataSource = Filter
Y agregue la función para verificar las cadenas.
Function checkNum(ByVal b As String) As Boolean
If b.StartsWith(ComboBox1.Text) Then
Return True
Else
Return False
End If
End Function
Este método se ejecuta en mi máquina con 10k elementos más rápido de lo que puedo escribir.
Tengo un problema con el comportamiento de autocompletar de los cuadros combinados en VB.NET (con .NET framework 2.0).
Estoy usando un cuadro combinado para escribir valores numéricos , y su lista desplegable para sugerir posibles valores numéricos . Esta lista está ordenada en orden ascendente, por ejemplo {"10", "92", "9000", "9001"}.
Las propiedades del cuadro combinado se establecen de la siguiente manera:
- AutoCompleteMode: SuggestAppend
- AutoCompleteSource: ListItems
- DropDownStyle: DropDown
- Ordenado: Falso
La lista DropDown simplemente se llena 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 ...
Una posible solución sería rellenar con ceros los valores de la lista, por ejemplo {"0010", "0092", "9000", "9001"}, pero me gustaría evitar esto.
Editar:
Como lo sugiere bendataclear, uno puede usar un cuadro de lista para mostrar las sugerencias. Esto funcionará para listas pequeñas pero no escala bien a listas grandes. Puede ser útil para algunas aplicaciones. Basado en el código proporcionado por bendataclear, lo hice funcionar 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 se ha probado exhaustivamente y se puede mejorar, pero la idea principal está ahí.
Editar 2:
Usar DataGridView conduce a un mejor rendimiento; fue suficiente para mí. Gracias bendataclear.
Solo por curiosidad, cualquier otra respuesta es bienvenida :)