Ir para o conteúdo
Joel Torres

[Resolvido] Repetição de registos quando clico no botão "Pré-Visualizar"

Mensagens Recomendadas

Joel Torres

Boa noite,

Quando clico no botão "Pré-Visualizar" aparece-me registos repetidos.

23usv1w.jpg

Já tentei resolver o problema mas continua na mesma.

Agradeço quem me ajudar.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Virneto

Olha aqui uma ilustração do que te sugeriu o @acao [brincadeira] :cheesygrin:

ou por outras palavras...

optimiza a tua query...

SELECT DISTINCT nome,morada,telefone,telemovel FROM contactos WHERE nome="Gabriela Santos";

have fun!


"Que inquieto desejo vos tortura, Seres elementares, força obscura? Em volta de que ideia gravitais?" >> Anthero de Quental

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Linuxando.com | ...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Joel Torres

Penso que o erro esteja no código do botão "Pré-Visualizar".

Estou a utilizar o VB 2010.

Editado por Joel94

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Joel Torres

O código do botão "Pré-Visualizar" é o seguinte, mas agora só me dá erro nas linhas de código onde tem o "Telefone" e o "Telemóvel".

Private Sub PreVisualizaListagemContatos()

RegistoAtual = 0
PaginaAtual = 1

Dim Impressao As Printing.PrintDocument = New Printing.PrintDocument()
AddHandler Impressao.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.pdListagemContatos_PrintPage)
Impressao.DefaultPageSettings.Landscape = False
Dim printPreviewDialog1 As New PrintPreviewDialog
Try
CType(printPreviewDialog1.Controls(1), ToolStrip).Items(0).Visible = False
With printPreviewDialog1
.Document = Impressao
.Text = "Listagem de Contatos"
.WindowState = FormWindowState.Maximized
.PrintPreviewControl.Zoom = 1
.FormBorderStyle = FormBorderStyle.Fixed3D
.ShowDialog()
End With
Catch exp As Exception
MsgBox(exp.Message.ToString, MsgBoxStyle.Critical, "Erro na visualização da impressão")
End Try
End Sub

Private Sub pdListagemContatos_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles pdListagemContatos.PrintPage

Dim LinhasPagina As Single = 0
Dim PosicaoLinha As Single = 0
Dim LinhaAtual As Integer = 0
Dim MargemEsquerda As Single = e.MarginBounds.Left - 20
Dim MargemSuperior As Single = e.MarginBounds.Top + 100
Dim MargemDireita As Single = e.MarginBounds.Right + 40
Dim MargemInferior As Single = e.MarginBounds.Bottom
Dim CanetaImpressora As New Pen(Color.Black, 1)
Dim FonteNegrito As New Font("Arial", 9, FontStyle.Bold)
Dim FonteTitulo As New Font("Arial", 16, FontStyle.Bold)
Dim FonteSubtitulo As New Font("Arial", 12, FontStyle.Bold)
Dim FonteRodape As New Font("Arial", 7)
Dim FonteNormal As New Font("Arial", 8)

e.Graphics.DrawString("GestContato" & ListagemContatos, FonteTitulo, Brushes.Black, MargemEsquerda + 275, 70, New StringFormat())
e.Graphics.DrawString("Listagem de Contatos" & ListagemContatos, FonteSubtitulo, Brushes.Black, MargemEsquerda + 255, 110, New StringFormat())

e.Graphics.DrawLine(CanetaImpressora, MargemEsquerda, 165, MargemDireita, 165)

e.Graphics.DrawString("Nome", FonteNegrito, Brushes.Black, MargemEsquerda + 0, 170, New StringFormat())
e.Graphics.DrawString("Morada", FonteNegrito, Brushes.Black, MargemEsquerda + 220, 170,
e.Graphics.DrawString("Telefone", FonteNegrito, Brushes.Black, MargemEsquerda + 450, 170, New StringFormat())
e.Graphics.DrawString("Telemóvel", FonteNegrito, Brushes.Black, MargemEsquerda + 550, 170, New StringFormat())

e.Graphics.DrawLine(CanetaImpressora, MargemEsquerda, 190, MargemDireita, 190)
LinhasPagina = CInt(e.MarginBounds.Height / FonteNormal.GetHeight(e.Graphics) - 9)
 

Dim AlinharDireita As New StringFormat
AlinharDireita.FormatFlags = StringFormatFlags.DirectionRightToLeft

While (LinhaAtual < LinhasPagina And RegistoAtual < dgvContatos.Rows.Count.ToString)
PosicaoLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(1).Value, FonteNormal, Brushes.Black, MargemEsquerda + 0, PosicaoLinha, New StringFormat())
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(2).Value, FonteNormal, Brushes.Black, MargemEsquerda + 220, PosicaoLinha, New StringFormat())
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(3).Value, FonteNormal, Brushes.Black, MargemEsquerda + 450, PosicaoLinha, AlinharDireita) 'Aqui dá erro
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(4).Value, FonteNormal, Brushes.Black, MargemEsquerda + 550, PosicaoLinha, AlinharDireita) 'Aqui dá erro

LinhaAtual += 1
RegistoAtual += 1
End While

e.Graphics.DrawLine(CanetaImpressora, MargemEsquerda, MargemInferior, MargemDireita, MargemInferior)
e.Graphics.DrawString(DateAndTime.Now.ToShortDateString, FonteRodape, Brushes.Black, MargemEsquerda, MargemInferior, New StringFormat())
LinhaAtual += 1
e.Graphics.DrawString("Página: " & PaginaAtual, FonteRodape, Brushes.Black, MargemDireita - 50, MargemInferior, New StringFormat())

PaginaAtual += 1

If (LinhaAtual > LinhasPagina) Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If
End Sub

A mensagem de erro que me aparece é a seguinte:

2vjt083.jpg

Editado por apocsantos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
He B TeMy

O código do botão "Pré-Visualizar" é o seguinte, mas agora só me dá erro nas linhas de código onde tem o "Telefone" e o "Telemóvel".

Private Sub PreVisualizaListagemContatos()

RegistoAtual = 0
PaginaAtual = 1

Dim Impressao As Printing.PrintDocument = New Printing.PrintDocument()
AddHandler Impressao.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.pdListagemContatos_PrintPage)
Impressao.DefaultPageSettings.Landscape = False
Dim printPreviewDialog1 As New PrintPreviewDialog
Try
CType(printPreviewDialog1.Controls(1), ToolStrip).Items(0).Visible = False
With printPreviewDialog1
.Document = Impressao
.Text = "Listagem de Contatos"
.WindowState = FormWindowState.Maximized
.PrintPreviewControl.Zoom = 1
.FormBorderStyle = FormBorderStyle.Fixed3D
.ShowDialog()
End With
Catch exp As Exception
MsgBox(exp.Message.ToString, MsgBoxStyle.Critical, "Erro na visualização da impressão")
End Try
End Sub

Private Sub pdListagemContatos_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles pdListagemContatos.PrintPage

Dim LinhasPagina As Single = 0
Dim PosicaoLinha As Single = 0
Dim LinhaAtual As Integer = 0
Dim MargemEsquerda As Single = e.MarginBounds.Left - 20
Dim MargemSuperior As Single = e.MarginBounds.Top + 100
Dim MargemDireita As Single = e.MarginBounds.Right + 40
Dim MargemInferior As Single = e.MarginBounds.Bottom
Dim CanetaImpressora As New Pen(Color.Black, 1)
Dim FonteNegrito As New Font("Arial", 9, FontStyle.Bold)
Dim FonteTitulo As New Font("Arial", 16, FontStyle.Bold)
Dim FonteSubtitulo As New Font("Arial", 12, FontStyle.Bold)
Dim FonteRodape As New Font("Arial", 7)
Dim FonteNormal As New Font("Arial", 8)

e.Graphics.DrawString("GestContato" & ListagemContatos, FonteTitulo, Brushes.Black, MargemEsquerda + 275, 70, New StringFormat())
e.Graphics.DrawString("Listagem de Contatos" & ListagemContatos, FonteSubtitulo, Brushes.Black, MargemEsquerda + 255, 110, New StringFormat())

e.Graphics.DrawLine(CanetaImpressora, MargemEsquerda, 165, MargemDireita, 165)

e.Graphics.DrawString("Nome", FonteNegrito, Brushes.Black, MargemEsquerda + 0, 170, New StringFormat())
e.Graphics.DrawString("Morada", FonteNegrito, Brushes.Black, MargemEsquerda + 220, 170,
e.Graphics.DrawString("Telefone", FonteNegrito, Brushes.Black, MargemEsquerda + 450, 170, New StringFormat())
e.Graphics.DrawString("Telemóvel", FonteNegrito, Brushes.Black, MargemEsquerda + 550, 170, New StringFormat())

e.Graphics.DrawLine(CanetaImpressora, MargemEsquerda, 190, MargemDireita, 190)
LinhasPagina = CInt(e.MarginBounds.Height / FonteNormal.GetHeight(e.Graphics) - 9)
 

Dim AlinharDireita As New StringFormat
AlinharDireita.FormatFlags = StringFormatFlags.DirectionRightToLeft

While (LinhaAtual < LinhasPagina And RegistoAtual < dgvContatos.Rows.Count.ToString)
PosicaoLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(1).Value, FonteNormal, Brushes.Black, MargemEsquerda + 0, PosicaoLinha, New StringFormat())
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(2).Value, FonteNormal, Brushes.Black, MargemEsquerda + 220, PosicaoLinha, New StringFormat())
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(3).Value, FonteNormal, Brushes.Black, MargemEsquerda + 450, PosicaoLinha, AlinharDireita) 'Aqui dá erro
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(4).Value, FonteNormal, Brushes.Black, MargemEsquerda + 550, PosicaoLinha, AlinharDireita) 'Aqui dá erro

LinhaAtual += 1
RegistoAtual += 1
End While

e.Graphics.DrawLine(CanetaImpressora, MargemEsquerda, MargemInferior, MargemDireita, MargemInferior)
e.Graphics.DrawString(DateAndTime.Now.ToShortDateString, FonteRodape, Brushes.Black, MargemEsquerda, MargemInferior, New StringFormat())
LinhaAtual += 1
e.Graphics.DrawString("Página: " & PaginaAtual, FonteRodape, Brushes.Black, MargemDireita - 50, MargemInferior, New StringFormat())

PaginaAtual += 1

If (LinhaAtual > LinhasPagina) Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If
End Sub

A mensagem de erro que me aparece é a seguinte:

2vjt083.jpg

O erro é bastante explanatório não é? Tás a tentar converter para string um campo que vem "null" da base de dados... isso não é permitido...7

Faz um if statement a verficar se o campo é dbnull, e continua apartir daí.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
He B TeMy

If Not IsDBNull(dr("Campo_db")) Then  Dim Campo_db As String = dr("Campo_db")
End If

Não sei que tipo de base de dados é... o "dr" neste exemplo era o Sql data reader.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
He B TeMy

Ora bem... supostamente antes de tentares converter?

Verificas se é nulo, se não for, continuas, se for, não continuas...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
He B TeMy

Tu tens este código certo... ?

Dim MargemEsquerda As Single = e.MarginBounds.Left - 20

Que dá o erro, eu nunca utilizei esse método para obter da base de dados... nem tão pouco estou familiarizado.

Mas suponho que isto:

(RegistoAtual).Cells(3).Value

Seja o valor do que estás a tentar converter para string, logo, verificas se o valor é nulo, se não for é que executas ESSE código.

Edit: Se não perceberes ainda, aconselho-te a procurares no google exemplos.

https://www.google.pt/search?num=20&q=a+convers%C3%A3o+do+tipo+dbnull+n%C3%A3o+pode+ser+convertido+para+string&oq=a+convers%C3%A3o+do+tipo+dbnull+n%C3%A3o+pode+ser+convertido+para+string&gs_l=serp.3...22357.25523.0.25717.23.22.0.0.0.6.163.2087.16j6.22.0....0...1c.1.31.serp..15.8.718.4-M4QVcNiG0

Editado por He B Te My

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Joel Torres

Verificou o meu código completo?

Agradecia mesmo a ajuda porque só por causa destas duas linhas de código é que o botão de "Pré-Visualizar não funciona" :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
He B TeMy

Verificou o meu código completo?

Agradecia mesmo a ajuda porque só por causa destas duas linhas de código é que o botão de "Pré-Visualizar não funciona" :)

