Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] Imprimir mas de una hoja

Estas en el tema de Imprimir mas de una hoja en el foro de .NET en Foros del Web. Una pregunta rápida antes de entrar al tema. Como tomo el valor de la celda a la que le hice click en un datagridviw? Vi ...
  #1 (permalink)  
Antiguo 01/02/2013, 00:40
 
Fecha de Ingreso: enero-2013
Ubicación: Guayaquil - Ecuador
Mensajes: 17
Antigüedad: 9 años, 5 meses
Puntos: 0
Pregunta Imprimir mas de una hoja

Una pregunta rápida antes de entrar al tema. Como tomo el valor de la celda a la que le hice click en un datagridviw? Vi algo de e.RowIndex e.ColumnIndex pero no me funcionan.

Bueno ahora si recién uso este control por lo cual el código que les mostraré lo encontré por Internet y lo que mas o menos entendí lo modifiqué a mi gusto.

Código vb:
Ver original
  1. Sub RellenarEsp(ByVal str As String, ByVal columna As Int32)
  2.         Dim r As Int32
  3.         Dim cad As String = ""
  4.         Dim digito As Int32
  5.         ncadena = ""
  6.         Dim numcif As Int32 = str.Length
  7.  
  8.         Select Case columna
  9.             Case 0 : digito = 12
  10.             Case 1 : digito = 12
  11.             Case 2 : digito = 12
  12.         End Select
  13.         If numcif > digito Then
  14.             ncadena = Mid(str, 1, digito)
  15.         Else
  16.             For r = 1 To (digito - numcif)
  17.                 cad = " "
  18.                 ncadena = ncadena & cad
  19.             Next
  20.             ncadena = str & ncadena
  21.         End If
  22.     End Sub
  23.  
  24.     Sub RellenarEsp2(ByVal str As String, ByVal columna As Int32)
  25.         Dim r As Int32
  26.         Dim cad As String = ""
  27.         Dim digito As Int32
  28.         ncadena = ""
  29.         Dim numcif As Int32 = str.Length
  30.  
  31.         Select Case columna
  32.             Case 0 : digito = 12
  33.             Case 1 : digito = 12
  34.             Case 2 : digito = 12
  35.             Case 3 : digito = 12
  36.             Case 4 : digito = 12
  37.         End Select
  38.         If numcif > digito Then
  39.             ncadena = Mid(str, 1, digito)
  40.         Else
  41.             For r = 1 To (digito - numcif)
  42.                 cad = " "
  43.                 ncadena = ncadena & cad
  44.             Next
  45.             ncadena = str & ncadena
  46.         End If
  47.     End Sub
  48.  
  49.     Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
  50.         Dim linesPerPage As Single = 0
  51.         Dim yPos As Single = 0
  52.         Dim leftMargin As Single = 30
  53.         Dim topMargin As Single = e.MarginBounds.Top - 50
  54.         Dim line As String = Nothing
  55.         linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics)
  56.  
  57.         Dim Fil, Col As Int32
  58.         Dim LString As String = ""
  59.         LString = LString & "Contabilidad Mensual " & vbCrLf & vbCrLf & vbCrLf
  60.         LString = LString & "Fecha de impresión: " & Today & vbCrLf & vbCrLf & vbCrLf & _
  61.         "------------------------------------------------------------------------------------------------" & vbCrLf & vbCrLf & vbCrLf
  62.         LString = LString & "Estadías: " & ComboBox2.Text & "" & vbCrLf & vbCrLf & vbCrLf
  63.         LString = LString & "Tipo           Habitación     Total" & vbCrLf & vbCrLf
  64.         count = 0
  65.         For Fil = 0 To DataGridView2.Rows.Count - 1
  66.             For Col = 0 To DataGridView2.Columns.Count - 1
  67.                 Call RellenarEsp(DataGridView2.Item(Col, Fil).Value.ToString, Col)
  68.                 LString = LString & ncadena & Space(3)
  69.             Next
  70.             count += 1
  71.             LString = LString & vbCrLf
  72.         Next
  73.         LString = LString & "" & vbCrLf
  74.         LString = LString & "Total:     " & TextBox3.Text & "" & vbCrLf & vbCrLf & vbCrLf & _
  75.         "------------------------------------------------------------------------------------------------" & vbCrLf & vbCrLf & vbCrLf
  76.         LString = LString & "Reservas: " & ComboBox3.Text & "" & vbCrLf & vbCrLf & vbCrLf
  77.         LString = LString & "Tipo           Habitación     Depósito       Efectivo       Total" & vbCrLf & vbCrLf
  78.         count = 0
  79.         For Fil = 0 To DataGridView1.Rows.Count - 1
  80.             For Col = 0 To DataGridView1.Columns.Count - 1
  81.                 Call RellenarEsp2(DataGridView1.Item(Col, Fil).Value.ToString, Col)
  82.                 LString = LString & ncadena & Space(3)
  83.             Next
  84.             count += 1
  85.             LString = LString & vbCrLf
  86.         Next
  87.         LString = LString & "" & vbCrLf
  88.         LString = LString & "Depósitos: " & TextBox1.Text & "" & vbCrLf
  89.         LString = LString & "Efectivo:  " & TextBox2.Text & "" & vbCrLf
  90.         LString = LString & "Total:     " & TextBox4.Text & ""
  91.         yPos = topMargin + (count * printFont.GetHeight(e.Graphics))
  92.         e.Graphics.DrawString(LString, printFont, Brushes.Black, leftMargin, yPos, New StringFormat())
  93.         If Not (line Is Nothing) Then
  94.             e.HasMorePages = True
  95.         Else
  96.             e.HasMorePages = False
  97.         End If
  98.     End Sub
  99.  
  100. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  101.         If DataGridView2.Rows.Count > 0 And DataGridView1.Rows.Count > 0 Then
  102.             Try
  103.                 printFont = New Font("Courier new", 11)
  104.                 PrintPreviewDialog1.StartPosition = FormStartPosition.CenterParent
  105.                 PrintPreviewDialog1.Width = 600
  106.                 PrintPreviewDialog1.Height = 700
  107.                 PrintPreviewDialog1.ShowDialog()
  108.             Catch ex As Exception
  109.                 MessageBox.Show(ex.Message)
  110.             End Try
  111.         End If
  112.     End Sub

