IMPRESS?O EM C# - N?O IMPRIME MAIS P?GINAS

MARCOSARANTESJ 30/09/2015 15:51:22
#451974
Eu não estou conseguindo imprimir mais páginas. Estou fazendo a impressão via código. Já tentei vários exemplos mas nenhum funciona.
  using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;
using GPrint.controller;
using System.Data.Common;
using System.Drawing;

namespace GPrint.model
{
class Impressao
{
//[ô]define os objetos printdocument e os eventos associados
PrintDocument pd = new PrintDocument();
int paginaAtual = 1;
//define o objeto para visualizar a impressao
private PrintPreviewDialog objPrintPreview = new PrintPreviewDialog();
//private DbDataReader Leitor;
//private DB banco;
public ListView lista;

public void imprimir()
{

pd.PrintPage += new PrintPageEventHandler(this.Pd_PrintPage);
pd.DefaultPageSettings.Landscape = true;
objPrintPreview.Document = this.pd;
objPrintPreview.WindowState = FormWindowState.Maximized;
objPrintPreview.PrintPreviewControl.Zoom = 1;
objPrintPreview.Text = [Ô]Impressões por dia[Ô];
objPrintPreview.ShowDialog();

}


private void Pd_PrintPage(object sender, PrintPageEventArgs e)
{

//Variaveis das linhas
Single LinhasPorPagina = 0;
Single PosicaoDaLinha = 0;
int LinhaAtual = 0;

//Título
string titulo = [Ô]Impressões por dia[Ô];

//Variáveis das margens
Single MargemEsquerda = e.MarginBounds.Left;
Single MargemSuperior = e.MarginBounds.Top + 40;
Single MargemDireita = e.MarginBounds.Right;
Single MargemInferior = e.MarginBounds.Bottom;

//classe Pen define um objeto usado para definir linhas e curvas
Pen CanetaDaImpressora = new Pen(Color.Black, 1);
//int MargemCentro = (e.MarginBounds.Width - titulo.Length / 2);
//MessageBox.Show([Ô][Ô] + MargemCentro);

//VARIÁVEIS PARA OS CAMPOS QUE APARECERÃO NA TELA
//DateTime Data1;
//string Nomes;
string impressora;
string nomeDoc;
//string status;
string qtdPaginas;
string proprietario;
string tamanhoKB;
string enviado;
string tamanhoPapel;

//Variaveis das fontes
Font FonteNegrito;
Font FonteTitulo;
Font FonteSubTitulo;
Font FonteRodape;
Font FonteNormal;
Font FonteGrande;

//define efeitos em fontes
FonteNegrito = new Font([Ô]Arial[Ô], 10, FontStyle.Bold);
FonteTitulo = new Font([Ô]Arial[Ô], 20, FontStyle.Bold);
FonteSubTitulo = new Font([Ô]Arial[Ô], 12, FontStyle.Bold);
FonteRodape = new Font([Ô]Arial[Ô], 8);
FonteNormal = new Font([Ô]Arial[Ô], 8);
FonteGrande = new Font([Ô]Arial[Ô], 14);

//define valores para linha atual e para linha da impressao
LinhaAtual = 0;
//int L = 0;

//Linhas do Cabeçalho
e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, 40, MargemDireita + 80, 40);
e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, 90, MargemDireita + 80, 90);

//nome do título
//MargemEsquerda + 0
e.Graphics.DrawString(titulo, FonteTitulo, Brushes.Black, MargemEsquerda, 50, new StringFormat());

//e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, 90, MargemDireita + 80, 90);
LinhasPorPagina = Convert.ToInt32(e.MarginBounds.Height / FonteGrande.GetHeight(e.Graphics) - 10);

//Aqui são lidos os dados
//string impressora;string nomeDoc;string status;string qtdPaginas;string proprietario;
//string tamanhoKB;string enviado;string tamanhoPapel;
e.Graphics.DrawString([Ô]Impressora[Ô], FonteNegrito, Brushes.Black, MargemEsquerda - 80, 100, new StringFormat());
e.Graphics.DrawString([Ô]Nome do documento[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 190, 100, new StringFormat());
//e.Graphics.DrawString([Ô]Status[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 350, 100, new StringFormat());
e.Graphics.DrawString([Ô]QTD Pag.[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 450, 100, new StringFormat());
e.Graphics.DrawString([Ô]Proprietário[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 520, 100, new StringFormat());
e.Graphics.DrawString([Ô]Tamanho(KB)[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 650, 100, new StringFormat());
e.Graphics.DrawString([Ô]Enviado[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 750, 100, new StringFormat());
e.Graphics.DrawString([Ô]Tam. Papel[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 870, 100, new StringFormat());

e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, 120, MargemDireita + 80, 120);
//while (LinhaAtual < LinhasPorPagina && Leitor.Read())
int i = 0;
//LinhasPorPagina = 25;
//LinhasPorPagina = 28;&& i < lista.Items.Count
//paginaAtual = 1;
//LinhaAtual < LinhasPorPagina &&
while (i < lista.Items.Count)
{

//string impressora;string nomeDoc;string status;string qtdPaginas;string proprietario;
//string tamanhoKB;string enviado;string tamanhoPapel;

impressora = lista.Items[i].SubItems[0].Text;
nomeDoc = lista.Items[i].SubItems[1].Text;
//status = lista.Items[i].SubItems[2].Text;
qtdPaginas = lista.Items[i].SubItems[3].Text;
proprietario = lista.Items[i].SubItems[4].Text;
tamanhoKB = lista.Items[i].SubItems[5].Text;
enviado = lista.Items[i].SubItems[6].Text;
tamanhoPapel = lista.Items[i].SubItems[7].Text;

PosicaoDaLinha = MargemSuperior + Convert.ToInt32(LinhaAtual * FonteGrande.GetHeight(e.Graphics));

e.Graphics.DrawString(impressora, FonteNormal, Brushes.Black, MargemEsquerda - 80, PosicaoDaLinha, new StringFormat());
e.Graphics.DrawString(nomeDoc, FonteNormal, Brushes.Black, MargemEsquerda + 190, PosicaoDaLinha, new StringFormat());
//e.Graphics.DrawString(status, FonteNormal, Brushes.Black, MargemEsquerda + 350, PosicaoDaLinha, new StringFormat());
e.Graphics.DrawString(qtdPaginas, FonteNormal, Brushes.Black, MargemEsquerda + 490, PosicaoDaLinha, new StringFormat());
e.Graphics.DrawString(proprietario, FonteNormal, Brushes.Black, MargemEsquerda + 520, PosicaoDaLinha, new StringFormat());
e.Graphics.DrawString(tamanhoKB, FonteNormal, Brushes.Black, MargemEsquerda + 670, PosicaoDaLinha, new StringFormat());
e.Graphics.DrawString(enviado, FonteNormal, Brushes.Black, MargemEsquerda + 750, PosicaoDaLinha, new StringFormat());
e.Graphics.DrawString(tamanhoPapel, FonteNormal, Brushes.Black, MargemEsquerda + 870, PosicaoDaLinha, new StringFormat());
LinhaAtual += 1;
i++;
}

//Rodape
e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, MargemInferior + 50, MargemDireita + 80, MargemInferior + 50);
e.Graphics.DrawString(System.DateTime.Now.ToString(), FonteRodape, Brushes.Black, MargemEsquerda, MargemInferior + 60, new StringFormat());

LinhaAtual += Convert.ToInt32(FonteGrande.GetHeight(e.Graphics));
LinhaAtual += 1;

e.Graphics.DrawString([Ô]Página : [Ô] + paginaAtual, FonteRodape, Brushes.Black, MargemDireita - 50, MargemInferior + 60, new StringFormat());

//Incrementa o número da pagina
paginaAtual += 1;

if (LinhaAtual > LinhasPorPagina)
{
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}

}

}
}


Agora o código para colocar no botão
  Impressao impressao = new Impressao();
impressao.lista = this.listViewDados;
impressao.imprimir();

MARCOSARANTESJ 01/10/2015 22:40:04
#452073
Agora eu consegui resolver. Eu declarei a variável i como pública. Ela conta a posição do registro e mesmo se tiver mais páginas imprime de onde parou e também eu estava fazendo a lógica errada.

Eu troquei no loop while o código

while (i < lista.Items.Count)

por

while (i < lista.Items.Count && LinhaAtual < LinhasPorPagina)

e também troquei

 if (LinhaAtual > LinhasPorPagina)
{
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}


por

if (i + 1 > LinhasPorPagina && i < LinhaAtual)
{
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}


Sendo que declarei a variável int i como pública e assim imprime de onde parei.

TUNUSAT 02/10/2015 07:56:08
#452085
MARCOSARANTESJ,

Que bom que você conseguiu, testei aqui e as páginas não giram mais ao infinito como ontem.
Parabéns aê!

[][ô]s,
Tunusat.
Faça seu login para responder