Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: rulovive en 15 Julio 2021, 00:47 am



Título: problema de impresion printdocument y hasmorepages= windows forms c#
Publicado por: rulovive en 15 Julio 2021, 00:47 am
Buen dia... como siempre son mi ultimo recurso porque agoté todas las posibilidades e ideas que tengo... la cosa es asi:

Quiero imprimir un reporte de n numero de registros por edio de una pulsacion de boton (anexo codigo):
Código:
pagina = 1; //al pulsar el boton el contador de paginas inicia siempre en 1
            vuelta = 0; //al pulsar el boton siempre establezco empezar a leer en la linea 0

            PrintDialog printdialog1 = new PrintDialog();//instancia nueva para crear un dialogo de impresion
            printdialog1.Document = printDocument1;//se asigna la relacion con el documento a imprimir
            DialogResult result = printdialog1.ShowDialog();//se asigna el resultado de la seleccion del dialogo en la variable result


            // ESTO QUE VIENE AQUI EN VERDE ES PARA OBTENER UNA VISTA PREVIA DEL DOCUMENTO A IMPRIMIR...
            PrintPreviewDialog ppd = new PrintPreviewDialog { Document = printDocument1 }; //<-------creamos un nuevo dialogo preview de impresion
            ((Form)ppd).WindowState = FormWindowState.Maximized;
            ppd.ShowDialog();     //<----------sirve para mostrar el preview de la impresion    


            if (result == DialogResult.OK)
               printDocument1.Print();

esa parte funciona a la perfeccion... ahora anexo dos codigos que tienen que ver con las impresiones en el printdocument1, el primero es con un ciclo while:
Código:
while (vuelta < dataGridView1.RowCount)
            {
                
                
                e.Graphics.DrawString(dataGridView1.Rows[vuelta].Cells[0].Value.ToString(), new Font("Times New Roman", 10), Brushes.Black, x, y + 154);
                e.Graphics.DrawString(dataGridView1.Rows[vuelta].Cells[1].Value.ToString(), new Font("Times New Roman", 10), Brushes.Black, x + 260, y + 154);
                e.Graphics.DrawString(dataGridView1.Rows[vuelta].Cells[2].Value.ToString(), new Font("Times New Roman", 10), Brushes.Black, x + 620, y + 154);
                vuelta++;
                y += 35;
                if (y >= printDocument1.DefaultPageSettings.Bounds.Height - 300)
                {

                    y = printDocument1.DefaultPageSettings.Bounds.Y + 154;
                    e.HasMorePages = true;
                    pagina++;

                    break;
                }
            }
el cual simplemente imprime el listado de lo que hay en el reporte con el siguiente resultado:
(https://i.postimg.cc/VLwSZ0sL/Sin-t-tulo.png)
es decir.... se obtiene lo que se busca sin problema... aparentemente, ya que cuando imprimo fisicamente las hojas... me aparece asi:
(https://i.postimg.cc/X72VKrpP/Whats-App-Image-2021-07-14-at-4-38-33-PM.jpg)
es decir.... solo me aparecen las cabeceras y pie de pagina!! (para lo cual hay un codigo tmb, pero no lo anexé porque con ese no hay problema)

despues de eso intenté hacer el mismo codigo pero evitando el uso del while,asi que puse un bucle foreach en vez de while, ya que descubri que con foreach si me lo imprime fisicamente... anexo codigo
Código:
foreach (DataGridViewRow renglon in dataGridView1.Rows)
            {
                
                if (renglon.Index == dataGridView1.RowCount)
                    break;
                if (y >= printDocument1.DefaultPageSettings.Bounds.Height - 300)
                {

                  
                    e.HasMorePages = true;
                    pagina++;

                    break;
                }

                foreach (DataGridViewCell celda in renglon.Cells)
                {
                    e.Graphics.DrawString(celda.Value.ToString(), new Font("Times New Roman", 10), Brushes.Black, x, y + 154);
                    x += 300;
                }
                x = e.MarginBounds.Left + 5;
                y += 35;

y aunque este codigo si que funciona -ignoro porque el foreach si imprime el listado y el while no, a pesar de que en la previsualizacion si se ve el listado-, el problema con este pedazo de codigo es que si el reporte es de mas de una pagina, entra en un cliclo infinito ya que cuando se dispara de nueva cuenta el printdocument debido al e.hasmorepages=true, el contador del foreach del renglon se vuelve a posicionar a 0... y nunca termina de leer todos los registros, y tengo entendido que al foreach no se le puede asignar un valor inicial a sus variables... por lo que no me sirve.....
ya intenté poner un for en vez del foreach pero sucede exactamente lo mismo que con el while...
los codigos son exactamente los mismos, aplicados a su correspondiente bucle, pero no entiendo porque el while no funciona!!! alguien me puede ayudar? se supone que si el reporte lo guardara como un pdf, se guardaria con todo y sus registros asi como en la imagen, pero yo quiero imprimirlo fisicamente :s


Título: Re: problema de impresion printdocument y hasmorepages= windows forms c#
Publicado por: rulovive en 21 Julio 2021, 21:36 pm
hola nenes. actualizo el tema para notificar que ya lo he solucionado... el error estaba en el codigo del boton, no del bucle. Sucede que el printpreviewdialog y el printdialog disparaban ambos el printdocument, por lo que toda la informacion se perdia o se ciclaba, no lo se y no me interesa... el caso es que al eliminar el codigo para printpreview todo funcionó como debia....
me dan lastima y asco xD... pero para su escarmiento no pueden borrar esta respuesta porque en ella se encuentra la solución, y junto con ella el insulto hacia ustedes xd