EXIBIR LISTA AUTOCOMPLETE COMOBOBOX MANUALMENTE

DORMARTH 10/04/2015 09:05:33
#445861
Bom dia pessoal!

Preciso de ajuda para a seguinte situação:

Eu criei, de forma bem rudimentar, um combobox com máscara de entrada para telefone. Fiz isso, por necessidade em meu local de trabalho e ficou assim:

http://gyazo.com/d20ae0f80ea886e51128b1332ce60f54

http://gyazo.com/175d99817fa680bb7439ad36fb37456f

Ficou bom e para minha necessidade estava atendendo muito bem. Mas aí surgiu a necessidade de exibir a lista de sugestões do combobox e aí que a coisa ficou torta e o trem desandou!

Como eu fiz esse componente juntando um combobox com um maskeditbox sobrepostos, quando eu digito alguma informação, a informação está sendo digitada dentro do maskeditbox e não no combobox, o que faz com que as opções escolhidas de autocomplete e lista de autocomplete não funcione! Mesmo eu tentando jogar caracter a caracter pelo evento textchanged do maskeditbox para o combobox, não da certo!

Alguém conhece algum jeito de ao digitar numa caixa, exibir a lista de sugestões de outra caixa???????????

Att.
Giovani
DORMARTH 13/04/2015 10:34:11
#445886
Bom dia pessoal!

Pastei e penei, e não consegui chegar ao meu objetivo! MAS!!! Eu consegui algo bem parecido, e que já está ajudando! Eu melhorei o meu componente em que juntei o combobox com o maskeditbox. O resultado é o arquivo que está em anexo.

Para quem quiser recriar, eu usei uma classe usercontrol do vb.net, dentro de um projeto do windows forms, com os controle combobox e maskeditbox.

Conforme eu começo a digitar na máscara do novo componente, eu exibo todos os itens da combobox. Um dia pretendo ir filtrando, mas ainda não sei como fazer isso de forma manual (igual quando o autocomplete está ligado e com a fonte de dados sendo a propria lista de itens).

Att.
Giovani
DORMARTH 16/04/2015 10:06:46
#445956
Só para fechar de vez o tópico, eu consegui completar meu objetivo! Que eram:

1º - Combobox com máscara de entrada;
2º - Autocomplete direto na máscara.

Como eu consegui:

1 combobox;
1 maskeditbox;
1 listbox;
1 bindingsource.

O bindingsource serve para 2 finalidades: Carregar os dados direto do banco de dados, facilitando assim a utilização do componente. E também serve para quando é utilizado o carregamento manual, sem um banco de dados. Mas para isso eu precisei criar uma variável do tipo datatable e preencher na mão.
Eu precisei de 4 variáveis globais no componente e uma variável publica que é o datatable.

O código ficou assim:

  Public Class maskedCombobox3
Dim bEstaMudando As Boolean = False
Dim bAlteraIndice As Boolean = False
Dim sTeclaPressionada As String = [Ô][Ô]
Dim iIndiceAtual As Integer
Public dt As New DataTable
Private Sub cbbCombobox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbbCombobox.SelectedIndexChanged
If Me.lstListaOps.Visible Then
If bAlteraIndice Then
bAlteraIndice = False
lstListaOps.SelectedIndex = iIndiceAtual

End If
End If
If cbbCombobox.SelectedIndex = -1 Then
Me.mtbMascara.Mask = [Ô](99)9999-9999[Ô]
cbbCombobox.Text = String.Empty
Exit Sub
End If
bEstaMudando = True
[ô]Escolhe a máscara ideal de acordo com o formato de telefone fixo ou de telefone de celular
[ô]Pelo evento de selecionar item do combobox
If cbbCombobox.Text.ToString.Length = 13 Then
Me.mtbMascara.Mask = [Ô](99)9999-9999[Ô]
Else
Me.mtbMascara.Mask = [Ô](99)99999-9999[Ô]
End If
Me.mtbMascara.Text = cbbCombobox.Text
bEstaMudando = False
End Sub

Private Sub mtbMascara_KeyDown(sender As Object, e As KeyEventArgs) Handles mtbMascara.KeyDown
If e.KeyCode = Keys.Delete Then
If mtbMascara.SelectionStart < sTeclaPressionada.Length Then
[ô]sTeclaPressionada = sTeclaPressionada.Replace(sTeclaPressionada.Substring(MaskedTextBox1.SelectionStart, 1), [Ô][Ô])
If sTeclaPressionada.Length = 10 And sTeclaPressionada.Substring(4, 1).ToString <> [Ô]9[Ô] Then
sTeclaPressionada = sTeclaPressionada.Remove(mtbMascara.SelectionStart - 1, 2)
Else
sTeclaPressionada = sTeclaPressionada.Remove(mtbMascara.SelectionStart, 1)
End If

