none
Problema con la impresión de documentos con PrintPage del Objeto PrintDocument RRS feed

  • Pregunta

  • Hola Amigos del Foro,

    Tengo un problema que se me genera al realizar un PrintPreview de una serie de elementos alojados en elementos List<T>.

    El problema es el siguiente, cuando envío el documento al PrintPreview inicialmente se genera correctamente de acuerdo a lo que espero; pero cuando repito la acción inmediatamente después de cerrar el printPreview se genera nuevamente; pero esta vez se experimentan cambios en algunos elementos sin que yo haya cambiado ningún elemento. Especificamente el elemento que registra el cambio es :

    Single hight = e.MarginBounds.Height; // En el primer Preview es 900, luego en el siguiente Preview cambia a 820.

    A continuación Anexo el código:

    void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    		{
    			Margins margenes = new Margins(60, 60, 220, 60);
    			printDocument1.DefaultPageSettings.Margins = margenes;
    			Font fte = new Font("verdana", 10, FontStyle.Regular);
    			Font ftti = new Font("verdana", 10, FontStyle.Bold);
    			SolidBrush br = new SolidBrush(Color.Black);
    
    			Single xPos = e.MarginBounds.Left;
    			Single yPos = e.MarginBounds.Top;
    			Single hight = e.MarginBounds.Height;
    			Single incLine = 20;
    
    			int printHeight;
    			printHeight = e.MarginBounds.Height - printDocument1.DefaultPageSettings.Margins.Bottom -
    				printDocument1.DefaultPageSettings.Margins.Top;
    
    			int x = 0;
    			int k = 0;
    			int r = 0;
    			int m = 0;
    			int n = 0;
    			
    			itempage = 0;
    			while(contador < lista1.Count){
    				x = contador;
    				e.Graphics.DrawString("" + x, fte, Brushes.Black, 70, yPos + incLine);
    				e.Graphics.DrawString(lista1[x].ToString("0.000"), fte, Brushes.Black, 130, yPos + incLine);
    				incLine += 22;
    				contador++;
    				itempage++;
    				if (itempage == 35)
    				{
    					PaginaNumero++;
    					e.HasMorePages = x < lista1.Count;
    					return;
    				}
    			}
    			PaginaNumero++;
    			e.HasMorePages = x < lista1.Count;
    
    			itemporpage = 0;
    			if (PaginaNumero > 2) {
    				while (count < numeros.Count) {
    					k = count;
    					while (count1 < numeros[k].Count) {
    						r = count1;
    						e.Graphics.DrawString("" + r, fte, Brushes.Black, 70, yPos + incLine);
    						e.Graphics.DrawString(numeros[k][r].ToString("0.000"), fte, Brushes.Black, 130, yPos + incLine);
    						incLine += 22;
    						count1++;
    						itemporpage++;
    						if (itemporpage == 36) {
    							PaginaNumero++;
    							e.HasMorePages = k < numeros.Count && count1 < numeros[k].Count;
    							return;
    						}
    					}
    					count++;
    					count1 = 0;
    					PaginaNumero++;
    					e.HasMorePages = count1 < numeros[k].Count;
    					return;
    				}
    			}
    			PaginaNumero++;
    			e.HasMorePages = count1 < numeros[k].Count;
    			
    			itempage2 = 0;
    			if (PaginaNumero > 8) {
    				while (count2 < lista2.Count) {
    					n = count2;
    					e.Graphics.DrawString("" + n, fte, Brushes.Black, 70, yPos + incLine);
    					e.Graphics.DrawString(lista2[n], fte, Brushes.Black, 130, yPos + incLine);
    					incLine += 22;
    					count2++;
    					itempage2++;
    
    					if (itempage2 == 35) {
    						PaginaNumero++;
    						e.HasMorePages = n < lista2.Count;
    						return;
    					}
    				}
    				e.HasMorePages = false;
    			}
    		}




    Agredecerí su gran ayuda, les saluda.

    MLiranzo


    MLiranzo

    sábado, 28 de marzo de 2020 1:43

