Joana Rodrigues Posted January 18, 2016 at 10:16 PM Report Share #592154 Posted January 18, 2016 at 10:16 PM Olá, estou a fazer um projecto para a escola de um listagem de contactos e o professor pediu para haver uma listbox e uma datagridview e em ambas aparecer a listagem. Neste programa já fiz a ListBox mas falta aparecer também na datagridview...agluém me ajuda? O professor falou num ficheiro temporário ou algo assim... Imports System.IO Imports System Public Class Form1 'Declaração das variáveis globais Structure Pessoa Dim Nome As String Dim Morada As String Dim CP As String Dim Localidade As String Dim Telemovel As Long Dim Email As String End Structure Dim contactos As Pessoa Dim caminho As String = "D:\Meus_contactos.txt" Dim caminhotmp As String = "D:\Meus_contactos.tmp" Dim mensagem, titulo, botoes, icone Dim resposta As DialogResult Public Sub GuardarDados() If LstNomes.SelectedIndex <> -1 Then Dim FSFicheiro As New FileStream(caminho, FileMode.OpenOrCreate, FileAccess.Read) Dim SRContactos As New StreamReader(FSFicheiro) Dim FSFicheiroTmp As New FileStream(caminhotmp, FileMode.CreateNew, FileAccess.Write) Dim SWContactosTmp As New StreamWriter(FSFicheiroTmp) Dim Registo As String Dim ctd As Integer Do Until SRContactos.Peek = -1 'ou .EndOfStream Registo = SRContactos.ReadLine If ctd = LstNomes.SelectedIndex Then With contactos .Nome = TxtNome.Text .Morada = TxtMorada.Text .CP = TxtCPostal.Text .Localidade = TxtLocalidade.Text .Telemovel = CLng(TxtTelemovel.Text) .Email = TxtEmail.Text End With SWContactosTmp.WriteLine(contactos.Nome & "|" _ & contactos.Morada & "|" _ & contactos.CP & "|" _ & contactos.Localidade & "|" _ & contactos.Telemovel & "|" _ & contactos.Email) Else SWContactosTmp.WriteLine(Registo) End If ctd += 1 Loop SWContactosTmp.Close() SRContactos.Close() With My.Computer.FileSystem .DeleteFile(caminho) .RenameFile("D:\Meus_contactos.tmp", "Meus_contactos.txt") End With Else Dim FSFicheiro As New FileStream(caminho, FileMode.Append, FileAccess.Write) Dim SWContactos As New StreamWriter(FSFicheiro) With contactos .Nome = TxtNome.Text .Morada = TxtMorada.Text .CP = TxtCPostal.Text .Localidade = TxtLocalidade.Text .Telemovel = CLng(TxtTelemovel.Text) .Email = TxtEmail.Text End With SWContactos.WriteLine(contactos.Nome & "|" _ & contactos.Morada & "|" _ & contactos.CP & "|" _ & contactos.Localidade & "|" _ & contactos.Telemovel & "|" _ & contactos.Email) SWContactos.Close() End If End Sub Public Sub Procurar(ByVal criterio As String) Dim texto As String = "" Dim TextoMensagem As String = "" Dim resultado As Boolean Select Case criterio Case "nome" : TextoMensagem = "Escreva o nome a procurar" Case "telemovel" : TextoMensagem = "Escreva o número de telemóvel a procurar" Case "email" : TextoMensagem = "Escreva o endereço de email a procurar" End Select texto = InputBox(TextoMensagem) resultado = ProcurarRegisto(texto, criterio) If resultado = True Then TxtNome.Text = contactos.Nome TxtMorada.Text = contactos.Morada TxtCPostal.Text = contactos.CP TxtLocalidade.Text = contactos.Localidade TxtTelemovel.Text = contactos.Telemovel TxtEmail.Text = contactos.Email Else Limpar() mensagem = "O registo não foi encontrado" titulo = "Agenda Pessoal" botoes = MessageBoxButtons.OK icone = MessageBoxIcon.Information MessageBox.Show(mensagem, titulo, botoes, icone) End If End Sub Function ProcurarRegisto(ByVal criterio As String, ByVal campo As String) As Boolean Dim FSFicheiro As New FileStream(caminho, FileMode.Open, FileAccess.Read) Dim SRContactos As New StreamReader(FSFicheiro) Dim Registo As String Dim P1, P2, P3, P4, P5 As Integer Do Until SRContactos.Peek = -1 Registo = SRContactos.ReadLine P1 = Registo.IndexOf("|") + 1 P2 = Registo.IndexOf("|", P1) + 1 P3 = Registo.IndexOf("|", P2) + 1 P4 = Registo.IndexOf("|", P3) + 1 P5 = Registo.IndexOf("|", P4) + 1 With contactos .Nome = Registo.Substring(0, P1 - 1) .Morada = Registo.Substring(P1, P2 - P1 - 1) .CP = Registo.Substring(P2, P3 - P2 - 1) .Localidade = Registo.Substring(P3, P4 - P3 - 1) .Telemovel = Registo.Substring(P4, P5 - P4 - 1) .Email = Registo.Substring(P5) End With Select Case campo Case "nome" If criterio = contactos.Nome Then ProcurarRegisto = True Exit Do End If Case "telemovel" If criterio = contactos.Telemovel Then ProcurarRegisto = True Exit Do End If Case "email" If criterio = contactos.Email Then ProcurarRegisto = True Exit Do End If End Select Loop SRContactos.Close() Return (ProcurarRegisto) End Function Public Sub LerRegistos() Try Dim FSFicheiro As New FileStream(caminho, FileMode.Open, FileAccess.Read) Dim SRContactos As New StreamReader(FSFicheiro) Dim LerRegisto As String Dim P1, P2, P3, P4, P5 As Integer LstNomes.Items.Clear() Do Until SRContactos.Peek = -1 LerRegisto = SRContactos.ReadLine P1 = LerRegisto.IndexOf("|") + 1 P2 = LerRegisto.IndexOf("|", P1) + 1 P3 = LerRegisto.IndexOf("|", P2) + 1 P4 = LerRegisto.IndexOf("|", P3) + 1 P5 = LerRegisto.IndexOf("|", P4) + 1 With contactos .Nome = LerRegisto.Substring(0, P1 - 1) .Morada = LerRegisto.Substring(P1, P2 - P1 - 1) .CP = LerRegisto.Substring(P2, P3 - P2 - 1) .Localidade = LerRegisto.Substring(P3, P4 - P3 - 1) .Telemovel = LerRegisto.Substring(P4, P5 - P4 - 1) .Email = LerRegisto.Substring(P5) End With LstNomes.Items.Add(contactos.Nome) Loop SRContactos.Close() Catch ex As System.IO.FileNotFoundException mensagem = "O ficheiro Meus_Contactos.txt não foi encontrado," _ & vbNewLine & "deseja criar um novo ficheiro" titulo = "Agenda Pessoal" botoes = MessageBoxButtons.YesNo icone = MessageBoxIcon.Question resposta = MessageBox.Show(mensagem, titulo, botoes, icone) If resposta = Windows.Forms.DialogResult.Yes Then Dim FSNovoFicheiro As New FileStream(caminho, FileMode.CreateNew) FSNovoFicheiro.Close() Else Me.Close() End If End Try End Sub Public Sub Limpar() TxtNome.ResetText() TxtMorada.ResetText() TxtCPostal.ResetText() TxtLocalidade.ResetText() TxtMorada.ResetText() TxtTelemovel.ResetText() TxtEmail.ResetText() TxtNome.Focus() LstNomes.SelectedIndex = -1 End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load LerRegistos() End Sub Private Sub NmuFichiroNovo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NmuFichiroNovo.Click titulo = "Agenda Pessoal" If TxtNome.Text <> Nothing And TxtTelemovel.Text <> Nothing And TxtEmail.Text <> Nothing Then mensagem = "Deseja Guardar os registos atuais?" botoes = MessageBoxButtons.YesNo icone = MessageBoxIcon.Question resposta = MessageBox.Show(mensagem, titulo, botoes, icone) If resposta = Windows.Forms.DialogResult.Yes Then GuardarDados() End If End If LerRegistos() Limpar() End Sub Private Sub MnuFicheiroGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuFicheiroGuardar.Click If TxtNome.Text <> Nothing And TxtTelemovel.Text <> Nothing And TxtEmail.Text <> Nothing Then GuardarDados() LerRegistos() Limpar() Else mensagem = "Registo incompleto" & vbNewLine & "Os campos Nome, Telemóvel e Email são de " & vbNewLine & "preencimento obrigatório" titulo = "Agenda Pessoal" botoes = MessageBoxButtons.OK icone = MessageBoxIcon.Error MessageBox.Show(mensagem, titulo, botoes, icone) End If End Sub Private Sub MnuFicheiroCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuFicheiroCancelar.Click Limpar() End Sub Private Sub MnuFicheiroEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuFicheiroEliminar.Click titulo = "Agenda Pessoal" If LstNomes.SelectedIndex <> -1 Then mensagem = "Deseja eliminar o registo atual" botoes = MessageBoxButtons.YesNo icone = MessageBoxIcon.Question resposta = MessageBox.Show(mensagem, titulo, botoes, icone) If resposta = Windows.Forms.DialogResult.Yes Then Dim FSFicheiro As New FileStream(caminho, FileMode.Open, FileAccess.Read) Dim FSFicheiroTmp As New FileStream(caminhotmp, FileMode.CreateNew, FileAccess.Write) Dim SRContactos As New StreamReader(FSFicheiro) Dim SWContactosTmp As New StreamWriter(FSFicheiroTmp) Dim Registo As String Dim ctd As Integer Do Until SRContactos.Peek = -1 Registo = SRContactos.ReadLine If ctd <> LstNomes.SelectedIndex Then SWContactosTmp.WriteLine(Registo) End If ctd += 1 Loop SWContactosTmp.Close() SRContactos.Close() With My.Computer.FileSystem .DeleteFile(caminho) .RenameFile("D:\Meus_contactos.tmp", "Meus_contactos.txt") End With End If Else mensagem = "O registo a eliminar não foi seleccionado" botoes = MessageBoxButtons.OK icone = MessageBoxIcon.Error MessageBox.Show(mensagem, titulo, botoes, icone) End If LerRegistos() Limpar() End Sub Private Sub MnuSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuSair.Click mensagem = "Deseja sair da aplicação" titulo = "Agenda Pessoal" botoes = MessageBoxButtons.YesNo icone = MessageBoxIcon.Question resposta = MessageBox.Show(mensagem, titulo, botoes, icone) If resposta = Windows.Forms.DialogResult.Yes Then End 'Encerra a aplicação End If End Sub Private Sub LstNomes_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LstNomes.SelectedIndexChanged Dim FSFicheiro As New FileStream(caminho, FileMode.Open, FileAccess.Read) Dim SRContactos As New StreamReader(FSFicheiro) Dim LerRegisto As String Dim P1, P2, P3, P4, P5 As Integer For ctd = 0 To LstNomes.SelectedIndex LerRegisto = SRContactos.ReadLine If ctd = LstNomes.SelectedIndex Then P1 = LerRegisto.IndexOf("|") + 1 P2 = LerRegisto.IndexOf("|", P1) + 1 P3 = LerRegisto.IndexOf("|", P2) + 1 P4 = LerRegisto.IndexOf("|", P3) + 1 P5 = LerRegisto.IndexOf("|", P4) + 1 With contactos .Nome = LerRegisto.Substring(0, P1 - 1) .Morada = LerRegisto.Substring(P1, P2 - P1 - 1) .CP = LerRegisto.Substring(P2, P3 - P2 - 1) .Localidade = LerRegisto.Substring(P3, P4 - P3 - 1) .Telemovel = LerRegisto.Substring(P4, P5 - P4 - 1) .Email = LerRegisto.Substring(P5) End With TxtNome.Text = contactos.Nome TxtMorada.Text = contactos.Morada TxtCPostal.Text = contactos.CP TxtLocalidade.Text = contactos.Localidade TxtTelemovel.Text = contactos.Telemovel TxtEmail.Text = contactos.Email SRContactos.Close() End If Next End Sub Private Sub MnuProcurarNome_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuProcuarNome.Click Procurar("nome") End Sub Private Sub MnuProcurarTelemovel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuProcurarTelemovel.Click Procurar("telemovel") End Sub Private Sub MnuProcurarEmail_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuProcurarEmail.Click Procurar("email") End Sub End Class Link to comment Share on other sites More sharing options...
ribeiro55 Posted January 23, 2016 at 01:25 AM Report Share #592378 Posted January 23, 2016 at 01:25 AM Posso não estar a entender o exercício em pleno, mas ficheiro temporário para que? Qual é o momento em que faz mais sentido espelhares a informação para os dois controlos (listbox e datagrid) ? Não será no momento em que lês os dados do ficheiro, uma única vez? Qual o intuito do "ficheiro temporário" ? Ou seja, no teu Sub LerRegistos, perto de onde tens LstNomes.Items.Add(contactos.Nome), deverás também preparar uma estrutura de dados para dar à datagrid como DataSource. Deixo-te um exemplo completo, que assume que tens uma form com uma datagridview: Public Class Form1 Public Structure Gajo Public Property Nome As String Public Property Idade As Integer Sub New(Nome As String, Idade As Integer) Me.Nome = Nome Me.Idade = Idade End Sub End Structure Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'algures antes do teu loop Dim zub As New List(Of Gajo) 'dentro do teu loop, vais adicionando a tua estrutura zub.Add(New Gajo("lol", 20)) zub.Add(New Gajo("lel", 21)) zub.Add(New Gajo("lul", 22)) 'algures depois do teu loop, alimentas a datagrid DataGridView1.DataSource = zub 'e indicas quais as propriedades a mapear com as tuas colunas DataGridView1.Columns(0).DataPropertyName = "Nome" DataGridView1.Columns(1).DataPropertyName = "Idade" End Sub End Class A chave aqui é usar Property na Structure/Class, para que se possa mapear. O resto do trabalho, é a própria DataGrid que faz. E ficas com os nomes na ListBox, e o resto da informação toda na DataGrid. Fala melhor com o teu professor, porque o ficheiro temporário deve ser uma dica para qualquer outro rumo que ele queira dar ao exercício. Já agora, uma vez que parece que estás a organizar a tua informação no ficheiro por "pipes" ( | ), aconselho-te a espreitares o método Split Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips" Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now