none
Oque fazer para essa rotina mudar um comportamento? RRS feed

  • 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

    terça-feira, 5 de junho de 2018 06:30

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 Sub

    Agora 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 Sub

    Pensei 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
    sexta-feira, 8 de junho de 2018 03:16

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
    sexta-feira, 8 de junho de 2018 01:22
  • 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 Sub

    Agora 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 Sub

    Pensei 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
    sexta-feira, 8 de junho de 2018 03:16
  • Ok, se minha solução te ajudou, por gentileza, marque como resposta.



    MARIANO1776



    • Editado Mariano1776 sexta-feira, 8 de junho de 2018 12:39
    sexta-feira, 8 de junho de 2018 11:38
  • 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

    sexta-feira, 8 de junho de 2018 12:38