Jump to content

Como passar Listagem da ListBox para DataGrid com ficheiro temporário?


Joana Rodrigues

Recommended Posts

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.