Printprobleem met DataGridView

Status
Niet open voor verdere reacties.

Jan92

Gebruiker
Lid geworden
17 feb 2010
Berichten
111
Hallo, Allemaal

Ik gebruik de onderstaande code om de data in de geselecteerde rijen van mijn DataGridView te printen.

Ik had echter graag geweten hoe ik hetzelfde kan doen zonder eerst de rijen te hoeven selecteren ?

Code:
Private Sub PrintDocument2_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument2.PrintPage

Dim font1 As New Font("arial", 12, FontStyle.Regular)

For Each Row As DataGridViewRow In DataGridView1.SelectedRows

     If Row.Cells(0).Value >= "" Then

     e.Graphics.DrawString(Row.Cells(0).Value, font1, Brushes.Blue, 310, 210) 'From Left, From Top

     e.Graphics.DrawString(Row.Cells(1).Value, font1, Brushes.Blue, 310, 240) 'From Left, From Top

     e.Graphics.DrawString(Row.Cells(2).Value, font2, Brushes.Blue, 310, 330) 'From Left, From Top

     End If

Next Row

End Sub
 
Laatst bewerkt door een moderator:
Hi Jan92

misschien heb je hier wat aan
dit print je datagridview

je heb wel een PrintDocument1 en PageSetupDialog1 en PrintPreviewDialog1 nodig
Code:
#Region "Print Data gridview"

    Private mRow As Integer
    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        With ArtikelenDataGridView1
            Dim fmt As StringFormat = New StringFormat(StringFormatFlags.LineLimit)
            fmt.LineAlignment = StringAlignment.Center
            fmt.Trimming = StringTrimming.EllipsisCharacter
            Dim y As Single = e.MarginBounds.Top
            Do While mRow < .RowCount
                Dim row As DataGridViewRow = .Rows(mRow)
                Dim x As Single = e.MarginBounds.Left
                Dim h As Single = 0
                For Each cell As DataGridViewCell In row.Cells
                    Dim rc As RectangleF = New RectangleF(x, y, cell.Size.Width, cell.Size.Height)
                    e.Graphics.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
                    e.Graphics.DrawString(cell.FormattedValue.ToString(), .Font, Brushes.Black, rc, fmt)
                    x += rc.Width
                    h = Math.Max(h, rc.Height)
                Next
                y += h
                mRow += 1
                If y + h > e.MarginBounds.Bottom Then
                    e.HasMorePages = True
                    Exit Sub
                End If
            Loop
            mRow = 0
        End With

    End Sub

    Private Sub PrintToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PrintToolStripButton.Click
        With PageSetupDialog1
            .PageSettings = PrintDocument1.DefaultPageSettings
        End With
        Try
            If PageSetupDialog1.ShowDialog = DialogResult.OK Then
                PrintDocument1.DefaultPageSettings = PageSetupDialog1.PageSettings
            End If
        Catch es As Exception
            MessageBox.Show(es.Message)
        End Try
        PrintPreviewDialog1.ShowDialog()
    End Sub


#End Region

hopelijk kan je hier wat mee
 
Hoi, old Hippy

Bedankt voor je reactie maar... Dit was niet wat ik zocht. Ik had al code om de DataGridView zelf af te drukken.

Ik probeer het iets beter uit te leggen :

Enkel de "Data" van elke rij in mijn DataGridView moet ingelezen worden en deze "Data" moet afgedrukt worden op een A4

velletje papier waarbij ik in mijn PrintDocument code zelf de locatie, lettertype & kleur, enz... bepaal.

Je kan het misschien ook vergelijken met een Factuur opmaken, gebasseerd op de data in je DataGridView.

Mijn code doet dit ALS... Ik de 1ste rij selecteer en dan op mijn print-button klik, dan de 2de rij selecteren en op de knop

klikken dan de 3de rij enz.... Wat ik nu juist wil is dat ik slechts 1 keer hoef op de print-button te klikken en ALLE

formulieren afgedrukt worden. ( Elke rij is dus een nieuw blad) Hopelijk is het voor iedereen nu wat duidelijker.

Tot genoegen, Jan
 
Hi Jan92
als ik je goed begrijp wil je een standaard factuur of formulier invullen.
dit kan volgen mij met Microsoft.Office.Interop.
Daar mee kan je een word document invullen

En dan in je factuur of formulier textvelden maken en die laten invullen door je programma.
lettertype en kleur kan je in het formulier zelf bepalen.

Als dat de bedoeling is heb ik wel een code voor je.
waar je misschien verder mee kan.
het afdrukken kan je dan zo maken dat alles wat je selecteerd achter elkaar word afgedrukt.

groet Old-Hippy
 
Hallo, old Hippy

Hartelijk dank om deze vraag zo intensief op te volgen maar...

Ik vrees dat je mij toch nog niet begrijpt. :confused:

Ik zoek GEEN PRINTCODE. De printcode die ik heb werkt uitstekend om formulieren of facturen te printen.

Ik zoek enkel een manier (code) om slechts 1 keer te hoeven op mijn print-button te klikken om ALLE rijen

