vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
gruppiertes 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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel