Usuário com melhor resposta
Oque fazer para essa rotina mudar um comportamento?

Pergunta
-
Olá amigos do MSDN, estou aos poucos conseguindo fazer essa rotina rodar como eu preciso. Do jeito que ela está, o usuário entra com um nome em 1 dos 4 TextBox e ela não responde, mas ao usar novamente o mesmo TextBox, só então ela passa a funcionar o sistema de AutoComplete. O mesmo acontece com os 4 TextBox. Eu preciso que ela faça o AutoComplete desde quando se digita a primeira letra em qualquer um dos 4 TextBox. Alguém pode me dar uma força no que é preciso alterar para ela funcionar de forma mais correta como mencionei?
Se rodar, verás que que ela usa os nomes que vão sendo gravados no arquivo texto para o AutoComplete. É bem isso que eu estava tentando fazer. Faz quase um mês que vinha tentando, alguns amigos aqui do MSDN me deram uma força que serviu muito para dar um inicio até chegar a essa condição que ela funciona agora.
Imports System.IO
Imports System
Imports System.Text
Public Class Form1
Dim lista As New List(Of String)
Dim MySource As New AutoCompleteStringCollection()
Dim n As Integer = 0
Private Sub TextBox_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave, TextBox2.Leave, TextBox3.Leave, TextBox4.Leave
Dim Caminho As String = "C:\Usuarios\Home1\nomes_" & 4 & ".txt"
Dim nome = New TextBox() {TextBox1, TextBox2, TextBox3, TextBox4}
Dim nomes(100) As String
Dim i As Integer
For u = 0 To 3
If sender Is nome(u) Then
n = u
Exit For
End If
Next
'Grava na última linha do arquivo o nome escrito em nome().Text
Using sw As StreamWriter = File.AppendText(Caminho)
sw.WriteLine(nome(n).Text)
End Using
'Percorre o arquivo para montar a matriz nomes() e alimenta lista para o AutoComplete
Using sr As StreamReader = File.OpenText(Caminho)
Do While sr.Peek() >= 0
nomes(i) = sr.ReadLine
lista.Add(nomes(i))
i += 1
Loop
End Using
MySource.AddRange(lista.ToArray)
nome(n).AutoCompleteCustomSource = MySource
nome(n).AutoCompleteMode = AutoCompleteMode.Suggest
nome(n).AutoCompleteSource = AutoCompleteSource.CustomSource
End Sub
End Class
Respostas
-
Pô Mariano, assim também é demais né, valeu mesmo meu amigo, obrigado.
Só mudei aquele End If que você colocou por engano no lugar de End Sub, lá no inicio.
Eu já tinha feito dessa forma:(mas acredito que não está performática como o seu método)
Imports System.IO
Imports System
Imports System.Text
Public Class Form1
Dim lista As New List(Of String)
Dim MySource As New AutoCompleteStringCollection()
Dim n As Integer = 0
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Caminho As String = "C:\Usuarios\Home1\nomes_" & 4 & ".txt"
Dim nome = New TextBox() {TextBox1, TextBox2, TextBox3, TextBox4}
'Percorre o arquivo para montar a matriz nomes() e alimenta lista
Using sr As StreamReader = File.OpenText(Caminho)
Do While sr.Peek() >= 0
lista.Add(sr.ReadLine)
Loop
End Using
MySource.AddRange(lista.ToArray)
For u = 0 To 3
nome(u).AutoCompleteCustomSource = MySource
nome(u).AutoCompleteMode = AutoCompleteMode.Suggest
nome(u).AutoCompleteSource = AutoCompleteSource.CustomSource
Next
End Sub
Private Sub TextBox_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave, TextBox2.Leave, TextBox3.Leave, TextBox4.Leave
Dim Caminho As String = "C:\Usuarios\Home1\nomes_" & 4 & ".txt"
Dim nome = New TextBox() {TextBox1, TextBox2, TextBox3, TextBox4}
For u = 0 To 3
If sender Is nome(u) Then
n = u
Exit For
End If
Next
'Percorre o arquivo para conferir se nome(n) faz parte da lista
Using sr As StreamReader = File.OpenText(Caminho)
Do While sr.Peek() >= 0
If nome(n).Text = (sr.ReadLine) Then
GoTo salta
End If
Loop
End Using
'Grava na última linha do arquivo o nome escrito em nome(n).Text
Using sw As StreamWriter = File.AppendText(Caminho)
sw.WriteLine(nome(n).Text)
End Using
salta:
'Percorre o arquivo e alimenta a matriz lista
Using sr As StreamReader = File.OpenText(Caminho)
Do While sr.Peek() >= 0
lista.Add(sr.ReadLine)
Loop
End Using
MySource.AddRange(lista.ToArray)
For u = 0 To 3
nome(u).AutoCompleteCustomSource = MySource
nome(u).AutoCompleteMode = AutoCompleteMode.Suggest
nome(u).AutoCompleteSource = AutoCompleteSource.CustomSource
Next
End SubAgora estou me batendo para tentar montar uma rotinazinha que fará parte também dessa mesma e que deleta um nome da lista de nomes do arquivo texto. A minha ideia foi fazer uma rotina que usa um duplo click do mouse, seria isso:
Private Sub TextBox_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles TextBox1.MouseDoubleClick, TextBox2.MouseDoubleClick, TextBox3.MouseDoubleClick, TextBox4.MouseDoubleClick
Dim Caminho As String = "C:\Usuarios\Home1\nomes_" & 4 & ".txt"
Dim nome = New TextBox() {TextBox1, TextBox2, TextBox3, TextBox4}
For u = 0 To 3
If sender Is nome(u) Then
n = u
Exit For
End If
Next
'Percorre o arquivo até encontrar nome(n).Text
Using sr As StreamReader = File.OpenText(Caminho)
Do While sr.Peek() >= 0
If nome(n).Text = (sr.ReadLine) Then
MsgBox("Quer remover " & nome(n).Text & " ?")
nome(n).Text = " "
sr.ReadLine.Remove(0, (nome(n).Text).Length)
End If
Loop
End SubPensei nisso porque se houverem nomes escritos errados na lista, o usuário teria que acessar o arquivo texto e deleta-los, assim o usuário deletaria via código. Mas ela ainda não está funcionando, pensei que seria fácil, mas estou chegando a conclusão que não é com 2 comandinhos que se pode fazer isso.
Grato
- Marcado como Resposta Durval Teixeira sexta-feira, 8 de junho de 2018 03:17
Todas as Respostas
-
Boa noite.
Tente assim.
Está testado.
Imports System.Collections.Generic Imports System.IO Public Class form1 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Carrega_lista() End If Private Sub Carrega_lista() Dim lista As New List(Of String) Dim MySource As New AutoCompleteStringCollection() Dim Caminho As String = "C:\Users\Mariano\Desktop\Novo Documento de Texto.txt" Dim n As Integer Using sr As StreamReader = File.OpenText(Caminho) 'Percorre o arquivo para carregar a lista para o AutoComplete Do While sr.Peek() >= 0 lista.Add(sr.ReadLine) Loop End Using MySource.AddRange(lista.ToArray) Dim nome As TextBox() = New TextBox() {TextBox1, TextBox2, TextBox3, TextBox4} For n = 0 To 3 nome(n).AutoCompleteCustomSource = MySource nome(n).AutoCompleteMode = AutoCompleteMode.Suggest nome(n).AutoCompleteSource = AutoCompleteSource.CustomSource Next End Sub Private Sub Atualiza_lista(nome As TextBox) Dim Caminho As String = "C:\Users\Mariano\Desktop\Novo Documento de Texto.txt" Dim lista As New List(Of String) Using sr As StreamReader = File.OpenText(Caminho) Do While sr.Peek() >= 0 lista.Add(sr.ReadLine) Loop End Using 'carrego a lista atual If lista.IndexOf(nome.Text) = -1 Then 'verifico se a palavra já não está na lista. Using sw As StreamWriter = File.AppendText(Caminho) sw.WriteLine(nome.Text) 'se não estiver, acrescento na lista End Using End If End Sub Private Sub TextBox_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave, TextBox2.Leave, TextBox3.Leave, TextBox4.Leave Atualiza_lista(CType(sender, TextBox)) Carrega_lista() End Sub End Class
MARIANO1776
- Sugerido como Resposta João Paulo [] sexta-feira, 8 de junho de 2018 01:30
-
Pô Mariano, assim também é demais né, valeu mesmo meu amigo, obrigado.
Só mudei aquele End If que você colocou por engano no lugar de End Sub, lá no inicio.
Eu já tinha feito dessa forma:(mas acredito que não está performática como o seu método)
Imports System.IO
Imports System
Imports System.Text
Public Class Form1
Dim lista As New List(Of String)
Dim MySource As New AutoCompleteStringCollection()
Dim n As Integer = 0
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Caminho As String = "C:\Usuarios\Home1\nomes_" & 4 & ".txt"
Dim nome = New TextBox() {TextBox1, TextBox2, TextBox3, TextBox4}
'Percorre o arquivo para montar a matriz nomes() e alimenta lista
Using sr As StreamReader = File.OpenText(Caminho)
Do While sr.Peek() >= 0
lista.Add(sr.ReadLine)
Loop
End Using
MySource.AddRange(lista.ToArray)
For u = 0 To 3
nome(u).AutoCompleteCustomSource = MySource
nome(u).AutoCompleteMode = AutoCompleteMode.Suggest
nome(u).AutoCompleteSource = AutoCompleteSource.CustomSource
Next
End Sub
Private Sub TextBox_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave, TextBox2.Leave, TextBox3.Leave, TextBox4.Leave
Dim Caminho As String = "C:\Usuarios\Home1\nomes_" & 4 & ".txt"
Dim nome = New TextBox() {TextBox1, TextBox2, TextBox3, TextBox4}
For u = 0 To 3
If sender Is nome(u) Then
n = u
Exit For
End If
Next
'Percorre o arquivo para conferir se nome(n) faz parte da lista
Using sr As StreamReader = File.OpenText(Caminho)
Do While sr.Peek() >= 0
If nome(n).Text = (sr.ReadLine) Then
GoTo salta
End If
Loop
End Using
'Grava na última linha do arquivo o nome escrito em nome(n).Text
Using sw As StreamWriter = File.AppendText(Caminho)
sw.WriteLine(nome(n).Text)
End Using
salta:
'Percorre o arquivo e alimenta a matriz lista
Using sr As StreamReader = File.OpenText(Caminho)
Do While sr.Peek() >= 0
lista.Add(sr.ReadLine)
Loop
End Using
MySource.AddRange(lista.ToArray)
For u = 0 To 3
nome(u).AutoCompleteCustomSource = MySource
nome(u).AutoCompleteMode = AutoCompleteMode.Suggest
nome(u).AutoCompleteSource = AutoCompleteSource.CustomSource
Next
End SubAgora estou me batendo para tentar montar uma rotinazinha que fará parte também dessa mesma e que deleta um nome da lista de nomes do arquivo texto. A minha ideia foi fazer uma rotina que usa um duplo click do mouse, seria isso:
Private Sub TextBox_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles TextBox1.MouseDoubleClick, TextBox2.MouseDoubleClick, TextBox3.MouseDoubleClick, TextBox4.MouseDoubleClick
Dim Caminho As String = "C:\Usuarios\Home1\nomes_" & 4 & ".txt"
Dim nome = New TextBox() {TextBox1, TextBox2, TextBox3, TextBox4}
For u = 0 To 3
If sender Is nome(u) Then
n = u
Exit For
End If
Next
'Percorre o arquivo até encontrar nome(n).Text
Using sr As StreamReader = File.OpenText(Caminho)
Do While sr.Peek() >= 0
If nome(n).Text = (sr.ReadLine) Then
MsgBox("Quer remover " & nome(n).Text & " ?")
nome(n).Text = " "
sr.ReadLine.Remove(0, (nome(n).Text).Length)
End If
Loop
End SubPensei nisso porque se houverem nomes escritos errados na lista, o usuário teria que acessar o arquivo texto e deleta-los, assim o usuário deletaria via código. Mas ela ainda não está funcionando, pensei que seria fácil, mas estou chegando a conclusão que não é com 2 comandinhos que se pode fazer isso.
Grato
- Marcado como Resposta Durval Teixeira sexta-feira, 8 de junho de 2018 03:17
-
Ok, se minha solução te ajudou, por gentileza, marque como resposta.
MARIANO1776
- Editado Mariano1776 sexta-feira, 8 de junho de 2018 12:39
-
Segue com remoção de itens da listagem.
Private Sub TextBox1_MouseDoubleClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDoubleClick, TextBox2.MouseDoubleClick, TextBox3.MouseDoubleClick, TextBox4.MouseDoubleClick Remove_lista(CType(sender, TextBox)) End Sub Private Sub Remove_lista(nome As TextBox) Dim J As Int32 Dim Caminho As String = "C:\Users\Mariano\Desktop\Novo Documento de Texto.txt" Dim lista As New List(Of String) Try Using sr As StreamReader = File.OpenText(Caminho) Do While sr.Peek() >= 0 lista.Add(sr.ReadLine) Loop End Using 'carrego a lista atual lista.Remove(nome.Text) nome.Text = "" File.AppendAllText(Caminho & ".tmp", "") 'crio arquivo temporário For J = 0 To lista.Count - 1 Using sw As StreamWriter = File.AppendText(Caminho & ".tmp") sw.WriteLine(lista.Item(J)) 'acrescento na lista temporária End Using Next File.Delete(Caminho) 'deleto a listagewm anterior File.Move(Caminho & ".tmp", Caminho) Carrega_lista() Catch ex As Exception MsgBox("Erro ao deletar item da listagem.") End Try End Sub
MARIANO1776