none
Drucken, WindowsForms RRS feed

  • Frage

  • Hallo,

    mich plagt ein vermutlich für euch völlig alltägliches Problem: Drucken eines Forms,

    auf dem sich ein dataGridview (mit verticalScrollBar) befindet.

    - ich habe eine Datenbank *.mdb

    - aus dieser selektiere ich nach vorgegebenen Kriterien  Datensätze

    - die gefundenen Datensätze schreibe ich in eine DataTable dt.

    - um das Ergebnis der Selektion anzuzeigen, öffne ich ein neues FormX

    - diesem FormX übergebe ich die DataTable dt, einige strings mit den Auswahlkriterien

      und die Zahl der gefundenen Datensätze

    - das FormX hat einen Label mit der Überschrift, eine labelZeile mit den Kriterien

    - dann das dataGridView, mit verticalScrollbar, der Titelzeile mit den Namen der ColumnsHeader

      und dann von 1 bis etwa 500 Zeilen

    - die Fußzeile ist ein label mit der ZeilenZahl und dem akt. Datum

    - dazu einen Button Drucken und einen Button Zurück.

    Bis daher geht alles wunderbar. Aber jetzt bin ich chancenlos, obwohl ich schon mindestens 50

    Seiten in der Literatur/MSDN usw gelesen habe. Alles was ich will ist, das FormX einfach 1:1 

    (ohne Buttons) auf ein Querformat A4 ausdrucken.

    Wer kann mir zielgerichtet Unterlagen/Literatur/CodeZeilen usw. nennen, damit ich wenigstens einmal einen Einstieg

    in das Drucken schaffe (Drucker auswählen, Seitenlayout, usw)?

    Arbeite mit XP Pro, Visual C#2008EXPRESS.

    Vielen Dank !!

    Hermann

     

     

    Samstag, 17. April 2010 10:14

Antworten

  • Hallo Hermann,

    ich habe Dir das Grundgerüst fertig programmiert. Es werden hier 3 Testzeilen ausgedruckt.

    Du musst dann nur noch Deine Textboxen anstelle einsetzen. Bitte nimm das von mir zuletzt genannte

    Beispiel und ersetze die ganze Prozedur pdoc_PrintPage gegen diese hier.

    Du hast jetzt alles rund um's Drucken

    - Seitenvorschau

    - Seiten Einstellung

    - Druck Dialog

    Viel Spaß und schöne Grüße

    Ellen

    P.S. sorry, dass ich kein C# mache. Nur VB

    Link zum msdn Sample   http://msdn.microsoft.com/de-de/library/54z247f9(VS.80).aspx 

     ''' <summary>
     ''' Überarbeitung vom msdn Sample Printing. Ellen Ramcke 2010
     ''' </summary>
     Private Sub pdoc_PrintPage(ByVal sender As Object, _
        ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
        Handles PrintDocument1.PrintPage
    
    
     ' Die für den Druckvorgang benötigte Schriftart initialisieren.
     Dim font As New Font("Microsoft Sans Serif", 14)
     Dim font2 As New Font("Microsoft Sans Serif", 24)
    
     Dim intPrintAreaHeight, intPrintAreaWidth, marginLeft, marginTop As Int32
     With PrintDocument1.DefaultPageSettings
      ' Lokale Variablen initialisieren, die die Begrenzungen des 
      ' Druckbereichrechtecks enthalten.
      intPrintAreaHeight = .PaperSize.Height - .Margins.Top - .Margins.Bottom
      intPrintAreaWidth = .PaperSize.Width - .Margins.Left - .Margins.Right
    
      ' Lokale Variablen initialisieren, die die Randwerte enthalten, die als 
      ' X- und Y-Koordinaten für die oberen linke Ecke des 
      ' Druckbereichrechtecks verwendet werden.
      marginLeft = .Margins.Left ' X-Koordinate
      marginTop = .Margins.Top ' Y-Koordinate
     End With
    
     ' Wenn der Benutzer Querformat auswählt, Höhe und Breite des 
     ' Druckbereichs vertauschen.
     If PrintDocument1.DefaultPageSettings.Landscape Then
      Dim intTemp As Int32
      intTemp = intPrintAreaHeight
      intPrintAreaHeight = intPrintAreaWidth
      intPrintAreaWidth = intTemp
     End If
     ' Ermittlung der Height und Width wird nachfolgend nicht benutzt:
    
     
     'Ausgabe von drei Testzeilen an die Position 50,50 / 50,100 und 50/130
     '
     e.Graphics.DrawString("Test Text Zeile #1", font2, Brushes.Black, 50, 50)
     e.Graphics.DrawString("Test Text Zeile #2", font, Brushes.Black, 50, 100)
     e.Graphics.DrawString("Test Text Zeile #3", font, Brushes.Black, 50, 130)
    
     ' keine weitere Seite ausdrucken
     e.HasMorePages = False
     
     End Sub
    • Als Antwort markiert Hermann-Sbg Mittwoch, 5. Mai 2010 09:46
    • Bearbeitet Ellen Ramcke Mittwoch, 5. Mai 2010 10:12 link eingefügt
    Mittwoch, 21. April 2010 10:38
  • Hallo Hermann,

    hier ein Beispiel einer sehr einfachen Methode.

    Public Class Form1
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '###############################################################'
        '# video zu diesem Code http://www.youtube.com/watch?v=6OuNXxSo9jI
      End Sub
      Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    
        'Feste Werte
        'e.Graphics.DrawString(RichTextBox1.Text, New Font("Tahoma", 12, FontStyle.Bold), Brushes.Black, 25, 25)
            e.Graphics.DrawString(RichTextBox1.Text,New Font("Arial", RichTextBox1.Font.Size, FontStyle.Bold), Brushes.Black, 25, 25) 
      End Sub
    
    
      Private Sub DruckenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DruckenToolStripMenuItem.Click
    
        'Einfachste Druckmethode die direkt ohne Druckerauswahlmen mit dem Standarddrucker druckt
        'PrintDocument1.Print() '// wegen komfortableren Code hier auskommentiert
        'Nachdem der PrintDialog der Form hinzugefgt wurde, sieht der Code so aus
    
        If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
          PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings
          PrintDocument1.Print()
        Else : End If
    
      End Sub
    
      Private Sub SchriftfarbeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SchriftfarbeToolStripMenuItem.Click
        ColorDialog1.ShowDialog()
        RichTextBox1.ForeColor = ColorDialog1.Color
      End Sub
    
      Private Sub SchriftartToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SchriftartToolStripMenuItem.Click
        FontDialog1.ShowDialog()
        RichTextBox1.Font = FontDialog1.Font
      End Sub
    
    End Class

    Die Quelle zum Video http://www.youtube.com/watch?v=6OuNXxSo9jI


    Liebe Grüße Stefan
    Dienstag, 20. April 2010 21:11
  • Hallo Hermann,

    Du möchtest eigentlich kein Windows Form ausdrucken. Windows Forms sind für die Ausgabe auf dem Bildschirm optimiert, was sich insbesondere bei der Auflösung bemerkbar macht. Dein Abbild eines Windows Form muss auf die Druckerauflösung skaliert werden, was zu unschönen Effekten führt, pixelige Schriften, sowie verzerrte Grafiken führt. Dennoch einige Links, die eine mögliche Herangehensweise beschreiben:

    Code: Printing the Form (Visual C#)
    http://msdn.microsoft.com/en-us/library/aa287529.aspx

    DataGridView Printing by Selecting Columns and Rows
    http://www.codeproject.com/KB/grid/PrintDataGridView.aspx

    Control. DrawToBitmap Method
    http://msdn.microsoft.com/en-us/library/system.windows.forms.control.drawtobitmap.aspx

    Eine Alternative dazu stellen die ReportViewer Controls dar, mit denen Du angepasste Berichte erstellen kannst, die dann jeweils für die Ausgabe auf dem Bildschirm oder Drucker gerendert werden und so für beide Medien optimale Ergebnisse liefern:

    ReportViewer Controls (Visual Studio)
    http://msdn.microsoft.com/en-us/library/ms251671(v=VS.90).aspx


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert Hermann-Sbg Mittwoch, 5. Mai 2010 09:45
    Sonntag, 18. April 2010 07:31
    Beantworter

Alle Antworten

  • Hallo Hermann,

    Du möchtest eigentlich kein Windows Form ausdrucken. Windows Forms sind für die Ausgabe auf dem Bildschirm optimiert, was sich insbesondere bei der Auflösung bemerkbar macht. Dein Abbild eines Windows Form muss auf die Druckerauflösung skaliert werden, was zu unschönen Effekten führt, pixelige Schriften, sowie verzerrte Grafiken führt. Dennoch einige Links, die eine mögliche Herangehensweise beschreiben:

    Code: Printing the Form (Visual C#)
    http://msdn.microsoft.com/en-us/library/aa287529.aspx

    DataGridView Printing by Selecting Columns and Rows
    http://www.codeproject.com/KB/grid/PrintDataGridView.aspx

    Control. DrawToBitmap Method
    http://msdn.microsoft.com/en-us/library/system.windows.forms.control.drawtobitmap.aspx

    Eine Alternative dazu stellen die ReportViewer Controls dar, mit denen Du angepasste Berichte erstellen kannst, die dann jeweils für die Ausgabe auf dem Bildschirm oder Drucker gerendert werden und so für beide Medien optimale Ergebnisse liefern:

    ReportViewer Controls (Visual Studio)
    http://msdn.microsoft.com/en-us/library/ms251671(v=VS.90).aspx


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert Hermann-Sbg Mittwoch, 5. Mai 2010 09:45
    Sonntag, 18. April 2010 07:31
    Beantworter
  • Hallo Thorsten,

    Du hast Recht: Eigentlich will ich nicht das Form an sich drucken, sondern

    - eine Titelzeile

    - 1-2 Zeilen mit Infos

    - die Zeile mit den Spaltennamen des dataGridView

    - dann alle Zeilen des dataGridView genau so wie dargestellt (Schriftgröße, Spaltenbreite, usw.)

    - das alles auf A4 quer

    - und 1-2  Fußzeilen

    Das ist alles !

    Das Thema Drucken liegt mir anscheinend nicht. Seit Wochen plage ich mich damit herum.

    Daher eine Frage: Es wäre äußerst hilfreich, wenn ich für diese sicherlich StandardAufgabe

    einen fertigen Code finden könnte, um überhaupt einmal einen Einstieg in dieses Thema zu haben!

    Gibt es sowas ? Deine Hinweise werde ich jedenfalls wie gewohnt wieder genau studieren.

    Danke und beste Grüße !

    Hermann

     

     

     

     

    Sonntag, 18. April 2010 10:14
  • Hallo Hermann,

    schau dir mal diesen  Thread an.

    http://social.msdn.microsoft.com/Forums/de-DE/vbasicexpresseditionde/thread/e8ddd313-b6ad-46fc-9b4f-1214609d121f

    Da findest du brauchbaren Code und Quellen.

     


    Liebe Grüße Stefan
    Sonntag, 18. April 2010 19:06
  • Hallo Hermann,

     

    ich habe im Netz ein Print Example gefunden, das Dir gefallen könnte.

    http://www.vbdotnetheaven.com/UploadFile/mgold/PrintinginVBNET04202005015906AM/PrintinginVBNET.aspx

    Vorher musst Du Dir noch einen Account besorgen. Das geht schnell.

    Hab es in die IDE geladen. Funktioniert!

    Ich muss mir das selber noch "erarbeiten". Da steckt eine Menge drin. Ich brauch ein paar Tage.

    schöne Grüße

    Ellen

    • Bearbeitet Ellen Ramcke Mittwoch, 21. April 2010 05:51 Link als Hyperlink
    Dienstag, 20. April 2010 16:26
  • Hallo Hermann,

    hier ein Beispiel einer sehr einfachen Methode.

    Public Class Form1
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '###############################################################'
        '# video zu diesem Code http://www.youtube.com/watch?v=6OuNXxSo9jI
      End Sub
      Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    
        'Feste Werte
        'e.Graphics.DrawString(RichTextBox1.Text, New Font("Tahoma", 12, FontStyle.Bold), Brushes.Black, 25, 25)
            e.Graphics.DrawString(RichTextBox1.Text,New Font("Arial", RichTextBox1.Font.Size, FontStyle.Bold), Brushes.Black, 25, 25) 
      End Sub
    
    
      Private Sub DruckenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DruckenToolStripMenuItem.Click
    
        'Einfachste Druckmethode die direkt ohne Druckerauswahlmen mit dem Standarddrucker druckt
        'PrintDocument1.Print() '// wegen komfortableren Code hier auskommentiert
        'Nachdem der PrintDialog der Form hinzugefgt wurde, sieht der Code so aus
    
        If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
          PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings
          PrintDocument1.Print()
        Else : End If
    
      End Sub
    
      Private Sub SchriftfarbeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SchriftfarbeToolStripMenuItem.Click
        ColorDialog1.ShowDialog()
        RichTextBox1.ForeColor = ColorDialog1.Color
      End Sub
    
      Private Sub SchriftartToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SchriftartToolStripMenuItem.Click
        FontDialog1.ShowDialog()
        RichTextBox1.Font = FontDialog1.Font
      End Sub
    
    End Class

    Die Quelle zum Video http://www.youtube.com/watch?v=6OuNXxSo9jI


    Liebe Grüße Stefan
    Dienstag, 20. April 2010 21:11
  • Hallo Hermann,

    ich habe noch ein weiteres Beispiel gefunden. Dies aus der msdn Library.

    http://msdn.microsoft.com/de-de/library/54z247f9(v=VS.80).aspx

    In die IDE geladen. Funktioniert auch.

    Ich glaube, jetzt hast Du genug Material.

    schöne Grüße

    Ellen

     

    Mittwoch, 21. April 2010 06:11
  • Hallo Hermann,

    ich habe Dir das Grundgerüst fertig programmiert. Es werden hier 3 Testzeilen ausgedruckt.

    Du musst dann nur noch Deine Textboxen anstelle einsetzen. Bitte nimm das von mir zuletzt genannte

    Beispiel und ersetze die ganze Prozedur pdoc_PrintPage gegen diese hier.

    Du hast jetzt alles rund um's Drucken

    - Seitenvorschau

    - Seiten Einstellung

    - Druck Dialog

    Viel Spaß und schöne Grüße

    Ellen

    P.S. sorry, dass ich kein C# mache. Nur VB

    Link zum msdn Sample   http://msdn.microsoft.com/de-de/library/54z247f9(VS.80).aspx 

     ''' <summary>
     ''' Überarbeitung vom msdn Sample Printing. Ellen Ramcke 2010
     ''' </summary>
     Private Sub pdoc_PrintPage(ByVal sender As Object, _
        ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
        Handles PrintDocument1.PrintPage
    
    
     ' Die für den Druckvorgang benötigte Schriftart initialisieren.
     Dim font As New Font("Microsoft Sans Serif", 14)
     Dim font2 As New Font("Microsoft Sans Serif", 24)
    
     Dim intPrintAreaHeight, intPrintAreaWidth, marginLeft, marginTop As Int32
     With PrintDocument1.DefaultPageSettings
      ' Lokale Variablen initialisieren, die die Begrenzungen des 
      ' Druckbereichrechtecks enthalten.
      intPrintAreaHeight = .PaperSize.Height - .Margins.Top - .Margins.Bottom
      intPrintAreaWidth = .PaperSize.Width - .Margins.Left - .Margins.Right
    
      ' Lokale Variablen initialisieren, die die Randwerte enthalten, die als 
      ' X- und Y-Koordinaten für die oberen linke Ecke des 
      ' Druckbereichrechtecks verwendet werden.
      marginLeft = .Margins.Left ' X-Koordinate
      marginTop = .Margins.Top ' Y-Koordinate
     End With
    
     ' Wenn der Benutzer Querformat auswählt, Höhe und Breite des 
     ' Druckbereichs vertauschen.
     If PrintDocument1.DefaultPageSettings.Landscape Then
      Dim intTemp As Int32
      intTemp = intPrintAreaHeight
      intPrintAreaHeight = intPrintAreaWidth
      intPrintAreaWidth = intTemp
     End If
     ' Ermittlung der Height und Width wird nachfolgend nicht benutzt:
    
     
     'Ausgabe von drei Testzeilen an die Position 50,50 / 50,100 und 50/130
     '
     e.Graphics.DrawString("Test Text Zeile #1", font2, Brushes.Black, 50, 50)
     e.Graphics.DrawString("Test Text Zeile #2", font, Brushes.Black, 50, 100)
     e.Graphics.DrawString("Test Text Zeile #3", font, Brushes.Black, 50, 130)
    
     ' keine weitere Seite ausdrucken
     e.HasMorePages = False
     
     End Sub
    • Als Antwort markiert Hermann-Sbg Mittwoch, 5. Mai 2010 09:46
    • Bearbeitet Ellen Ramcke Mittwoch, 5. Mai 2010 10:12 link eingefügt
    Mittwoch, 21. April 2010 10:38
  • Hallo Ellen,

    vielen Dank ! Du hast mich richtig mit Arbeit eingedeckt, nachdem ich dieses Thema

    einamal zur Seite gelegt habe. Aber jetzt werde ich mich wieder hinein knieen.

    Sollte ich wieder stecken bleiben, melde ich mich wieder.

    Jedenfalls nochmals vielen Dank, jetzt müsste es gehen !

    Gruß !

    Hermann

    Dienstag, 27. April 2010 10:50
  • Hallo Herrmann,

    hat mich gefreut, gerne wieder.

    Und warte bitte nächstesmal nicht 2 Monate.

    schöne Grüße

    Ellen

    Dienstag, 27. April 2010 11:32
  • Hallo Ellen,

    dank auch deiner Hinweise bin ich jetzt endlich gut unterwegs.

    Ich habe es geschafft, ein *.txt - file zu drucken,

    ein Form auf einem Drucker auszugeben und auch dein letzter

    Vorschlag (3 Testzeilen drucken) läuft problemlos. Jetzt kann

    ich mich auf mein Hauptziel konzentrieren: Der Druck des Inhalts

    einer DataTable.

    Dafür nochmals einen großen Dank an dich !

    Viele Grüße !!

    Hermann

    Dienstag, 4. Mai 2010 19:19
  • Hallo Herrmann,

    das freut mich wirklich sehr. Einen positiven Nebeneffekt hatte das auch für mich.

    Ich habe jetzt auch das Drucken gelernt, wovor ich mich bislang immer "gedrückt" habe.

    Eine Sache noch zur Organisation hier im Forum. Du als Fragesteller hast jetzt die Möglichkeit Beiträge

    als Antwort zu markieren. Das ist erwünscht. Wenn Du Dich nicht für eine Antwort allein entscheiden möchtest,

    kannst Du auch mehrere Beiträge als Antwort markieren. Das geht. Habe ich auch schon gemacht.

    Weiterhin Viel Erfolg bis demnächst und

    schöne Grüße

    Ellen

     

    Dienstag, 4. Mai 2010 19:35