PROBLEMA COM IMPRESSÃO EM C# VIA CÓDIGO

MARCOSARANTESJ 01/10/2015 07:41:19
#451994
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();

TUNUSAT 01/10/2015 08:24:23
#451999
MARCOSARANTESJ,

Só não entendi...
using GPrint.controller;


Isso refere-se a?!?
===========================================
G-Print - Impossible to copy
http://www.arcticpaper.com/en/Home/G-Print/
===========================================
rrdgraph_graph
https://oss.oetiker.ch/rrdtool/doc/rrdgraph_graph.en.html
===========================================
gPrint - Cloud Printing at Geneseo
https://wiki.geneseo.edu/display/cit/gPrint+-+Cloud+Printing+at+Geneseo
===========================================

[][ô]s,
Tunusat.
MARCOSARANTESJ 01/10/2015 14:00:34
#452027
é que isso aí está dentro da camada de controle do meu modelo MVC. Aí por isso gprint.controller. Gprint é o nome do projeto. Mas na verdade está sem uso mesmo. Já removi aqui.
TUNUSAT 01/10/2015 14:40:16
#452037
MARCOSARANTESJ,

Por favor, faça uma coisa, dentro do [Ô]btnImpressao_Click[Ô] coloque um Try:
================================================
try-catch (C# Reference)
https://msdn.microsoft.com/en-us/library/0yd65esw.aspx
================================================
- Try <TAB><TAB>;

Aparecerá o seguinte:
            try
{
}
catch (Exception)
{
throw;
}


Dentro da área do [Ô]Try {}[Ô] coloque seu código.
O [Ô]catch (Exception)[Ô] você coloca lá no fim código, modificando para:
            catch (Exception ex)
{
MessageBox.Show([Ô]Erro: [Ô] + ex.ToString());
}


Coloquei seu código aqui na minha máquina e deu o seguinte erro:

nomeDoc = lista.Items[i].SubItems[1].Text;


Citação:

Erro: System.ArgumentOutOfRangeException: InvalidArgument=Value [ô]1[ô] não é um valor válido para [ô]index[ô].
Nome do parâmetro: index



Bom ... acho que EU não coloquei o [Ô]Index[Ô] e [Ô]SubIndex[Ô] corretamente aqui na minha lista...
... vou colocar e testar de novo.

[][ô]s,
Tunusat.
TUNUSAT 01/10/2015 14:54:43
#452040
MARCOSARANTESJ,

Gerei aqui! veja o [Ô]Teste.jpg[Ô] anexo.
Só não entendi pq ficou em [Ô]looping[Ô] o número de páginas ... eu mandei interromper manualmente quando chegou a ficar mais de mil.

[][ô]s,
Tunusat.
MARCOSARANTESJ 01/10/2015 22:38:57
#452072
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 08:02:41
#452087
MARCOSARANTESJ,

Veja meu teste de hoje. Rodou sem ficar em looping perpétuo! Perfeito!

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