Buscar datos en ComboBox con sugerencias

babri

He terminado un programa en VB.NET en el que se le muestra al usuario una ventana con dos combobox, en el primero de ellos se muestran los clientes, en el segundo los proyectos de dicho cliente.

Todo lo saco de una base de datos MySQL y ya lo tengo filtrados, cuando selecciono el cliente solo salen los proyectos de dicho cliente correctamente.

Mi problema recae en que tengo muchisimos clientes y dentro de cada uno varios proyectos, entonces el usuario si tiene que buscar un cliente concreto, lo hace normalmente con su nombre acortado, por ejemplo si es la Embaja de Angola, solo pone Angola, entonces con esto:

cbClientes.DropDownStyle = ComboBoxStyle.DropDown
cbClientes.AutoCompleteMode = AutoCompleteMode.Suggest
cbClientes.AutoCompleteSource = AutoCompleteSource.ListItems

Lo que consigo es que solo me muestre registros del Combo que empiecen con la letra que pongo, no me de sugerencias que contengan las letras deseadas.

Luego tengo otra prueba que que es para autocompletar pero que no consigo que lo haga como deseo, si no que me autocompleta, logicamente, según voy escribiendo, así que si pongo Angola o angola, no me saca Embaja de Angola, así que vuelvo al principio del problema que los usuarios han de escribir totalmente la palabra EMBAJADA, aquí os muestro el código:

'Autocompletar Campos
    Private Sub cbClientes_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles cbClientes.KeyUp
        AutoCompleteCombo_KeyUp(cbClientes, e)
    End Sub

Public Sub AutoCompleteCombo_KeyUp(ByVal cbClientes As ComboBox, ByVal e As KeyEventArgs)
    Dim sTypedText As String
    Dim iFoundIndex As Integer
    Dim oFoundItem As Object
    Dim sFoundText As String
    Dim sAppendText As String
    
    Select Case e.KeyCode
        Case Keys.Back, Keys.Left, Keys.Right, Keys.Up, Keys.Delete, Keys.Down
            Return
    End Select
    
    sTypedText = cbClientes.Text
    iFoundIndex = cbClientes.FindString(sTypedText)
  
    If iFoundIndex >= 0 Then
        
        oFoundItem = cbClientes.Items(iFoundIndex)

        sFoundText = cbClientes.GetItemText(oFoundItem)
        
        sAppendText = sFoundText.Substring(sTypedText.Length)
        cbClientes.Text = sTypedText & sAppendText
        
        cbClientes.SelectionStart = sTypedText.Length
        cbClientes.SelectionLength = sAppendText.Length
    End If
End Sub

Para resumir, estoy intentando que al poner palabras me de sugerencias de registros que contengan dichas palabras. Y no solo que empiecen como consigo hacer.

Gracias! :D

APOCa

No se de visual basic, voy a dar disparos al aire a ver si cuela.

Digo yo: podrías hacer que, sabiendo los datos que tienes ya en el combo, vayas quitando las entradas que no cumplan una determinada expresión regular.

Usuarios habituales

  • APOCa
  • babri