Mit unten aufgeführten Klassenmodul PrintListviewClass lässt sich der Inhalt eines ListView-Steuerelement auf dem Drucker ausgeben. Schriftfarbe, Textausrichtung, GridLines, Hintergrundfarbe usw. werden direkt aus dem ListView übernommen. Die Klasse PrintListView hat folgende Eigenschaften:
Weiterhin verfügt die Klasse über folgende Methoden:
Das Klassenmodul "PrintListView Erstellen Sie ein neues WindowsForms-Projekt und fügen dem Projekt ein neues leeres Klassenmodul mit folgendem Code hinzu: Imports System.Drawing Imports System.Windows.Forms Public Class PrintListView Private LV As ListView Private SpaltenBreite As New List(Of Integer) Private TextHöhe As Integer Private OffsetSpalte As Integer Private OffsetZeile As Integer Private MerkerSpalte As Integer Private MerkerZeile As Integer Public HeaderColor As System.Drawing.Color = Color.LightGray Private WithEvents PD As New System.Drawing.Printing.PrintDocument Private PrintPrev As New System.Windows.Forms.PrintPreviewDialog Private asc As SizeColumn = SizeColumn.None Public Enum SizeColumn None ScretchColumn AutoSitze End Enum Public Property AutoSizeColumn() As SizeColumn Get Return asc End Get Set(ByVal value As SizeColumn) asc = value SizeColums() End Set End Property Public Property Landscape() As Boolean Get Return PD.DefaultPageSettings.Landscape End Get Set(ByVal value As Boolean) PD.DefaultPageSettings.Landscape = value SizeColums() End Set End Property Private Sub SizeColums() Dim breite As Integer Dim g As Graphics = LV.CreateGraphics Dim zähler As Integer SpaltenBreite.Clear() Select Case asc Case SizeColumn.None, SizeColumn.ScretchColumn For Each CH As Windows.Forms.ColumnHeader In LV.Columns SpaltenBreite.Add(CH.Width) Next Case SizeColumn.AutoSitze, SizeColumn.ScretchColumn If asc = SizeColumn.AutoSitze Then For Each CH As Windows.Forms.ColumnHeader In LV.Columns breite = g.MeasureString(CH.Text, LV.Font).Width + 20 SpaltenBreite.Add(breite) Next End If For Each LVI As ListViewItem In LV.Items zähler = 0 breite = g.MeasureString(LVI.Text, LV.Font).Width + 20 If asc = SizeColumn.AutoSitze Then SpaltenBreite.Add(breite) If SpaltenBreite(zähler) + 20 < breite Then SpaltenBreite(zähler) = breite For Each LVSI As ListViewItem.ListViewSubItem In LVI.SubItems breite = g.MeasureString(LVSI.Text, LV.Font).Width + 20 If SpaltenBreite(zähler) + 20 < breite Then SpaltenBreite(zähler) = breite zähler += 1 Next Next End Select End Sub Public Sub New() End Sub Public Sub New(ByVal ListViewToPrint As ListView) LV = ListViewToPrint Dim g As Graphics = LV.CreateGraphics TextHöhe = g.MeasureString("XyZ1!", LV.Font).Height + 5 SizeColums() SpaltenBreite.Add(0) g.Dispose() End Sub Public Sub Print() PD.Print() End Sub Public Sub Preview() PrintPrev.Document = PD PrintPrev.WindowState = FormWindowState.Maximized PrintPrev.ShowDialog() End Sub Private Sub PD_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PD.PrintPage e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias Dim left As Decimal = PD.DefaultPageSettings.Margins.Left Dim right As Decimal = PD.DefaultPageSettings.Margins.Right Dim top As Decimal = PD.DefaultPageSettings.Margins.Top Dim bottom As Decimal = PD.DefaultPageSettings.Margins.Bottom Dim PageWidth As Integer = PD.DefaultPageSettings.Bounds.Width - (right + left) Dim PageHeight As Decimal = PD.DefaultPageSettings.Bounds.Height - (top + bottom) Dim sf As New StringFormat sf.Alignment = StringAlignment.Near sf.LineAlignment = StringAlignment.Center Dim rf As New Rectangle Dim br As SolidBrush Dim br1 As SolidBrush Dim PosX As Integer = left Dim PosY As Integer = top Dim OffsetSpalte As Integer Dim OffsetZeile As Integer ' Header schreiben Do rf = New Rectangle(PosX, PosY, SpaltenBreite(OffsetSpalte + MerkerSpalte), TextHöhe) e.Graphics.FillRectangle(New SolidBrush(HeaderColor), rf) If LV.GridLines Then e.Graphics.DrawRectangle(Pens.Black, rf.X, rf.Y, rf.Width, rf.Height) e.Graphics.DrawString(LV.Columns(OffsetSpalte + MerkerSpalte).Text, LV.Font, Brushes.Black, rf, sf) PosX += SpaltenBreite(OffsetSpalte + MerkerSpalte) OffsetSpalte += 1 Loop Until PageWidth + left < PosX + SpaltenBreite(OffsetSpalte + MerkerSpalte) Or OffsetSpalte + MerkerSpalte > LV.Columns.Count - 1 PosX = left OffsetSpalte = 0 OffsetZeile = 0 Do OffsetZeile = 0 PosY = top + TextHöhe Do If (LV.Items(OffsetZeile + MerkerZeile).SubItems.Count > OffsetSpalte + MerkerSpalte) Then rf = New Rectangle(PosX, PosY, SpaltenBreite(OffsetSpalte + MerkerSpalte), TextHöhe) If LV.Items(OffsetZeile + MerkerZeile).UseItemStyleForSubItems = True Then br = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).BackColor) br1 = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).ForeColor) Else br = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).SubItems(OffsetSpalte + MerkerSpalte).BackColor) br1 = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).SubItems(OffsetSpalte + MerkerSpalte).ForeColor) End If e.Graphics.FillRectangle(br, rf) If LV.GridLines Then e.Graphics.DrawRectangle(New Pen(LV.ForeColor), rf) Select Case LV.Columns(OffsetSpalte + MerkerSpalte).TextAlign Case HorizontalAlignment.Center sf.Alignment = StringAlignment.Center Case HorizontalAlignment.Left sf.Alignment = StringAlignment.Near Case HorizontalAlignment.Right sf.Alignment = StringAlignment.Far End Select e.Graphics.DrawString(LV.Items(OffsetZeile + MerkerZeile).SubItems(OffsetSpalte + MerkerSpalte).Text, LV.Font, br1, rf, sf) End If PosY += TextHöhe OffsetZeile += 1 Loop Until PageHeight + top < PosY + TextHöhe Or OffsetZeile + MerkerZeile >= LV.Items.Count PosX += SpaltenBreite(OffsetSpalte + MerkerSpalte) OffsetSpalte += 1 Loop Until PageWidth + left < PosX + SpaltenBreite(OffsetSpalte + MerkerSpalte) Or OffsetSpalte + MerkerSpalte >= LV.Columns.Count If OffsetSpalte + MerkerSpalte = LV.Columns.Count And OffsetZeile + MerkerZeile = LV.Items.Count Then e.HasMorePages = False MerkerZeile = 0 MerkerSpalte = 0 OffsetSpalte = 0 OffsetZeile = 0 Exit Sub End If If OffsetZeile + MerkerZeile < LV.Items.Count Then MerkerZeile = OffsetZeile + MerkerZeile e.HasMorePages = True Exit Sub End If If MerkerSpalte = OffsetSpalte < LV.Columns.Count Then MerkerSpalte = OffsetSpalte + MerkerSpalte MerkerZeile = 0 e.HasMorePages = True Exit Sub End If End Sub End Class Beispiel-Anwendung:
Fügen Sie folgenden Code in den Codeteil der Form1 ein: Public Class Form1 Private PrintListView As New ClassLibrary1.PrintListView Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Listview mit "Daten" füllen... ListView1.View = View.Details Dim x As Integer Dim y As Integer For x = 0 To 15 ListView1.Columns.Add("Spalte" & x.ToString) Next ListView1.Columns(5).TextAlign = HorizontalAlignment.Right ListView1.Columns(5).Width = 200 For y = 0 To 40 ListView1.Items.Add("Zeile" & y.ToString & " / Spalte1") If y Mod 2 = 0 Then ListView1.Items(y).BackColor = Color.LightGray For x = 1 To 15 ListView1.Items(y).SubItems.Add("Zeile" & y.ToString & " / Spalte" & x.ToString) Next Next ListView1.Items(3).ForeColor = Color.Blue ListView1.Items(7).UseItemStyleForSubItems = False ListView1.Items(7).SubItems(1).ForeColor = Color.Red ListView1.GridLines = True PrintListView = New ClassLibrary1.PrintListView(ListView1) PrintListView.AutoSizeColumn = PrintListView.SizeColumn.AutoSitze PrintListView.HeaderColor = Color.LightBlue End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Vorschau anzeigen.... und drucken... PrintListView.Preview() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ' ohne Vorschau drucken PrintListView.Print() End Sub End Class Dieser Tipp wurde bereits 29.689 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
vb@rchiv CD Vol.6 Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats Dezemeber 2024 Roland Wutzke MultiSort im ListView-Control Dieses Beispiel zeigt, wie sich verschiedene Sortierfunktionen für ein ListView Control realisieren lassen. Neu! sevEingabe 3.0 Einfach stark! Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |