sardin3s Posted June 21, 2012 Report Share Posted June 21, 2012 (edited) Boa tarde. Preciso imenso da vossa ajuda. Estou a criar um relatório em vb.net no Visual Basic 2010 Express, que basicamente apenas me imprime os dados de uma Listview. Acontece que não consigo programar a página actual e o total de páginas do relatório. Alguém me consegue ajudar? Segue abaixo o código! #Region "Print related declarations" Protected WithEvents pd As Printing.PrintDocument Protected Ratio As Single = 0, CurrRow As Integer = 0 #End Region #Region "Simple Printing of ListView" ''' ''' ''' Public Sub Print() pd = New Printing.PrintDocument pd.DocumentName = "Encomenda " & Now.Year & Now.Month & Now.Day & Now.Hour & Now.Minute & Now.Second Ratio = 1 CurrRow = 0 PrintDialog1.Document = pd If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.Cancel Then Else pd.Print() End If End Sub ''' ''' ''' Public Sub PrintPreview() pd = New Printing.PrintDocument pd.DocumentName = "Impressão da encomenda: " & Numero_Pedido Ratio = 1 CurrRow = 0 Dim ppv As New PrintPreviewDialog ppv.Document = pd ppv.MdiParent = Index ppv.Height = 600 ppv.Width = 400 ppv.Show() End Sub Private Sub pd_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles pd.PrintPage Dim Linha_Colorir As Integer = 0 Dim Pagina_Atual, Pagina_Total As Integer Dim c As ColumnHeader Dim g As Graphics = e.Graphics Dim l As Integer = 9 'Alinhamento Vertical Dim iCount As Integer Dim f As New Font("Microsoft Sans Serif", 9, FontStyle.Regular) Dim D_Font As New Font("Verdana", 14, FontStyle.Bold, GraphicsUnit.Point) Dim D_Font2 As New Font("Microsoft Sans Serif", 10, FontStyle.Regular) Dim b As Brush = Brushes.Black Dim currentY As Integer = 0, maxY As Integer = 0 'Altura do cabeçalho para os valores Dim gap As Integer = 1 'Espaçamento horizontal das linhas dos dados Dim lvsi As ListViewItem.ListViewSubItem Dim colLefts(ListView1.Columns.Count) As Integer, colWidths(ListView1.Columns.Count) As Integer, idx As Integer = 0, ii As Integer Dim lr As RectangleF e.HasMorePages = False currentY = 75 'Vertical de cima currentY += maxY + gap g.DrawLine(Pens.SlateGray, 0, currentY, e.PageBounds.Width, currentY) currentY += gap For Each c In ListView1.Columns maxY = Math.Max(maxY, g.MeasureString(c.Text, f, c.Width).Height) colLefts(idx) = l colWidths(idx) = c.Width lr = New RectangleF(colLefts(idx), currentY, colWidths(idx), maxY) g.DrawString(c.Text, f, b, lr) l += c.Width idx += 1 Next currentY += maxY + gap g.DrawLine(Pens.SlateGray, 0, currentY, e.PageBounds.Width, currentY) currentY += gap 'Rows iCount = ListView1.Items.Count - 1 For ii = CurrRow To iCount If (currentY + maxY + maxY) > e.PageBounds.Height - 60 Then 'Salta para outra linha CurrRow = ii - 1 e.HasMorePages = True Exit For 'Próxima Página End If l = 0 maxY = 0 ' Distância de linhas idx = 0 For Each lvsi In ListView1.Items(ii).SubItems maxY = Math.Max(maxY, g.MeasureString(lvsi.Text, f, colWidths(idx)).Height) lr = New RectangleF(colLefts(idx), currentY, colWidths(idx), maxY) If Linha_Colorir Mod 2 = 0 Then g.FillRectangle(Brushes.LightGray, colLefts(idx), currentY, colWidths(idx), maxY) g.DrawString(lvsi.Text, f, b, lr) idx += 1 Next Linha_Colorir = Linha_Colorir + 1 currentY += maxY + gap Next g.DrawLine(Pens.SlateGray, 0, 1090, e.PageBounds.Width, 1090) g.DrawString("Data de Impressão: " & DateTime.Now, D_Font2, Brushes.Black, 20, 1100) g.DrawString("Página " & Pagina_Atual & " de " & Pagina_Total, D_Font2, Brushes.Black, 650, 1100) End Sub #End Region Ficaria muito grato se alguém me poder ajudar. 😞 Edited June 26, 2012 by sardin3s Link to comment Share on other sites More sharing options...
sardin3s Posted June 25, 2012 Author Report Share Posted June 25, 2012 up Link to comment Share on other sites More sharing options...
sardin3s Posted June 26, 2012 Author Report Share Posted June 26, 2012 (edited) Consegui resolver esta situação como a implementação de um código manhoso. O tópico fica resolvido, no entanto deixo aqui o código, não vá alguém precisar 😉 #Region "Print related declarations" Protected WithEvents pd As Printing.PrintDocument Protected Ratio As Single = 0, CurrRow As Integer = 0 #End Region #Region "Simple Printing of ListView" ''' ''' ''' Public Sub Print() Listview_Width() Calcula_Total() pd = New Printing.PrintDocument pd.DocumentName = "Encomenda " & Now.Year & Now.Month & Now.Day & Now.Hour & Now.Minute & Now.Second Ratio = 1 CurrRow = 0 PrintDialog1.Document = pd If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.Cancel Then Else pd.Print() End If End Sub ''' ''' ''' Public Sub PrintPreview() Listview_Width() Calcula_Total() pd = New Printing.PrintDocument pd.DocumentName = "Impressão da encomenda: " & Numero_Pedido Ratio = 1 CurrRow = 0 Dim ppv As New PrintPreviewDialog ppv.Document = pd ppv.MdiParent = Index ppv.Height = 600 ppv.Width = 400 ppv.Show() End Sub Private Sub Calcula_Total() Dim total As Decimal = 0D For Each item As ListViewItem In ListView1.Items total += IIf(IsNumeric(item.SubItems(8).Text), item.SubItems(8).Text, 0) Next Total_Encomenda = total End Sub Private Sub pd_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles pd.PrintPage Dim Linha_Colorir As Integer = 0 Dim Pagina_Total As Integer = 1 Dim c As ColumnHeader Dim g As Graphics = e.Graphics Dim l As Integer = 9 'Alinhamento Vertical Dim iCount As Integer Dim f As New Font("Microsoft Sans Serif", 9, FontStyle.Regular) Dim D_Font As New Font("Verdana", 18, FontStyle.Bold, GraphicsUnit.Point) Dim D_Font2 As New Font("Microsoft Sans Serif", 10, FontStyle.Regular) Dim b As Brush = Brushes.Black Dim currentY As Integer = 0, maxY As Integer = 0 'Altura do cabeçalho para os valores Dim gap As Integer = 5 'Espaçamento horizontal das linhas dos dados Dim lvsi As ListViewItem.ListViewSubItem Dim colLefts(ListView1.Columns.Count) As Integer, colWidths(ListView1.Columns.Count) As Integer, idx As Integer = 0, ii As Integer Dim lr As RectangleF paginaAtual = 1 e.HasMorePages = False currentY = 55 'Vertical de cima currentY += maxY + gap g.DrawLine(Pens.SlateGray, 0, currentY, e.PageBounds.Width, currentY) currentY += gap 'g.DrawImage(Image.FromFile(My.Application.Info.DirectoryPath & "\Images\logo.png"), 9, 10) g.DrawString("Nome", D_Font, Brushes.Black, 9, 10) 'g.DrawString("Nome", D_Font, Brushes.Black, 30, 30) For Each c In ListView1.Columns maxY = Math.Max(maxY, g.MeasureString(c.Text, f, c.Width).Height) colLefts(idx) = l colWidths(idx) = c.Width lr = New RectangleF(colLefts(idx), currentY, colWidths(idx), maxY) g.DrawString(c.Text, f, b, lr) l += c.Width idx += 1 Next currentY += maxY + gap g.DrawLine(Pens.SlateGray, 0, currentY, e.PageBounds.Width, currentY) currentY += gap 'Rows iCount = ListView1.Items.Count - 1 For ii = CurrRow To iCount If (currentY + maxY + maxY) > e.PageBounds.Height - 100 Then 'Salta para outra linha CurrRow = ii - 1 e.HasMorePages = True Exit For 'Próxima Página End If l = 0 maxY = 0 ' Distância de linhas idx = 0 For Each lvsi In ListView1.Items(ii).SubItems maxY = Math.Max(maxY, g.MeasureString(lvsi.Text, f, colWidths(idx)).Height) lr = New RectangleF(colLefts(idx), currentY, colWidths(idx), maxY) If Linha_Colorir Mod 2 = 0 Then g.FillRectangle(Brushes.LightGray, colLefts(idx), currentY, colWidths(idx), maxY) g.FillRectangle(Brushes.LightGray, 9, currentY + 15, 155, maxY - 15) End If g.DrawString(lvsi.Text, f, b, lr) idx += 1 Next Linha_Colorir = Linha_Colorir + 1 currentY += maxY + gap Next If ListView1.Items.Count - 1 < 47 Then Pagina_Total = 1 If ListView1.Items.Count - 1 > 45 And ListView1.Items.Count - 1 < 91 Then Pagina_Total = 2 If ListView1.Items.Count - 1 > 90 Then Pagina_Total = ((ListView1.Items.Count - 1) / 46) + 1 If Pagina_Total = paginaAtual Then g.FillRectangle(Brushes.SlateGray, 510, currentY, 287, 17) g.DrawString("Total aproximado da encomenda: " & Total_Encomenda & " €", D_Font2, Brushes.White, 510, currentY) End If g.DrawLine(Pens.SlateGray, 0, 1090, e.PageBounds.Width, 1090) g.DrawString("Data de Impressão: " & DateTime.Now, D_Font2, Brushes.Black, 20, 1100) g.DrawString("Artigos Encomendados: " & ListView1.Items.Count, D_Font2, Brushes.Black, 330, 1100) g.DrawString("Página " & paginaAtual & " de " & Pagina_Total, D_Font2, Brushes.Black, 650, 1100) paginaAtual += 1 End Sub #End Region Edited June 26, 2012 by Caça Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now