Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas com PrintDocument Frente e verso


Andre Ishihara

Pergunta

Boa tarde,

Tenho a seguinte dúvida: Eu tenho um winform que me retorna registros e preciso mandar eles para impressão. Cada registro vai gerar uma carta que tem frente e verso.

Dentro do void print fiz a seguinte chamada:

foreach (datadgridviewrow dr in ds)

{

   ImpressaoVerso() //função para imprimir o verso

   contPaginas++

   if (contPaginas > totalPaginas)

      e.HasMorePages = true;

   else

      e.HasMorePages = true;

   ImpressaoFrente()//função para imprimir a frente

   contPaginas++

   if (contPaginas > totalPaginas)

      e.HasMorePages = true;

   else
      e.HasMorePages = true;

}

Só que as duas partes são impressas no mesmo lado da página. Sem contar que ele registra apenas o ultimo registro indicado. alguém tem alguma ideia do que estou fazendo de errado? Ou que poderia estar fazendo?

Agradeço a atenção,

André Ishihara

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Boa tarde pessoas,

Depois de muito pesquisar consgui um código que faz quase o que eu preciso:

Class.MultiPrintDocument mutlPrint;
            foreach (DataGridViewRow drDados in dgvRegistros.Rows)
            {
                drRegistro = drDados;
                if (drDados.Cells["Selecao"].Value == null)
                    drDados.Cells["Selecao"].Value = false;
                if (drDados.Cells["Selecao"].Value.ToString().ToLower() == "true")
                {
                    pdVerso.PrintPage += new PrintPageEventHandler(ImprimirVerso);
                    pdRegistro[cntContadorPaginas] = pdVerso;
                    cntContadorPaginas++;
                    pdFrente.PrintPage += new PrintPageEventHandler(ImprimirFrente);
                    pdRegistro[cntContadorPaginas] = pdFrente;
                    cntContadorPaginas++;
                }
            }
            mutlPrint = new Class.MultiPrintDocument(pdRegistro);
            mutlPrint.Print();

A Classe MultiPrintDocument foi encontrada neste endereço: http://www.csharp-examples.net/combine-mul...printdocuments/.

O único problema desse código é que ele não faz as chamadas das funções ImprimirFrente e ImprimirVerso, que é aonde a parte da impressão é feita(O que é impresso, etc). Tem um outro handler alem do PrintPageEventHandler que consegue chamar as funções? Porque este é o meu único problema agora.

Agradeço a atenção

Link para o comentário
Compartilhar em outros sites

  • 0

andre, esse codigo esta dentro do evento PrintPage(), certo??

o certo então, seria você imprimir cada pagina a cada passagem do PrintPage() e não imprimir duas paginas na mesma passagem.

o q tem nas funcoes ImpressaoVerso() e ImpressaoFrente()?? quem gerencia os lados da pagina é a sua propria impressora. desde q você selecione pra imprimir frente e verso, ela vai alternando automaticamente, você não precisa controlar isso.

o certo seria a cada passagem no PrintPage(), q você chamasse somente a funcao ImpressaoVerso() ou só a ImpressaoFrente(), mas não as duas.

você pode fazer um contador, ou mesmo usar o contPaginas. exemplo, quando ela for impar você imprime no verso, quando for par imprime na frente.

ai no final, você coloca o e.HasMorePages = true; ate q o seu dataset chegue no final, veja se não funciona ai.

EDITADO:

cheguei atrasado.

não conheco a classe MultiPrintDocument, mas acho q daria pra fazer com a PrintDocument, mesmo...

o q exatamente tem dentro das suas funcoes ImpressaoVerso() e ImpressaoFrente()??

Editado por kuroi
Link para o comentário
Compartilhar em outros sites

  • 0

kuroi: Tentei fazer da forma que você descreveu. Mas não funcionou.

Nas funções ImpressãoFrente e Impressão verso só tem as partes do PrintPageEventArgs.

Não importa o que eu faço o e.HasMorePages não tem funcionado da maneira que eu preciso.

Essa classe de multiprint funciona da seguinte forma: Eu crio um array de printdocument e a cada passagem de frente ou verso eu acrescento um printdocument no array e depois eu salvo o array dentro do multiprint. A única coisa que eu preciso ver é fazer a chamada do impressaofrente ou impressaoverso para chamarem o PrintPageEventArgs para o printdocument correspondente e depois ele é adicionado dentro do array.

Caso ainda não tenha ficado claro favor entrar em contato.

Agradeço a atenção,

Editado por Andre Ishihara
Link para o comentário
Compartilhar em outros sites

  • 0

hum... como faz tempo q não mexo com essas coisas, posso acabar falando besteira...

mas esse codigo do foreach ta dentro do void PrintPage() certo??

olha, eu li por ai q o e.HasMorePages funciona da seguinte maneira: ocorre o evento PrintPage() e ele imprime uma pagina. quando chegar no final (somente quando chegar no final), ele vai ler o e.HasMorePages. se ele for true, ele chama o evento de novo pra imprimir a proxima pagina. se for false, ele não imprime e acaba a impressao.

então, não vai funcionar se você colocar dentro do foreach.

você teria q imprimir uma pagina uma unica vez dentro do PrintPage(). ai você seta o e.HasMorePages = true e ai ele volta e imprime a proxima. se ficar dentro do foreach não vai funcionar mesmo.

mas tb não entendi como você esta usando o PrintPageEventArgs dentro dessas duas funcoes...

acho q o certo seria você declarar assim:

void ImpressaoVerso(object sender, PrintPageEventArgs ev)
{
/* codigo */
}
void ImpressaoFrente(object sender, PrintPageEventArgs ev)
{
/* codigo */
}[/code] ai o codigo do multiprint deve funcionar... o codigo anterior, tb acho q, se você declarasse as funcoes como passei acima, deveria funcionar mais ou menos assim:
[code]void Imprime() //ai você chama essa funcao a partir de onde quiser, um clique de botao, etc
{
   /*
   aqui você declara as variaveis, tipo a contPaginas e poe os outros codigos q você quiser.
  */
foreach (datadgridviewrow dr in ds)
{
    pd.PrintPage += new PrintPageEventHandler(this.ImpressaoVerso); //pd é o nome do seu PrintDocument
    pd.Print();

   contPaginas++;

   if (contPaginas > totalPaginas)
      return;


    pd.PrintPage += new PrintPageEventHandler(this.ImpressaoFrente); //pd é o nome do seu PrintDocument
    pd.Print();

   contPaginas++;

   if (contPaginas > totalPaginas)
      return;
}
}

ai você seta o e.HasMorePages = false dentro de impressaoverso e impressaofrente.

veja ai se os codigos ajudam...

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...