End If
Exit Sub
End If
If e.KeyCode = Keys.Back Then
If sTeclaPressionada.Length > 0 Then
sTeclaPressionada = sTeclaPressionada.Remove(sTeclaPressionada.Length - 1)
End If
End If
End Sub

Private Sub mtbMascara_KeyPress(sender As Object, e As KeyPressEventArgs) Handles mtbMascara.KeyPress
If sTeclaPressionada.Length = 0 Then
sTeclaPressionada = [Ô]([Ô] & e.KeyChar.ToString
ElseIf sTeclaPressionada.Length = 2 Then
sTeclaPressionada = sTeclaPressionada & e.KeyChar.ToString & [Ô])[Ô]
ElseIf sTeclaPressionada.Length = 7 Then
If sTeclaPressionada.Substring(4, 1) <> [Ô]9[Ô] Then
sTeclaPressionada = sTeclaPressionada & e.KeyChar.ToString & [Ô]-[Ô]
End If
ElseIf sTeclaPressionada.Length = 8 Then
If sTeclaPressionada.Substring(4, 1) = [Ô]9[Ô] Then
sTeclaPressionada = sTeclaPressionada & e.KeyChar.ToString & [Ô]-[Ô]
End If
Else
sTeclaPressionada = sTeclaPressionada & e.KeyChar.ToString
End If
End Sub

Private Sub mtbMascara_Leave(sender As Object, e As EventArgs) Handles mtbMascara.Leave
sTeclaPressionada = String.Empty
End Sub

Private Sub mtbMascara_TextChanged(sender As Object, e As EventArgs) Handles mtbMascara.TextChanged
If bEstaMudando Then
Exit Sub
End If
[ô]Aqui escolhe a mascara de acordo com o caracter que define telefone celular.
[ô]Devem existir situações em que isso não funcione...mas a toque de caixa resolve o problema!
If Me.mtbMascara.Text.Substring(4, 1) = [Ô]9[Ô] Then
Me.mtbMascara.Mask = [Ô](99)99999-9999[Ô]
Else
If Me.mtbMascara.Mask.Length > 13 Then
Me.mtbMascara.Mask = [Ô](99)9999-9999[Ô]
End If
End If
If Not IsNothing(bds) Then
Me.bds.Filter = [Ô][Telefones] like [ô]%[Ô] & sTeclaPressionada.Trim & [Ô]%[ô][Ô]
End If
Me.lstListaOps.Visible = True
Me.Height = 21 + Me.lstListaOps.Height + 5
End Sub

Private Sub lstListaOps_Click(sender As Object, e As EventArgs) Handles lstListaOps.Click
bEstaMudando = True
Me.mtbMascara.Text = lstListaOps.Text
Me.cbbCombobox.Text = lstListaOps.Text
bEstaMudando = False
End Sub

Private Sub lstListaOps_DoubleClick(sender As Object, e As EventArgs) Handles lstListaOps.DoubleClick
bEstaMudando = True
Me.mtbMascara.Text = lstListaOps.Text
Me.cbbCombobox.Text = lstListaOps.Text
Me.bds.Filter = Nothing
Me.lstListaOps.Visible = False
Me.Height = 21
bEstaMudando = False
End Sub

Private Sub lstListaOps_KeyDown(sender As Object, e As KeyEventArgs) Handles lstListaOps.KeyDown
If e.KeyCode = Keys.Up Then
If Me.lstListaOps.SelectedIndex > 0 Then
bEstaMudando = True
iIndiceAtual = Me.lstListaOps.SelectedIndex - 1
Me.lstListaOps.SelectedIndex = iIndiceAtual
bEstaMudando = False
End If
ElseIf e.KeyCode = Keys.Down Then
If Me.lstListaOps.SelectedIndex < Me.lstListaOps.Items.Count - 1 Then
bEstaMudando = True
iIndiceAtual = Me.lstListaOps.SelectedIndex + 1
Me.lstListaOps.SelectedIndex = iIndiceAtual
bEstaMudando = False
End If
ElseIf e.KeyCode = Keys.Enter Then
bEstaMudando = True
Me.mtbMascara.Text = lstListaOps.Text
Me.cbbCombobox.Text = lstListaOps.Text
Me.bds.Filter = Nothing
Me.lstListaOps.Visible = False
Me.Height = 21
bEstaMudando = False
End If
bAlteraIndice = True
End Sub
End Class


é isso! Eu acho que ficou bom agora!

Att.
Giovani
Tópico encerrado , respostas não são mais permitidas