in mijn DataGridview als formulier af te drukken, 1 na 1.

Ik zou de code die ik zoek in het Nederlands als volgt kunnen omschrijven :

Elke rij in de DataGridView (die niet leeg is), is een volgende printpagina. (en ik flap er hier maar wat uit)

Code:
Dim printpagina As Integer = 0

Dim Gridteller As Integer

For Each Row As DataGridViewRow in DataGridView1. Count -1

If DataGridView1.Rows = Not Empty then

printpagina += 1

Gridteller += 1

[code]

Iets in die aard dus (teller en lus),  maar ik geraak er niet uit.

Tot genoegen, Jan
 
hi jan92
zo iets???

Code:
Dim printpagina As Integer = 0
Dim Gridteller As Integer
Try
For Each Row As DataGridViewRow in DataGridView1. Count -1
If DataGridView1.Rows = Not Empty then
printpagina.PrintOut(Copies:=1)
next
Gridteller += 1
       Catch ex As Exception

        End Try
 
@ old Hippy

Nee hoor, nog geen suc6

Foutmelding : "PrintOut" is not a member of "Integer"

Tijdens het WE heb ik meer tijd en zal nog eens "Googelen", je weet maar nooit...

Momenteel hou ik het bij mijn "geselecteerde" rijen. Dat werkt prima !

Ik laat nog iets weten.

Tot genoegen, Jan
 
@ old Hippy :thumb:

Ik heb eindelijk gevonden wat ik zocht. Gezien er nog wel mensen zullen
zijn die deze code kunnen gebruiken wil ik ze bij deze graag delen.
De onderlijnde regels was de code die ik zocht :

Code:
Imports System.IO
Imports Microsoft.VisualBasic.FileIO
Imports System.Drawing.Printing

Public Class Testproject
 'Globale variabelen voor deze class :
    Private TextLine As String = ""
    Private SplitLine() As String
    [U]Private Printpagina As Integer[/U]

    Private Sub Testproject_Load(ByVal sender As System.Object,_
    ByVal e As System.EventArgs) Handles MyBase.Load

 'De inhoud van het bestand lezen en in de DataGridView1 zetten :
        Dim objReader As New System.IO.StreamReader("C:\VB2008\"Testdata.csv")
        Do While objReader.Peek() <> -1
            TextLine = objReader.ReadLine()
            SplitLine = Split(TextLine, ";")
            Me.DataGridView1.Rows.Add(SplitLine)
        Loop
        objReader.Close()

    End Sub

    Private Sub BtnPrintFiches_Click(ByVal sender As System.Object,_
    ByVal e As System.EventArgs) Handles BtnPrintFiches.Click

 'Als er op deze button geklikt werd, de sub aanroepen
 'om ALLE Formulieren af te drukken :

        PrintDocument1.Print()

    End Sub

    Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System._
    Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint

        [U]Printpagina = 1[/U]

    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal_
    e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

 'Alles wat moet geprint worden hier zelf aangegeven !
 'De verschillende gebruikte lettertypes voor het printen declareren :
        Dim font1 As New Font("arial", 12, FontStyle.Underline)
        Dim font2 As New Font("arial", 14, FontStyle.Regular)
        Dim font3 As New Font("arial", 12, FontStyle.Regular)

 'Elke rij van de DataGridView1 is een afzonderlijke pagina :
        [U]Dim RowCount As Integer = DataGridView1.RowCount - 1[/U]
        [U]Dim currentRow As Integer = DataGridView1.SelectedRows(0).Index[/U]
       [U] DataGridView1.Rows(currentRow).Selected = True[/U]
        [U]For Each Row As DataGridViewRow In DataGridView1.SelectedRows[/U]
            [U]If Row.Cells(0).Value >= "" Then[/U]

 'Print waarde van cell 1 - Kleur Blauw - 310 pix vanaf links en 210 pix vanaf boven :
     e.Graphics.DrawString(Row.Cells(0).Value, font1, Brushes.Blue, 310, 210)

 'Print waarde van cell 2 - Kleur Zwart - 310 pix vanaf links en 240 pix vanaf boven :
     e.Graphics.DrawString(Row.Cells(1).Value, font2, Brushes.Black, 310, 240)

 'Print waarde van cell 2 - Kleur Rood - 310 pix vanaf links en 330 pix vanaf boven :
     e.Graphics.DrawString(Row.Cells(2).Value, font3, Brushes.Red, 310, 330)

            End If
            [U]DataGridView1.Rows(currentRow + 1).Selected = True[/U]
        Next
        [U]Printpagina += 1[/U]
        [U]If (Printpagina <= RowCount) Then e.HasMorePages = True_[/U]
        [U]Else e.HasMorePages = False[/U]

    End Sub

    Private Sub BtnSluit_Click(ByVal sender As System.Object,_
    ByVal e As System.EventArgs) Handles BtnSluiten.Click

 'De button om het scherm te verlaten :
        Startscherm.Show()
        Me.Close()

    End Sub

End Class

Tot genoegen, Jan
 
HI jan92

hartelijk dank voor het delen zal hier ongetwijveld gebruik van maken

groet Old Hippy
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan