Jump to content
Sign in to follow this  
m0fl

[Resolvido] Imprimir DatagridView HasMorePages (Duvida) VB2010

Recommended Posts

m0fl

Bom Dia !

Nao tou a conseguir imprimir o datagridview com múltiplas páginas..

Sei que tenho de usar o hasmorepages mas acho que não estou a entender muito bem a lógica..

Ja tou a conseguir imprimir tudo numa folha como pretendo, mas quando tento dividir o texto por uma quantidade de linhas para ai mudar para a pagina seguinte ele nao me faz e apresenta tudo numa só pagina..

Vou colocar aqui o código em questão para ver se me podem dar umas luzes de como poderei fazer correctamente

Obrigado :)

Private Sub Pagina(ByVal sender As System.Object, ByVal e As Drawing.Printing.PrintPageEventArgs) Handles PrintDoc.PrintPage

Dim g As Graphics = e.Graphics
Dim LogText As String = String.Empty
Dim PosicaoLinha As Integer = 30
Dim LinhaAtual As Byte = 1
Dim LinhasPorPagina As Byte = 5

'Definições da pagina
g.PageUnit = GraphicsUnit.Millimeter

'Desenhar folha
Dim Titulo As New Font("Times New Roman", 3, FontStyle.Regular Or FontStyle.Bold, GraphicsUnit.Millimeter)
g.DrawString("Análise LOG (" & menutablename & ") ", Titulo, Brushes.Black, 125, 10)

'Ler datagridview
For Each dr As DataGridViewRow In DataGridView1.Rows

'Por na variavel a linha toda
For i As Integer = 1 To dr.Cells.Count - 1
LogText &= dr.Cells(i).Value & " | "
Next

'Desenhar conteudo na página
e.Graphics.DrawString(LogText, New Font("Verdana", 6), Brushes.Black, 10, PosicaoLinha)

PosicaoLinha += 5
LinhaAtual += 1
LogText = String.Empty

'Se linha atual for igual á linhas devidas por página então muda de página
If LinhaAtual = LinhasPorPagina Then
e.HasMorePages = True
LinhaAtual = 1
Else
e.HasMorePages = False
End If

Next

End Sub

Edited by Caça
GeSHi

Share this post


Link to post
Share on other sites
m0fl

Nesse artigo nao consegui encontrar aquilo que necessitava, neste caso como por o hasmorepages a funcionar no meu código :S

Obrigado desde ja pela ajuda!

Share this post


Link to post
Share on other sites
Caça

Não podes fazer com um For Each, tens de criar um ciclo que coloca na folha o limite de linhas, no teu caso coloca 5 linhas de cadavez.


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
acao

boas

acho que falta «reposicionar a posição da linha»


'Se linha atual for igual á linhas devidas por página então muda de página
If LinhaAtual = LinhasPorPagina Then
e.HasMorePages = True
PosicaoLinha  = 30
LinhaAtual = 1
Else

cumps

acao

edit:

quando andei a fazer relatórios tambem tive esse problema e a minha resolução foi colocar Exit sub depois de e.hasMorePages = true.

podes verificar aqui http://www.portugal-a-programar.pt/topic/46983-relatorio-imprimir-varias-paginas/page__p__413333#entry413333 imprime relatorio tipo tabela.

ps: se necessitares como é chamada a sub apita.

cumps

acao

Edited by acao

Share this post


Link to post
Share on other sites
m0fl

Bom dia! Obrigado pela ajuda acao, eu tentei fazer como tu fizeste, e coloquei o exit sub como mostra em baixo.

O que acontece agora é que ele vai criando automaticamente páginas infinitas sem parar, apesar que se eu fizer logo cancelar ele pára e consigo ver que criou as tais paginas, mas sao muitas.

Outra coisa que reparei é que sim ele ja ta a colocar bem as 5 linhas por pagina, mas o código é o mesmo nas tais outras paginas "infinitas".

Nao sei o que estará errado :S

Obrigado!

'Se linha atual for igual á linhas devidas por página então muda de página
If LinhaAtual = LinhasPorPagina Then
e.HasMorePages = True
LinhaAtual = 0
Exit Sub
Else
e.HasMorePages = False
End If

Share this post


Link to post
Share on other sites
Caça

Era o problema que eu te estava a dizer..

Passa esta variavel para fora do Sub

Dim LinhaAtual As Integer

E o teu código final deve ser mais ou menos assim(não testei)

Private Sub Pagina(ByVal sender As System.Object, ByVal e As Drawing.Printing.PrintPageEventArgs) Handles PrintDoc.PrintPage

	Dim g As Graphics = e.Graphics
	Dim LogText As String = String.Empty
	Dim PosicaoLinha As Integer = 30
	Dim LinhasPorPagina As Byte = 5

	'Definições da pagina
	g.PageUnit = GraphicsUnit.Millimeter

	'Desenhar folha
	Dim Titulo As New Font("Times New Roman", 3, FontStyle.Regular Or FontStyle.Bold, GraphicsUnit.Millimeter)
	g.DrawString("Análise LOG (" & menutablename & ") ", Titulo, Brushes.Black, 125, 10)

	'Ler datagridview

	For L = 0 To LinhasPorPagina - 1
		If LinhaAtual = DataGridView1.Rows.Count Then Continue For

		'Por na variavel a linha toda
		For i As Integer = 1 To DataGridView1.ColumnCount - 1
			LogText &= DataGridView1.Item(i, LinhaAtual).Value.ToString & " | "
		Next

		'Desenhar conteudo na página
		e.Graphics.DrawString(LogText, New Font("Verdana", 6), Brushes.Black, 10, PosicaoLinha)

		PosicaoLinha += 5
		LinhaAtual += 1
		LogText = String.Empty


	Next

	'Se linha atual for igual á linhas devidas por página então muda de página
	If LinhaAtual < DataGridView1.Rows.Count Then
		e.HasMorePages = True
	Else
		e.HasMorePages = False
	End If

End Sub

Edited by Caça

Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
m0fl

Obrigado caça, ja adaptei o código ..

O que acontece agora é que quando tou a testar , ele quando a linha actual é a 10 , nesta parte:

For i As Integer = 1 To DataGridView1.ColumnCount - 1
LogText &= DataGridView1.Item(i, LinhaAtual).Value.ToString & " | "
Next

Dá este erro: "Object reference not set to an instance of an object". na linha do meio ..

Neste caso o i era o 1 e a linha actual o 10 ..

E as rows do datagrid seriam 11..

O que poderá ser ?

Obrigado :)

Share this post


Link to post
Share on other sites
m0fl

Está resolvido..

Foi acrescentar a validação que ta em baixo e ele passou sem problemas e já me mostra correctamente..

Muito obrigado pela ajuda caça :)

 For i As Integer = 1 To DataGridView1.ColumnCount - 1

If Not DataGridView1.Item(i, LinhaAtual).Value = Nothing Then

LogText &= DataGridView1.Item(i, LinhaAtual).Value.ToString & " | "

End If

Next

Edited by Caça
GeShi

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • 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.