| |
VB.NET - Fortgeschrittenegruppiertes drucken | | | Autor: ERBRU | Datum: 28.04.16 22:39 |
| Hallo Forum,
wer kann mir bei meinem Problem helfen?
habe 2 DGV' s gebunden, nun möchte ich daraus eine Liste drucken
1. DGV (Datasource) tbl_Meldungen
2. DGV (Datasource) tbl_Maßnahmen
nun möchte ich das drucken,
Meldung 1 .........
Maßnahme 1
Maßnahme 2
Maßnahme 3
Meldung 2 .........
Maßnahme 1
Maßnahme 2
Meldung 3 .........
Maßnahme 1
usw. | |
Re: gruppiertes drucken | | | Autor: Manfred X | Datum: 29.04.16 19:06 |
| Hallo!
Offenbar besteht eine 1:N-Master/Detail-Relation zwischen
den beiden geladenen Tabellen.
Was genau möchtest Du wissen?
Geht es um die Einrichtung bzw. die Nutzung einer Datarelation?
Verwendest Du eine Report-Bibliothek für den Ausdruck
oder willst Du die Druckroutine mit VB selbst erstellen?
Wie sehen die Elemente (Datentyp, Format) der zu druckenden Liste aus? | |
Re: gruppiertes drucken | | | Autor: ERBRU | Datum: 29.04.16 20:22 |
| Hallo Manfred!
OK ich versuche es mal, also:
2 DGV
1.) DGV 1 = Bindingsource(BS_TPMMeldung)
2.) DGV 2 = Bindingsource(BS_TPMMaßnahme)
Meldung hat eine Beziehung (Relation) zu Maßnahmen
nun möchte ich die drucken, über die Standard Druckroutine VB-2010
Report habe ich nicht in der Express version.
Der Druck soll ein Quer Format sein
Meldung 1
Maßnahme 1
Maßnahme 2
Meldung 2
Maßnahmen drunter, Gruppiert halt aber wie man das mit Datasource macht weiß ich nicht
wie soll man da Spalten, Zeilen, Schrifthöhe etc. ermitteln?
und den seitenwechsel bei mehr als eine Seite
kann man hier auch Bilder anhängen?
Beitrag wurde zuletzt am 29.04.16 um 20:24:19 editiert. | |
Re: gruppiertes drucken | | | Autor: Manfred X | Datum: 29.04.16 22:04 |
| Hallo!
Eine "Druckroutine" gibt es nicht, aber Klassen, die
Ereignisse auslösen durch die - als Parameter gegebenem - Graphics-Objekt
ein Ausdruck frei gestaltet werden kann.
Das Seitenformat wird neben anderem über den PrintDialog ausgewählt.
Der Größenbedarf für Druckelemente kann über die MeasureString-Methode
des Graphics-Objekts ermittelt werden.
Druckseiten werden über die Berechnung des Platzbedarfs der Elemente
ermittelt und durch die "HasMorePages"-Eigenschaft des Eventparameters
an die Printklasse die Info übermittelt, ob der Ausdruck bereits beendet ist.
Beispiel | |
Re: gruppiertes drucken | | | Autor: ERBRU | Datum: 30.04.16 07:47 |
| Danke für das Beispiel, bezieht sich aber nur auf eine TextBox
ich habe aber eine DGV bzw. Datasource da muss ich wohl alles Zufuss machen
Beispiel Zeilen_Spalten der (DGV) ermitteln
nur so wie unten im Code, geht das nicht da meine 2 DGV unter Kopfzeile soll
Private Sub PD_Streifenliste_Zeilen_Spalten_Ermitteln()
Dim ImageWall As Bitmap
ImageWall = New Bitmap(CInt(rect_Druckbereich.Width), CInt( _
rect_Druckbereich.Height))
Using g As Graphics = Graphics.FromImage(ImageWall)
g.PageUnit = GraphicsUnit.Display
DruckSeite = 1
Dim DGV_Font As Font = New System.Drawing.Font("Tahoma", 8.25!, _
System.Drawing.FontStyle.Regular, _
System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Dim ZellInhalt As String
Dim Höhe As Integer = 0
Dim maxHöhe As Integer = 0
Dim Breite As Single = rect_Druckbereich.Width
ZeilenHoehen.Clear()
SpaltenBreiten.Clear()
'relativ feste Breiten
Dim w1 As Single = g.MeasureString("-0000-", DGV_Font).Width _
'MeldeID
Dim w2 As Single = g.MeasureString("-Erstellt am-", DGV_Font).Width _
'Erstelldatum
Dim w3 As Single = g.MeasureString( _
"-Problem-Problembeschreibung-Meldung-Problem-Problembeschreibung-"_
, DGV_Font).Width 'Meldetext
Dim w4 As Single = g.MeasureString("-TPM-Karte-", DGV_Font).Width _
'TPM-Karte
Dim w5 As Single = g.MeasureString( _
"-SLS-GC-H6-Linie-FB-CM-9393906-", DGV_Font).Width 'Maschine,Anlage
Dim w6 As Single = g.MeasureString("-Ort-", DGV_Font).Width 'Ort,
' Halle
Dim w7 As Single = g.MeasureString("-Anrede-Name,Vorname-", _
DGV_Font).Width 'Name Melder
Dim w8 As Single = g.MeasureString("-dd.MM.YYYY-", DGV_Font).Width _
'Datum abgestellt
Dim w9 As Single = g.MeasureString("-erledigt-", DGV_Font).Width _
'OK, Problem abgestellt
Dim wG As Single = w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9
Dim PrzSatz As Single = (wG / Breite) * 100
'restliche 3 Spaltenbreiten dritteln
Dim drittelPrzSatz As Single = (100 - PrzSatz) / 3
Dim drittelBreite As Single = (drittelPrzSatz * Breite) / 100
SpaltenBreiten.Add(w1) 'MeldeID
SpaltenBreiten.Add(w2) 'Erstelldatum
SpaltenBreiten.Add(w3) 'Meldetext
SpaltenBreiten.Add(w4) 'TPM-Karte
SpaltenBreiten.Add(w5) 'Maschine,Anlage
SpaltenBreiten.Add(w6) 'Ort
SpaltenBreiten.Add(w7) 'Melder
SpaltenBreiten.Add(w8) 'Datum abgestellt
SpaltenBreiten.Add(w9) 'OK abgearbeitet, abgestellt
'
Dim curr_Zelle As DataGridViewCell = Nothing
Dim ZellBox As New RectangleF
Dim sfmt As New StringFormat
sfmt = StringFormat.GenericDefault
sfmt.Alignment = StringAlignment.Center
sfmt.LineAlignment = StringAlignment.Center
Dim ZeilenHöhe As Single = g.MeasureString("[Wü gq*µ']", _
DGV_Font).Height
Dim charactersFitted, linesFilled As Integer
Dim tmp_size As New SizeF
Dim gsize As New SizeF
Dim aktHöhe As Integer
For DGVZeile As Integer = 0 To DGV.Rows.Count - 1
maxHöhe = 0
Höhe = 0
For DGVSpalte As Integer = 0 To DGV.Columns.Count - 1
curr_Zelle = DGV.Rows(DGVZeile).Cells(DGVSpalte)
ZellInhalt = curr_Zelle.FormattedValue.ToString
'Höhenmessung
tmp_size.Width = SpaltenBreiten(DGVSpalte)
tmp_size.Height = rect_Druckbereich.Height
'Anzahl benötigter Zeilen ermitteln (linesFilled)
gsize = g.MeasureString(ZellInhalt, DGV_Font, tmp_size, _
sfmt, charactersFitted, linesFilled)
aktHöhe = CInt(Math.Ceiling((ZeilenHöhe * linesFilled)))
Höhe = Math.Max(Höhe, aktHöhe)
maxHöhe = Math.Max(Höhe, maxHöhe)
Next
ZeilenHoehen.Add(maxHöhe + 2)
Next
DGV_Font.Dispose()
sfmt.Dispose()
curr_Zelle.Dispose()
End Using
ImageWall.Dispose()
End Sub | |
Re: gruppiertes drucken (Beispiel) | | | Autor: Manfred X | Datum: 30.04.16 12:23 |
| Imports System.Drawing.Printing
Public Class frmGridPrint
Dim ds As New DataSet
Dim dtMeld As New DataTable
Dim dtMass As New DataTable
Dim WithEvents pd As New PrintDocument
Dim printlines As New List(Of String)
Dim pdia As New PrintDialog
Private Sub frmGridPrint_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
With dtMeld
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Meld", GetType(String))
.PrimaryKey = {.Columns(0)}
For i As Integer = 0 To 20
.Rows.Add(i, "Meld" & CStr(i))
Next i
End With
With dtMass
.Columns.Add("ID", GetType(Integer))
.Columns.Add("MeldID", GetType(Integer))
.Columns.Add("Mass", GetType(String))
.PrimaryKey = {.Columns(0)}
Dim id As Integer, mz As Integer
Dim rndm As New Random(123)
For i As Integer = 0 To dtMeld.Rows.Count - 1
mz = rndm.Next(0, 10)
For k As Integer = 1 To mz
id += 1
.Rows.Add(id, i, "Meld" & CStr(i) & "-Mass" & CStr(k))
Next k
Next i
End With
ds.Tables.Add(dtMeld) : ds.Tables.Add(dtMass)
Dim dr As New DataRelation _
("MeldMass", dtMeld.Columns("ID"), dtMass.Columns("MeldID"), True)
ds.Relations.Add(dr)
Dim cr() As DataRow
With dtMeld
For i As Integer = 0 To .Rows.Count - 1
'printlines.Add(" ")
printlines.Add(.Rows(i).Item("Meld").ToString)
cr = .Rows(i).GetChildRows("MeldMass")
For k As Integer = 0 To cr.Length - 1
printlines.Add(" --> " & cr(k).Item("Mass").ToString)
Next k
Next i
End With
pdia.ShowDialog()
pd.Print()
End Sub
Private Sub pd_PrintPage(sender As Object, _
e As System.Drawing.Printing.PrintPageEventArgs) Handles pd.PrintPage
Static linecounter As Integer = -1
Static pagecounter As Integer = 0
Static lineheight As Integer
pagecounter += 1
Dim linefont As New Font("Arial", 10)
Dim pageheight As Integer = e.MarginBounds.Height
Dim pagewidth As Integer = e.MarginBounds.Width
Dim br As New SolidBrush(Color.Black)
Dim pageend As Boolean = False
Dim posy As Integer = e.MarginBounds.Top
Dim sz As SizeF
Do
linecounter += 1
If linecounter = 0 Then
sz = _
e.Graphics.MeasureString(printlines(linecounter), linefont, _
pagewidth)
lineheight = CInt(Math.Ceiling(sz.Height))
End If
posy += lineheight
If posy + lineheight <= e.MarginBounds.Height Then
sz = _
e.Graphics.MeasureString(printlines(linecounter), linefont, _
pagewidth)
lineheight = CInt(Math.Ceiling(sz.Height))
Dim lr As New Rectangle(e.MarginBounds.Left, posy, CInt( _
sz.Width), lineheight)
e.Graphics.DrawString _
(printlines(linecounter), linefont, br, lr)
Else
linecounter -= 1
pageend = True
End If
Loop While Not pageend AndAlso linecounter < printlines.Count - 1
br.Dispose()
e.HasMorePages = linecounter < printlines.Count - 1
End Sub
End Class | |
Re: gruppiertes drucken (Beispiel) | | | Autor: ERBRU | Datum: 30.04.16 13:17 |
| Super Manfred,
das Beispiel ist ja Klasse, denke da kann ich drauf bauen muss es ja nun an meine Gegebenheiten anpassen.
Danke, Danke! | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|