sardin3s Posted June 21, 2012 at 05:26 PM Report Share #464673 Posted June 21, 2012 at 05:26 PM (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 at 04:28 PM by sardin3s Link to comment Share on other sites More sharing options...
sardin3s Posted June 25, 2012 at 09:20 AM Author Report Share #465314 Posted June 25, 2012 at 09:20 AM up Link to comment Share on other sites More sharing options...
sardin3s Posted June 26, 2012 at 04:25 PM Author Report Share #465717 Posted June 26, 2012 at 04:25 PM (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 at 04:26 PM 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