Eu não vou fazer o teu trabalho... ainda para mais ler umas 500 linhas de código só para tentar ver onde é que vais buscar mesmo os dados para depois converteres para string. Se só dá em dois, vê o que fazes diferente, o que estás a converter, e faz o que te disse em cima...

Só tens de verificar se o campo é nulo antes de tentares converter. mais nada, e depois decidires o que queres fazer, se não mostrar nada, ou mostrar outra informação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

Boa tarde,

Creio que o erro esteja neste pedaço:

Dim AlinharDireita As New StringFormat
	 AlinharDireita.FormatFlags = StringFormatFlags.DirectionRightToLeft
	 While (LinhaAtual < LinhasPagina And RegistoAtual < dgvContatos.Rows.Count.ToString) ' Count.ToString ???? pera, mas convertes um inteiro em string e lá em baixo somas ?
			'While (LinhaAtual < LinhasPagina And RegistoAtual < dgvContatos.Rows.Count())
			 PosicaoLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
			 e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(1).Value, FonteNormal, Brushes.Black, MargemEsquerda + 0, PosicaoLinha, New StringFormat())
			 e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(2).Value, FonteNormal, Brushes.Black, MargemEsquerda + 220, PosicaoLinha, New StringFormat())
			 e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(3).Value, FonteNormal, Brushes.Black, MargemEsquerda + 450, PosicaoLinha )
			 e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(4).Value, FonteNormal, Brushes.Black, MargemEsquerda + 550, PosicaoLinha)
			 LinhaAtual += 1 ' estás a somar o valor 1 a uma string ???
			 RegistoAtual += 1
	 End While

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

assinatura.jpg

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Joel Torres

Tentei modificar as duas linhas e deu o mesmo erro inicial.

Preciso mesmo de ajuda. Agradecia para resolver este erro visto que não percebo muito de VB.

Editado por Joel Torres

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
vikcch

experimenta converter para string numa função

 Private Function ConverterParaString(ByVal campo As Object) As String

 If campo Is DBNull.Value Then
	 ConverterParaString = "Vazio"
 Else
	 ConverterParaString = campo.ToString
 End If

End Function

e.Graphics.DrawString(ConverterParaString(dgvContatos.Rows(RegistoAtual).Cells(3).Value), FonteNormal, Brushes.Black, MargemEsquerda + 450, PosicaoLinha, AlinharDireita) 'Aqui dá erro

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Joel Torres

Funciona a 100%.

Muito obrigado pela ajuda. :)

Visto que o problema está resolvido, é com enorme agrado que encerro este tópico. :)

Editado por Joel Torres

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
He B TeMy

experimenta converter para string numa função

 Private Function ConverterParaString(ByVal campo As Object) As String

 If campo Is DBNull.Value Then
	 ConverterParaString = "Vazio"
 Else
	 ConverterParaString = campo.ToString
 End If

End Function

e.Graphics.DrawString(ConverterParaString(dgvContatos.Rows(RegistoAtual).Cells(3).Value), FonteNormal, Brushes.Black, MargemEsquerda + 450, PosicaoLinha, AlinharDireita) 'Aqui dá erro

Para quê usar uma função se não fazes return de nada?

Mas ainda bem que tens o que precisas.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
vikcch

Para quê usar uma função se não fazes return de nada?

???

If campo Is DBNull.Value Then
ConverterParaString = "Vazio"
Else
ConverterParaString = campo.ToString
End If

neste caso faz o mesmo que isto:

	    If campo Is DBNull.Value Then
	    Return "Vazio"
    Else
	    Return campo.ToString
    End If

nao sei se é isso que estas a falar... ainda tou "apegado" ao vb6

Editado por vikcch

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
He B TeMy

???

If campo Is DBNull.Value Then
ConverterParaString = "Vazio"
Else
ConverterParaString = campo.ToString
End If

neste caso faz o mesmo que isto:

	 If campo Is DBNull.Value Then
	 Return "Vazio"
 Else
	 Return campo.ToString
 End If

nao sei se é isso que estas a falar... ainda tou "apegado" ao vb6

Erro meu, pensei que estavas a dar o exemplo para "escreveres" tudo aí, sendo assim, já percebi.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.