Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

m0fl

[Resolvido] Imprimir DatagridView HasMorePages (Duvida) VB2010

Mensagens Recomendadas

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

Editado por Caça
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por Caça

Pedro Martins

Não respondo a duvidas por PM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por Caça
GeShi

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.