A lo que hago click en el botón se muestra la vista previa. Para probarlo por completo puse varios datos a ver si mostraba mas hojas pero solo me muestra una sin terminar.

Aquí una imagen para que entiendan mejor.



Espero puedan ayudarme para que la hoja se corte a la misma altura de arriba y continúe en la siguiente hoja aunque la altura en la parte de arriba de la hoja cuando se corta es mucha pero con poco datos se ve bien. Y por si acaso hay forma de poner una imagen en la esquina superior derecha y una en la esquina superior izquierda? Hay forma? Aunque si no se puede no hay problema solo sería para diseño.

Gracias por su atención.

Saludos.

Última edición por Allan2904; 01/02/2013 a las 03:45
  #2 (permalink)  
Antiguo 01/02/2013, 07:46
Avatar de Aquaventus  
Fecha de Ingreso: junio-2010
Ubicación: Lima-Peru , En el alba de la naturaleza
Mensajes: 2.105
Antigüedad: 12 años
Puntos: 267
Respuesta: Imprimir mas de una hoja

pues no te crea mas hojas porque tú declaras la siguiente variable :
Código vb:
Ver original
  1. Dim line As String = Nothing
después esa misma variable no la vuelves a utilizar, conservando su valor Nothing hasta llegar al siguiente código :
Código vb:
Ver original
  1. If Not (line Is Nothing) Then
  2.             e.HasMorePages = True
  3.         Else
  4.             e.HasMorePages = False
  5.         End If
pues obvio que le dice que no hay mas páginas y por eso siempre te queda 1, no hagas simple COPY-PASTE, analiza y averigua cual es la función que tiene cada cosa.
Con la siguiente línea obtienes la cantidad de lineas que puedes tener por página :
Código vb:
Ver original
  1. linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics)
luego necesitas averiguar cuantas líneas le has puesto manualmente y contando con el recorrido que haces a tu datagridview(en tu for) y compararlo si llega a la cantidad de lineas por página, si cumple puedes mandar el salto de página y guardar en una variable en la línea que se quedo para que en la proxima hoja empieze donde se quedó. Te dejo este ejemplo para que lo analizes. Saludos!.
Ejemplo :
Código vb:
Ver original
  1. 'Esta variable tiene que ser publica
  2. Dim linea As Integer = 1
  3.  
  4.  
  5. Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
  6. 'Definimos el tipo de fuente y de mas
  7. Dim Fuente As New Font("arial", 10)
  8. 'Definimos en que posicion se va iniciar la impresion
  9. Dim posicion As Integer = 20
  10. 'Contador de lineas que se van imprimiendo
  11. Dim lineaimpresa As Integer = 0
  12. 'Variable para ver cuando se va hacer un salto de pagina
  13. Dim salto_pagina As Boolean = False
  14. 'Variable para designar cuantos lineas se van a imprimir por hoja
  15. Dim NroLineasPagina As Integer = 70 For i = linea To 150
  16. e.Graphics.DrawString("Ejemplo de linea: " & linea, Fuente, Brushes.Black, 10, posicion)
  17. posicion += 15
  18. linea += 1
  19. lineaimpresa += 1
  20. If lineaimpresa = NroLineasPagina Then
  21. salto_pagina = True
  22. Exit For
  23. End If
  24. Next If salto_pagina = True Then
  25. e.HasMorePages = True
  26. Else
  27. e.HasMorePages = False
  28. End If
  29. End Sub
__________________
Internet es tener todo el conocimiento global a tu disposición.
Desarrollo de Software - Ejemplos .Net
  #3 (permalink)  
Antiguo 01/02/2013, 12:19
 
Fecha de Ingreso: enero-2013
Ubicación: Guayaquil - Ecuador
Mensajes: 17
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Imprimir mas de una hoja

Modifiqué un poco porque el código que pone carga una linea por cada repetición del for pero el mio era texto establecido y el for solo va cuando cargo las líneas de datagridview.

Entonces el código lo dejo así.

Código vb:
Ver original
  1. Dim posicion As Integer = 20
  2.         Dim lineaimpresa As Integer = 0
  3.         Dim leftMargin As Single = 30
  4.         Dim topMargin As Single = e.MarginBounds.Top - 50
  5.         Dim salto_pagina As Boolean = False
  6.         Dim Fil, Col As Int32
  7.         Dim LString As String = ""
  8.         Dim NroLineasPagina As Integer = 70
  9.         lineaimpresa += 1
  10.         LString = LString & "Hostal Mi Fantasía" & vbCrLf & vbCrLf & vbCrLf
  11.         lineaimpresa += 1
  12.         LString = LString & "Contabilidad Mensual " & vbCrLf & vbCrLf & vbCrLf
  13.         lineaimpresa += 1
  14.         LString = LString & "Fecha de impresión: " & Today & vbCrLf & vbCrLf & vbCrLf & _
  15.         "------------------------------------------------------------------------------------------------" & vbCrLf & vbCrLf & vbCrLf
  16.         lineaimpresa += 1
  17.         LString = LString & "Reservas: " & ComboBox2.Text & "" & vbCrLf & vbCrLf & vbCrLf
  18.         lineaimpresa += 1
  19.         LString = LString & "Tipo           Habitación     Depósito       Efectivo       Total" & vbCrLf & vbCrLf
  20.         count = 0
  21.         For Fil = 0 To DataGridView1.Rows.Count - 1
  22.             For Col = 0 To DataGridView1.Columns.Count - 1
  23.                 Call RellenarEsp2(DataGridView1.Item(Col, Fil).Value.ToString, Col)
  24.                 lineaimpresa += 1
  25.                 LString = LString & ncadena & Space(3)
  26.             Next
  27.             count += 1
  28.             If lineaimpresa >= NroLineasPagina Then
  29.                 salto_pagina = True
  30.             End If
  31.             If salto_pagina = True Then
  32.                 e.HasMorePages = True
  33.             Else
  34.                 e.HasMorePages = False
  35.             End If
  36.             lineaimpresa += 1
  37.             LString = LString & vbCrLf
  38.         Next
  39.         lineaimpresa += 1
  40.         LString = LString & "" & vbCrLf
  41.         lineaimpresa += 1
  42.         LString = LString & "Depósitos: " & TextBox1.Text & "" & vbCrLf
  43.         lineaimpresa += 1
  44.         LString = LString & "Efectivo:  " & TextBox2.Text & "" & vbCrLf
  45.         lineaimpresa += 1
  46.         LString = LString & "Total:     " & TextBox4.Text & ""
  47.         e.Graphics.DrawString(LString, printFont, Brushes.Black, leftMargin, posicion, New StringFormat())

Con esto se repite la misma hoja. Entendí que hiciste el problema es que la variable "i" que tu repites sumandole 1 en cada repetición también es la que presentas y es integer pero como te das cuenta en el mio no se repite ninguna linea por eso se me complicó.
También he de decirte que con el ejemplo que pusiste por si solo si continúa en las demás hojas pero aún asi se corta en la parte de abajo de la hoja y se saltan varios número entre las hojas.

Por cierto para no abrir otro tema como cojo el valor de la celda a la que le doy doble click? e.rowindex y e.columnindex no me funciona.

Gracias.

Saludos.
  #4 (permalink)  
Antiguo 01/02/2013, 12:42
Avatar de Aquaventus  
Fecha de Ingreso: junio-2010
Ubicación: Lima-Peru , En el alba de la naturaleza
Mensajes: 2.105
Antigüedad: 12 años
Puntos: 267
Respuesta: Imprimir mas de una hoja

Este bloque de código va fuera de tu for, al final de todo
Código vb:
Ver original
  1. If salto_pagina = True Then
  2.                 e.HasMorePages = True
  3.             Else
  4.                 e.HasMorePages = False
  5.             End If
Ahora necesariamente tiene que ser con doble click para obtener el valor? Saludos!.
__________________
Internet es tener todo el conocimiento global a tu disposición.
Desarrollo de Software - Ejemplos .Net
  #5 (permalink)  
Antiguo 01/02/2013, 13:12
 
Fecha de Ingreso: enero-2013
Ubicación: Guayaquil - Ecuador
Mensajes: 17
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Imprimir mas de una hoja

Sigue dando el mismo error y ya me está poniendo cabezón

No es necesario el doble click solo que a veces uno da un click por error pero con un solo click está bien.
  #6 (permalink)  
Antiguo 01/02/2013, 13:20
Avatar de Aquaventus  
Fecha de Ingreso: junio-2010
Ubicación: Lima-Peru , En el alba de la naturaleza
Mensajes: 2.105
Antigüedad: 12 años
Puntos: 267
Respuesta: Imprimir mas de una hoja

puedes obtenerlo de estas dos formas desde su evento CellClick del datagridview, ya tu ves con cual se te hace mas cómodo :
Código vb:
Ver original
  1. Dim x As String = dgSistema.Rows(e.RowIndex).Cells(e.ColumnIndex).Value.ToString()
  2. Dim y As String = dgSistema.CurrentRow.Cells(e.ColumnIndex).Value.ToString()
Saludos!.
__________________
Internet es tener todo el conocimiento global a tu disposición.
Desarrollo de Software - Ejemplos .Net
  #7 (permalink)  
Antiguo 01/02/2013, 13:33
 
Fecha de Ingreso: enero-2013
Ubicación: Guayaquil - Ecuador
Mensajes: 17
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Imprimir mas de una hoja

Perfecto! Muchas gracias por tu ayuda.

Saludos.

Etiquetas: access, hojas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:59.