Printen DataGridView, uitlijning kolommen aanpassen

Status
Niet open voor verdere reacties.

Jan92

Gebruiker
Lid geworden
17 feb 2010
Berichten
111
Dag programmeurs,

Ik heb op het internet code gevonden om een DataGridView af te drukken en deze code werkt wel perfect maar het nadeel voor mij is dat alle data links uitgelijnd staat. (Headers en Cells)
In de proporties van mijn DataGridView staat alles goed ingesteld en op het scherm wordt alles ook weergegeven zoals ik het wens. De uitlijning van de diverse kolommen moet als volgt zijn:
Kolom 1, Centreren
Kolom 2, Links uitlijnen
Kolom 3, Rechts uitlijnen
Kolom 4, Centreren
Kolom 5, Rechts uitlijnen
Kolom 6, Rechts uitlijnen
Bij het printen staat alles dus echter Links uitgelijnd.
Ik begrijp zelf veel te weinig van de printcode om deze te kunnen aanpassen :o

Code:
    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, _
                                         ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
 Handles PrintDocument1.PrintPage
        '


    'DataGridView1 afdrukken:
        '
        oStringFormat = New StringFormat
        oStringFormat.Alignment = StringAlignment.Near
        oStringFormat.LineAlignment = StringAlignment.Center
        oStringFormat.Trimming = StringTrimming.EllipsisCharacter
        nTotalWidth = 0
        For Each oColumn As DataGridViewColumn In DataGridView3.Columns
            If oColumn.Visible = True Then
                nTotalWidth += oColumn.Width
            End If
        Next
        nPageNo = 1
        NewPage = True
        nRowPos = 0
        '
        Static oColumnLefts As New ArrayList
        Static oColumnWidths As New ArrayList
        Static oColumnTypes As New ArrayList
        Static nHeight As Int16
        Dim nWidth, i, nRowsPerPage As Int16
        Dim nTop As Int16 = 200  'Startpositie vanaf boven (nTop)
        Dim nLeft As Int16 = 70  'Startpositie vanaf links (nLeft)
        If nPageNo = 1 Then
            For Each oColumn As DataGridViewColumn In DataGridView3.Columns
                If oColumn.Visible = True Then
                    nWidth = CType(Math.Floor(oColumn.Width / nTotalWidth * nTotalWidth * _
                                              (e.MarginBounds.Width / nTotalWidth)), Int16)
                    'Op het einde van onderstaande regel code staat "+ 8"
                    'Dit heeft invloed op de hoogte van de Rijen en kan aangepast worden !
                    nHeight = e.Graphics.MeasureString(oColumn.HeaderText, oColumn.InheritedStyle.Font, nWidth).Height + 8
                    oColumnLefts.Add(nLeft)
                    oColumnWidths.Add(nWidth)
                    oColumnTypes.Add(oColumn.GetType)
                    nLeft += nWidth
                End If
            Next
        End If
        Do While nRowPos < DataGridView3.Rows.Count '- 1
            Dim oRow As DataGridViewRow = DataGridView3.Rows(nRowPos)
            If nTop + nHeight >= e.MarginBounds.Height + e.MarginBounds.Top Then
                NewPage = True
                nPageNo += 1
                e.HasMorePages = False 'True ** Gewijzigd !
                Exit Sub
            Else
                If NewPage Then
                    'Draw Columns
                    nTop = 200
                    i = 0
                    For Each oColumn As DataGridViewColumn In DataGridView3.Columns
                        If oColumn.Visible = True Then
                            e.Graphics.FillRectangle(New SolidBrush(Drawing.Color.LightGray), _
                                                     New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight))
                            e.Graphics.DrawRectangle(Pens.Black, New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight))
                            e.Graphics.DrawString(oColumn.HeaderText, oColumn.InheritedStyle.Font, _
                                                  New SolidBrush(oColumn.InheritedStyle.ForeColor), _
                                                  New RectangleF(oColumnLefts(i), nTop, oColumnWidths(i), nHeight), oStringFormat)
                            i += 1
                        End If
                    Next
                    NewPage = False
                End If
                nTop += nHeight
                i = 0
                'Draw Rows
                For Each oCell As DataGridViewCell In oRow.Cells
                    If oCell.Visible = True Then
                        e.Graphics.DrawString(oCell.Value.ToString, oCell.InheritedStyle.Font, _
                                              New SolidBrush(oCell.InheritedStyle.ForeColor), _
                                              New RectangleF(oColumnLefts(i), nTop, oColumnWidths(i), nHeight), oStringFormat)
                        e.Graphics.DrawRectangle(Pens.Black, New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight))
                        i += 1
                    End If
                Next
            End If
            nRowPos += 1
            nRowsPerPage += 1
        Loop
        e.HasMorePages = False
    End Sub
 
Laatst bewerkt door een moderator:
Kan je alsjeblieft code-tags om je code plaatsen en inspringingen in de code toevoegen/meekopiëren uit visual basic??? Dat maakt het lezen een stuk gemakkelijker.....

MartinJM
 
Sorry hiervoor ! 't was al lang geleden dat ik nog eens gepost heb.


Code:
    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, _
                                         ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        '
        oStringFormat = New StringFormat
        oStringFormat.Alignment = StringAlignment.Near
        oStringFormat.LineAlignment = StringAlignment.Center
        oStringFormat.Trimming = StringTrimming.EllipsisCharacter
        nTotalWidth = 0
        For Each oColumn As DataGridViewColumn In DataGridView3.Columns
            If oColumn.Visible = True Then
                nTotalWidth += oColumn.Width
            End If
        Next
        nPageNo = 1
        NewPage = True
        nRowPos = 0
        '
        Static oColumnLefts As New ArrayList
        Static oColumnWidths As New ArrayList
        Static oColumnTypes As New ArrayList
        Static nHeight As Int16
        Dim nWidth, i, nRowsPerPage As Int16
        Dim nTop As Int16 = 200  'Startpositie vanaf boven (nTop)
        Dim nLeft As Int16 = 70  'Startpositie vanaf links (nLeft)
        If nPageNo = 1 Then
            For Each oColumn As DataGridViewColumn In DataGridView3.Columns
                If oColumn.Visible = True Then
                    nWidth = CType(Math.Floor(oColumn.Width / nTotalWidth * nTotalWidth * _
                                              (e.MarginBounds.Width / nTotalWidth)), Int16)
                    'Op het einde van onderstaande regel code staat "+ 8"
                    'Dit heeft invloed op de hoogte van de Rijen en kan aangepast worden !
                    nHeight = e.Graphics.MeasureString(oColumn.HeaderText, oColumn.InheritedStyle.Font, nWidth).Height + 8
                    oColumnLefts.Add(nLeft)
                    oColumnWidths.Add(nWidth)
                    oColumnTypes.Add(oColumn.GetType)
                    nLeft += nWidth
                End If
            Next
        End If
        Do While nRowPos < DataGridView3.Rows.Count '- 1
            Dim oRow As DataGridViewRow = DataGridView3.Rows(nRowPos)
            If nTop + nHeight >= e.MarginBounds.Height + e.MarginBounds.Top Then
                NewPage = True
                nPageNo += 1
                e.HasMorePages = False 'True ** Gewijzigd !
                Exit Sub
            Else
                If NewPage Then
                    'Draw Columns
                    nTop = 200
                    i = 0
                    For Each oColumn As DataGridViewColumn In DataGridView3.Columns
                        If oColumn.Visible = True Then
                            e.Graphics.FillRectangle(New SolidBrush(Drawing.Color.LightGray), _
                                                     New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight))
                            e.Graphics.DrawRectangle(Pens.Black, New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight))
                            e.Graphics.DrawString(oColumn.HeaderText, oColumn.InheritedStyle.Font, _
                                                  New SolidBrush(oColumn.InheritedStyle.ForeColor), _
                                                  New RectangleF(oColumnLefts(i), nTop, oColumnWidths(i), nHeight), oStringFormat)
                            i += 1
                        End If
                    Next
                    NewPage = False
                End If
                nTop += nHeight
                i = 0
                'Draw Rows
                For Each oCell As DataGridViewCell In oRow.Cells
                    If oCell.Visible = True Then
                        e.Graphics.DrawString(oCell.Value.ToString, oCell.InheritedStyle.Font, _
                                              New SolidBrush(oCell.InheritedStyle.ForeColor), _
                                              New RectangleF(oColumnLefts(i), nTop, oColumnWidths(i), nHeight), oStringFormat)
                        e.Graphics.DrawRectangle(Pens.Black, New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight))
                        i += 1
                    End If
                Next
            End If
            nRowPos += 1
            nRowsPerPage += 1
        Loop
        e.HasMorePages = False
    End Sub
 
Ik heb eigenlijk nog een vraag: Waar heb je de code vandaan als je hem zelf niet genoeg begrijpt om hem te kunnen aanpassen??

Dan nog iets wat mij opvalt: Hier vul je een list: "oColumnTypes.Add(oColumn.GetType)". Daarvoor vul je ook 2 andere lists. Die 2 lists worden wel gebruikt bij het printen, maar die andere niet... Zou daar het probleem kunnen zitten? Want verder is er ook nergens een code die de uitlijning regelt.


Ik weet het ook niet precies, want zoals ik een keer (hier) gelezen heb: Een code begrijpen die niet van jou is, is vele malen moeilijker dan een code begrijpen die van jou is. Het was wel wat anders, maar het kwam op ongeveer hetzelfde neer. Alleen met uitleg erbij zijn codes van anderen meestal nog wel te begrijpen.


MartinJM
 
Dag Martin MJ,

Nog enige toelichting op je vragen en opmerkingen:

Ik heb dus die code "ergens" op het internet gevonden (Lang geleden!)
Het is dus niet "mijn" code en daarom begrijp ik ze ook niet goed.

Verder denk ik dat de eerste twee ArrayLists (oColumn.lefts en oColumn.Width)
dienen om de DataGridView zelf te tekenen (printen), dus de lijnen v/d
kolommen en rijen. De 3de ArrayList (oColumnTypes) zal dan wel zijn om de
inhoud van de cellen (data) te printen. (oColumnTypesAdd(oColumn.GetType)
Mijn mening, voor zover ik de code dus probeer te begrijpen.

Nogmaals, dit werkt allemaal perfect maar... alles is links uitgelijnd !
Er is, zoals je opmerkt, inderdaad geen code die zorgt voor de uitlijning
zoals ik ze zou willen. Ik heb deze code hier dan ook gepost in de hoop
dat iemand ze wél begrijpt en kan aanpassen/verbeteren voor mij !
 
Hallo, old Hippy

Ik heb maar één woord voor deze code : Fantastisch !

Wel nog wat moeten aanpassen naar eigen behoeften natuurlijk.

Super bedankt ! :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan