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;
}
}
es decir.... se obtiene lo que se busca sin problema... aparentemente, ya que cuando imprimo fisicamente las hojas... me aparece asi:
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