Todas las respuestas

  • Hola Marino

    No logro encontrar en el código que pasaste por qué te cambia de 900 a 820 el MarginBounds.Height, no habrá otro código que no mostraste donde pueda ser modificado? En el Preview, que lo mencionas por ahí?

    De última, lo que tendrías que hacer es asignarlo una sola vez y en un solo lugar.

    Saludos

    Pablo

    sábado, 28 de marzo de 2020 21:11
  • Saludos Pablo,

    Gracias por atender mi problema. Los únicos códigos omitidos que tienen que ver con impresión es el código del botón donde esta la llamada a la printPreview, a continuación lo muestro. Una duda que me invade es que cuando hago un punto de quiebre en algún punto para poder verificar el valor de algunas variables, veo que algunas elementos como: e.MarginBound.Bottom, e.MargingBound.Left, tienen valores iniciales que no sé de donde salen; pues no tengo margenes por defecto en otro lugar.

    void button2_Click(object sender, EventArgs e)
    		{
    			count = 0;
    			count2 = itempage2 = 0;
    			contador = itempage = 0;
    			count1 = itemporpage = 0;
    			PaginaNumero = 0;
    			
    			printPreviewDialog1.Text = "Impresión Previa";
    			printPreviewDialog1.WindowState = FormWindowState.Maximized;
    			printPreviewDialog1.PrintPreviewControl.StartPage = 0;
    			printPreviewDialog1.PrintPreviewControl.Zoom = 0.75;
    			printPreviewDialog1.Document = printDocument1;
    			printPreviewDialog1.ShowDialog();
    		}

    Atentamente,

    Marino Liranzo

     

    MLiranzo

    domingo, 29 de marzo de 2020 0:24
  • Si, el objeto PrintDocument tiene valores por defecto para todo ...
    domingo, 29 de marzo de 2020 0:41
  • Sólo los establecidos por :Margins Margenes = new Margins(60, 60, 120, 60); anexo el código completo.

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Drawing.Printing;
    using System.Windows.Forms;
    
    namespace ImprimirListas
    {
    	public partial class MainForm : Form
    	{
    		List<List<float>> numeros;
    		List<float> valor1;
    		List<float> valor2;
    		List<float> valor3;
    		List<float> lista1;
    		List<string> lista2;
    
    		int PaginaNumero = 0;
    		int contador = 0;
    		int contador1 = 0;
    		int count = 0;
    		int count1 = 0;
    		int count2 = 0;
    		int itempage = 0;
    		int itempage2 = 0;
    		int itemporpage = 0;
    
    		public MainForm()
    		{
    			InitializeComponent();
    		}
    
    		void button1_Click(object sender, EventArgs e)
    		{
    			numeros = new List<List<float>>();
    			lista1 = new List<float>();
    			lista2 = new List<string>();
    			valor1 = new List<float>();
    			valor2 = new List<float>();
    			valor3 = new List<float>();
    
    			for (int i = 0; i < 60; i++)
    			{
    				float a = (float)12.30 * i;
    				valor1.Add(a);
    				float b = (float)6.68 * i;
    				valor2.Add(b);
    				float c = (float)9.63 * i;
    				valor3.Add(c);
    			}
    			numeros.Add(valor1);
    			numeros.Add(valor2);
    			numeros.Add(valor3);
    			for (int i = 0; i < 40; i++) {
    				float dat = (float)3.30 * i/2;
    				lista1.Add(dat);
    			}
    			for (int i = 0; i < 40; i++) {
    				string dat = "abc"+2*i;
    				lista2.Add(dat);
    			}
    		}
    
    		void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    		{
    			Margins margenes = new Margins(60, 60, 120, 60);
    			printDocument1.DefaultPageSettings.Margins = margenes;
    			Font fte = new Font("verdana", 10, FontStyle.Regular);
    			Font ftti = new Font("verdana", 10, FontStyle.Bold);
    			SolidBrush br = new SolidBrush(Color.Black);
    
    			Single xPos = e.MarginBounds.Left;
    			Single yPos = e.MarginBounds.Top;
    			Single yButt = e.MarginBounds.Bottom;
    			Single hight = e.MarginBounds.Height;
    			Single incLine = 20;
    
    			int printHeight;
    			printHeight = e.MarginBounds.Height - printDocument1.DefaultPageSettings.Margins.Bottom -
    				printDocument1.DefaultPageSettings.Margins.Top;
    
    			int x = 0;
    			int k = 0;
    			int r = 0;
    			int m = 0;
    			int n = 0;
    			
    			itempage = 0;
    			while(contador < lista1.Count){
    				x = contador;
    				e.Graphics.DrawString("" + x, fte, Brushes.Black, 70, yPos + incLine);
    				e.Graphics.DrawString(lista1[x].ToString("0.000"), fte, Brushes.Black, 130, yPos + incLine);
    				incLine += 22;
    				contador++;
    				itempage++;
    				if (itempage == 35)
    				{
    					PaginaNumero++;
    					e.HasMorePages = x < lista1.Count;
    					return;
    				}
    			}
    			PaginaNumero++;
    			e.HasMorePages = x < lista1.Count;
    
    			itemporpage = 0;
    			if (PaginaNumero > 2) {
    				while (count < numeros.Count) {
    					k = count;
    					while (count1 < numeros[k].Count) {
    						r = count1;
    						e.Graphics.DrawString("" + r, fte, Brushes.Black, 70, yPos + incLine);
    						e.Graphics.DrawString(numeros[k][r].ToString("0.000"), fte, Brushes.Black, 130, yPos + incLine);
    						incLine += 22;
    						count1++;
    						itemporpage++;
    						if (itemporpage == 36) {
    							PaginaNumero++;
    							e.HasMorePages = k < numeros.Count && count1 < numeros[k].Count;
    							return;
    						}
    					}
    					count++;
    					count1 = 0;
    					PaginaNumero++;
    					e.HasMorePages = count1 < numeros[k].Count;
    					return;
    				}
    			}
    			PaginaNumero++;
    			e.HasMorePages = count1 < numeros[k].Count;
    			
    			itempage2 = 0;
    			if (PaginaNumero > 8) {
    				while (count2 < lista2.Count) {
    					n = count2;
    					e.Graphics.DrawString("" + n, fte, Brushes.Black, 70, yPos + incLine);
    					e.Graphics.DrawString(lista2[n], fte, Brushes.Black, 130, yPos + incLine);
    					incLine += 22;
    					count2++;
    					itempage2++;
    
    					if (itempage2 == 35) {
    						PaginaNumero++;
    						e.HasMorePages = n < lista2.Count;
    						return;
    					}
    				}
    				e.HasMorePages = false;
    			}
    		}
    
    		void button2_Click(object sender, EventArgs e)
    		{
    			count = 0;
    			count2 = itempage2 = 0;
    			contador = itempage = 0;
    			count1 = itemporpage = 0;
    			PaginaNumero = 0;
    			
    			printPreviewDialog1.Text = "Impresión Previa";
    			printPreviewDialog1.WindowState = FormWindowState.Maximized;
    			printPreviewDialog1.PrintPreviewControl.StartPage = 0;
    			printPreviewDialog1.PrintPreviewControl.Zoom = 0.75;
    			printPreviewDialog1.Document = printDocument1;
    			printPreviewDialog1.ShowDialog();
    		}
    
    	}
    }

    Gracias


    MLiranzo

    domingo, 29 de marzo de 2020 1:00
  • Esto 

    int printHeight;
    printHeight = e.MarginBounds.Height - printDocument1.DefaultPageSettings.Margins.Bottom -printDocument1.DefaultPageSettings.Margins.Top;

    Dónde lo usas otra vez en el método?

    Además de que no lo veo, me suena medio raro ...

    domingo, 29 de marzo de 2020 1:29
  • Hola, 

    Lo uso en la determinación de la cantidad de lineas en el espacio neto de la página en la expresión siguiente:

    int LineasPagina = Convert.ToInt32(printHeight / fte.GetHeight(e.Graphics)); lo omití inadvertidamente en este código. El código mostrado es una recreación de mi código original, el cual no adjunto por que es grande y engorroso de revisar, por la cantidad de datos que tengo que ingresar.

    Marino



    MLiranzo

    domingo, 29 de marzo de 2020 2:23