从右到左打印DataGridView [英] Printing DataGridView from Right to Left

查看:183
本文介绍了从右到左打印DataGridView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在vb.net中打印新的内容,我想要打印的是打印 DataGridView 项目
我在线搜索代码,我发现这个来源从 MSDN ,代码工作完美,但我想要的是打印从右到左的 DataGridView ,我该怎么做
谢谢。



这是从打印DataGridView示例

 公共类Form1 

'''< summary>
'''结构来保存打印页面详细信息
'''< / summary>
'''< remarks>< / remarks>
Private Structure pageDetails
Dim columns As Integer
Dim rows As Integer
Dim startCol As Integer
Dim startRow As Integer
End Structure
' ''< summary>
'''字典来保存打印页面详细信息,索引键
'''< / summary>
'''< remarks>< / remarks>
私人页面作为字典(Of Integer,pageDetails)

Dim maxPagesWide As Integer
Dim maxPagesTall As Integer

'''< summary>
'''这只是加载一些文本值到dgv
'''< / summary>
'''< param name =sender>< / param>
'''< param name =e>< / param>
'''< remarks>< / remarks>
Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs)处理MyBase.Load
DataGridView1.RowHeadersWidth = CInt(DataGridView1.RowHeadersWidth * 1.35)
对于r As Integer = 1 To 100
Dim y As Integer = r
Dim fmt As String =R {0} C {1}
DataGridView1.Rows.Add()
DataGridView1。 Rows(r-1).SetValues(Enumerable.Range(1,10).Select(Function(x)String.Format(fmt,y,x))ToArray)
DataGridView1.Rows(r - 1) .HeaderCell.Value = r.ToString
下一个
End Sub

'''< summary>
'''显示PrintPreviewDialog
'''< / summary>
'''< param name =sender>< / param>
'''< param name =e>< / param>
'''< remarks>< / remarks>
Private Sub btnPreview_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)处理btnPreview.Click
Dim ppd As New PrintPreviewDialog
ppd.Document = PrintDocument1
ppd。 WindowState = FormWindowState.Maximized
ppd.ShowDialog()
End Sub

'''< summary>
'''开始打印作业
'''< / summary>
'''< param name =sender>< / param>
'''< param name =e>< / param>
'''< remarks>< / remarks>
Private Sub btnPrint_Click(ByVal sender As Object,ByVal e As System.EventArgs)处理btnPrint.Click
PrintDocument1.Print()
End Sub

''' < summary>
'''这个Sub的大部分是计算打印页面范围
''< / summary>
'''< param name =sender>< / param>
'''< param name =e>< / param>
'''< remarks>< / remarks>
Private Sub PrintDocument1_BeginPrint(ByVal sender As Object,ByVal e As System.Drawing.Printing.PrintEventArgs)处理PrintDocument1.BeginPrint
这将删除打印的页边距
PrintDocument1.OriginAtMargins = True
PrintDocument1.DefaultPageSettings.Margins = New Drawing.Printing.Margins(0,0,0,0)

pages =新词典(Of Integer,pageDetails)

Dim maxWidth As Integer = CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Width) - 40
Dim maxHeight As Integer = CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Height) - 40 + Label1.Height

Dim pageCounter As Integer = 0
pages.Add(pageCounter,New pageDetails)

Dim columnCounter As Integer = 0

Dim columnSum As Integer = DataGridView1.RowHeadersWidth

对于c As Integer = 0到DataGridView1.Columns.Count - 1
I f columnSum + DataGridView1.Columns(c).Width< maxWidth然后
columnSum + = DataGridView1.Columns(c).Width
columnCounter + = 1
Else
页(pageCounter)=新页面详细信息使用{.columns = columnCounter,.rows = 0,.startCol = pages(pageCounter).startCol}
columnSum = DataGridView1.RowHeadersWidth + DataGridView1.Columns(c).Width
columnCounter = 1
pageCounter + = 1
page.Add(pageCounter,新页面详细信息,带有{.startCol = c})
End If
如果c = DataGridView1.Columns.Count - 1然后
如果页面(pageCounter).columns = 0然后
页面(pageCounter)=新的页面详细信息{.columns = columnCounter,.rows = 0,.startCol = pages(pageCounter).startCol}
End If
End If
Next

maxPagesWide = pages.Keys.Max + 1

pageCounter = 0

Dim rowCounter As Integer = 0

Dim rowSum As Integer = DataGridView1.ColumnHeadersHeight

For r As Integer = 0 To DataGridView1.Rows .Count - 2
如果rowSum + DataGridView1.Rows(r).Height< maxHeight然后
rowSum + = DataGridView1.Rows(r).Height
rowCounter + = 1
Else
页面(pageCounter)=新页面详细信息使用{.columns = pages(pageCounter) .columns,.rows = rowCounter,.startCol = pages(pageCounter).startCol,.startRow = pages(pageCounter).startRow}
对于x As Integer = 1 To maxPagesWide - 1
pages(pageCounter + x)=新的pageDetails使用{.columns = pages(pageCounter + x).columns,.rows = rowCounter,.startCol = pages(pageCounter + x).startCol,.startRow = pages(pageCounter).startRow}
Next

pageCounter + = maxPagesWide
对于x As Integer = 0 To maxPagesWide - 1
pages.Add(pageCounter + x,New pageDetails With {.columns = pages(x) .columns,.rows = 0,.startCol = pages(x).startCol,.startRow = r})
下一个

rowSum = DataGridView1.ColumnHeadersHeight + DataGridView1.Rows(r).Height
rowCounter = 1
End If
如果r = DataGridView1.Rows.Count - 2然后
对于x As Integer = 0对于maxPagesWide - 1
如果页面(pageCounter + x).rows = 0然后
页面(pageCounter + x)=新页面详细信息使用{.columns = pages(pageCounter + x).columns,.rows = rowCounter,.startCol = pages(pageCounter + x).startCol,.startRow = pages(pageCounter + x).startRow}
End If
Next
End If
Next

maxPagesTall = pages.Count \ maxPagesWide

End Sub

'''< summary>
'''这是实际的打印程序。
'''使用我之前计算的pagedetails,它打印一个标题,
'''+ datagridview的大部分将适合1页,然后移动到下一页。
'''这是设置为动态的。尝试调整dgv列或行
'''< / summary>
'''< param name =sender>< / param>
'''< param name =e>< / param>
'''< remarks>< / remarks>
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object,ByVal e As System.Drawing.Printing.PrintPageEventArgs)处理PrintDocument1.PrintPage
Dim rect As New Rectangle(20,20,CInt(PrintDocument1.DefaultPageSettings。 PrintableArea.Width),Label1.Height)
Dim sf As New StringFormat
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center

e。 Graphics.DrawString(Label1.Text,Label1.Font,Brushes.Black,rect,sf)

sf.Alignment = StringAlignment.Near

Dim startX As Integer = 50
Dim startY As Integer = rect.Bottom

静态startPage As Integer = 0

对于p As Integer = startPage To pages.Count - 1
Dim单元格作为新矩形(startX,startY,DataGridView1.RowHeadersWidth,DataGridView1.ColumnHeadersHeight)
e.Graphics.FillRectangle(New SolidBrush(SystemColor s.ControlLight),单元格)
e.Graphics.DrawRectangle(Pens.Black,cell)

startY + = DataGridView1.ColumnHeadersHeight

对于r As Integer = page(p).startRow To pages(p).startRow + pages(p).rows - 1
cell = New Rectangle(startX,startY,DataGridView1.RowHeadersWidth,DataGridView1.Rows(r).Height)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight),cell)
e.Graphics.DrawRectangle(Pens.Black,cell)
e.Graphics.DrawString(DataGridView1.Rows(r) .HeaderCell.Value.ToString,DataGridView1.Font,Brushes.Black,cell,sf)
startY + = DataGridView1.Rows(r).Height
下一个

startX + = cell.Width
startY = rect.Bottom

对于c As Integer = pages(p).startCol到页面(p).startCol + pages(p).columns - 1
cell = New Rectangle(startX,sta rty,DataGridView1.Columns(c).Width,DataGridView1.ColumnHeadersHeight)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight),cell)
e.Graphics.DrawRectangle(Pens.Black,cell )
e.Graphics.DrawString(DataGridView1.Columns(c).HeaderCell.Value.ToString,DataGridView1.Font,Brushes.Black,cell,sf)
startX + = DataGridView1.Columns(c)。宽度
下一个

startY = rect.Bottom + DataGridView1.ColumnHeadersHeight

对于r As Integer = pages(p).startRow到页面(p).startRow +页面(p).rows - 1
startX = 50 + DataGridView1.RowHeadersWidth
对于c As Integer = pages(p).startCol到页面(p).startCol + pages(p).columns - 1
cell = New Rectangle(startX,startY,DataGridView1.Columns(c).Width,DataGridView1.Rows(r).Height)
e.Graphics.DrawRectangle(Pens.Black,单元格)
e.Graphics.DrawString(DataGridView1(c,r).Value.ToString,DataGridView1.Font,Brushes.Black,cell,sf)
startX + = DataGridView1.Columns(c).Width
下一个
startY + = DataGridView1.Rows(r).Height
下一个

如果p < pages.Count - 1然后
startPage = p + 1
e.HasMorePages = True
返回
Else
startPage = 0
如果

下一个

End Sub

结束类


解决方案

要打印RTL,您需要在发布的代码中进行一些更改


  1. 您应该使用 StringFormat 具有 StringFormatFlags.DirectionRightToLeft 格式glag。

  2. 而不是从左到右绘制矩形,您应该从右到左修正坐标以支持绘图。

要解决第一个问题,只需将所提到的标记添加到字符串格式就可以了:

  sf.FormatFlags = sf.FormatFlags或StringFormatFlags.DirectionRightToLeft 

要解决第二个问题,您应该创建这样的方法:

 公共函数GetRTLCordord(container As Rectangle,drawRectangle作为Rectangle)_ 
As Rectangle
返回新矩形(container.Width - drawRectangle.Width - drawRectangle.X,_
drawRectangle.Y,drawRectangle.Width,drawRectangle.Height)
结束函数

然后在代码中,在计算一个名为单元格的矩形的每行代码之后,添加这行代码:

  cell = GetRTLCobordinates(rect,cell)

代码



以下是 PrintDocument1_PrintPage 方法。不要忘记复制上面提到的 GetRTLC坐标方法。

  Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object,ByVal e As System.Drawing.Printing.PrintPageEventArgs)处理PrintDocument1.PrintPage 
Dim rect As New Rectangle(20,20,CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Width) ,Label1.Height)
Dim sf As New StringFormat
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
sf.FormatFlags = sf.FormatFlags或StringFormatFlags。 DirectionRightToLeft

e.Graphics.DrawString(Label1.Text,Label1.Font,Brushes.Black,rect,sf)

sf.Alignment = StringAlignment.Near

Dim startX As Integer = 50
Dim startY As Integer = rect.Bottom

静态startPage As Integer = 0

对于p As Integer = startPage To pages.Count - 1
Dim cell As New Rectangle(startX,startY,Da taGridView1.RowHeadersWidth,DataGridView1.ColumnHeadersHeight)
cell = GetRTLCobordinates(rect,cell)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight),cell)
e.Graphics.DrawRectangle( Pens.Black,cell)

startY + = DataGridView1.ColumnHeadersHeight

对于r As Integer = pages(p).startRow To pages(p).startRow + pages(p ).rows - 1
cell = New Rectangle(startX,startY,DataGridView1.RowHeadersWidth,DataGridView1.Rows(r).Height)
cell = GetRTLCobordinates(rect,cell)
e.Graphics FillRectangle(New SolidBrush(SystemColors.ControlLight),cell)
e.Graphics.DrawRectangle(Pens.Black,cell)
e.Graphics.DrawString(DataGridView1.Rows(r).HeaderCell.Value。 ToString,DataGridView1.Font,Brushes.Black,cell,sf)
startY + = DataGridView1.Rows(r).Height
下一个

startX + = cell.Width
sta rtY = rect.Bottom

对于c As Integer = pages(p).startCol To pages(p).startCol + pages(p).columns - 1
cell = New Rectangle(startX ,startY,DataGridView1.Columns(c).Width,DataGridView1.ColumnHeadersHeight)
cell = GetRTLCobordinates(rect,cell)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight),cell)
e.Graphics.DrawRectangle(Pens.Black,cell)
e.Graphics.DrawString(DataGridView1.Columns(c).HeaderCell.Value.ToString,DataGridView1.Font,Brushes.Black,cell,sf)
startX + = DataGridView1.Columns(c).Width
下一个

startY = rect.Bottom + DataGridView1.ColumnHeadersHeight

对于r As Integer = pages (p).startRow To pages(p).startRow + pages(p).rows - 1
startX = 50 + DataGridView1.RowHeadersWidth
对于c As Integer = pages(p).startCol To pages p).startCol + pages(p).columns - 1
cell = New Rectangle(startX,startY,DataGridView1.Columns(c).Width,DataGridView1.Rows(r).Height)
cell = GetRTLCobordinates(rect,cell)
e.Graphics.DrawRectangle .Black,cell)
e.Graphics.DrawString(DataGridView1(c,r).Value.ToString,DataGridView1.Font,Brushes.Black,cell,sf)
startX + = DataGridView1.Columns(c ).Width
下一个
startY + = DataGridView1.Rows(r).Height
下一个

如果p < pages.Count - 1然后
startPage = p + 1
e.HasMorePages = True
返回
Else
startPage = 0
如果

下一个

End Sub


I'm new in printing in vb.net, what I want to do is printing DataGridView items I searched online for code and I found this source from MSDN, the code work perfect but what I want is printing the DataGridView from Right to left, how can I do this. thanks.

This is the source code which I get from Printing DataGridView Example:

Public Class Form1 

    ''' <summary> 
    ''' structire to hold printed page details 
    ''' </summary> 
    ''' <remarks></remarks> 
    Private Structure pageDetails 
        Dim columns As Integer 
        Dim rows As Integer 
        Dim startCol As Integer 
        Dim startRow As Integer 
    End Structure 
    ''' <summary> 
    ''' dictionary to hold printed page details, with index key 
    ''' </summary> 
    ''' <remarks></remarks> 
    Private pages As Dictionary(Of Integer, pageDetails) 

    Dim maxPagesWide As Integer 
    Dim maxPagesTall As Integer 

    ''' <summary> 
    ''' this just loads some text values into the dgv 
    ''' </summary> 
    ''' <param name="sender"></param> 
    ''' <param name="e"></param> 
    ''' <remarks></remarks> 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
        DataGridView1.RowHeadersWidth = CInt(DataGridView1.RowHeadersWidth * 1.35) 
        For r As Integer = 1 To 100 
            Dim y As Integer = r 
            Dim fmt As String = "R{0}C{1}" 
            DataGridView1.Rows.Add() 
            DataGridView1.Rows(r - 1).SetValues(Enumerable.Range(1, 10).Select(Function(x) String.Format(fmt, y, x)).ToArray) 
            DataGridView1.Rows(r - 1).HeaderCell.Value = r.ToString 
        Next 
    End Sub 

    ''' <summary> 
    ''' shows a PrintPreviewDialog 
    ''' </summary> 
    ''' <param name="sender"></param> 
    ''' <param name="e"></param> 
    ''' <remarks></remarks> 
    Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click 
        Dim ppd As New PrintPreviewDialog 
        ppd.Document = PrintDocument1 
        ppd.WindowState = FormWindowState.Maximized 
        ppd.ShowDialog() 
    End Sub 

    ''' <summary> 
    ''' starts print job 
    ''' </summary> 
    ''' <param name="sender"></param> 
    ''' <param name="e"></param> 
    ''' <remarks></remarks> 
    Private Sub btnPrint_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrint.Click 
        PrintDocument1.Print() 
    End Sub 

    ''' <summary> 
    ''' the majority of this Sub is calculating printed page ranges 
    ''' </summary> 
    ''' <param name="sender"></param> 
    ''' <param name="e"></param> 
    ''' <remarks></remarks> 
    Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint 
        ''this removes the printed page margins 
        PrintDocument1.OriginAtMargins = True 
        PrintDocument1.DefaultPageSettings.Margins = New Drawing.Printing.Margins(0, 0, 0, 0) 

        pages = New Dictionary(Of Integer, pageDetails) 

        Dim maxWidth As Integer = CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Width) - 40 
        Dim maxHeight As Integer = CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Height) - 40 + Label1.Height 

        Dim pageCounter As Integer = 0 
        pages.Add(pageCounter, New pageDetails) 

        Dim columnCounter As Integer = 0 

        Dim columnSum As Integer = DataGridView1.RowHeadersWidth 

        For c As Integer = 0 To DataGridView1.Columns.Count - 1 
            If columnSum + DataGridView1.Columns(c).Width < maxWidth Then 
                columnSum += DataGridView1.Columns(c).Width 
                columnCounter += 1 
            Else 
                pages(pageCounter) = New pageDetails With {.columns = columnCounter, .rows = 0, .startCol = pages(pageCounter).startCol} 
                columnSum = DataGridView1.RowHeadersWidth + DataGridView1.Columns(c).Width 
                columnCounter = 1 
                pageCounter += 1 
                pages.Add(pageCounter, New pageDetails With {.startCol = c}) 
            End If 
            If c = DataGridView1.Columns.Count - 1 Then 
                If pages(pageCounter).columns = 0 Then 
                    pages(pageCounter) = New pageDetails With {.columns = columnCounter, .rows = 0, .startCol = pages(pageCounter).startCol} 
                End If 
            End If 
        Next 

        maxPagesWide = pages.Keys.Max + 1 

        pageCounter = 0 

        Dim rowCounter As Integer = 0 

        Dim rowSum As Integer = DataGridView1.ColumnHeadersHeight 

        For r As Integer = 0 To DataGridView1.Rows.Count - 2 
            If rowSum + DataGridView1.Rows(r).Height < maxHeight Then 
                rowSum += DataGridView1.Rows(r).Height 
                rowCounter += 1 
            Else 
                pages(pageCounter) = New pageDetails With {.columns = pages(pageCounter).columns, .rows = rowCounter, .startCol = pages(pageCounter).startCol, .startRow = pages(pageCounter).startRow} 
                For x As Integer = 1 To maxPagesWide - 1 
                    pages(pageCounter + x) = New pageDetails With {.columns = pages(pageCounter + x).columns, .rows = rowCounter, .startCol = pages(pageCounter + x).startCol, .startRow = pages(pageCounter).startRow} 
                Next 

                pageCounter += maxPagesWide 
                For x As Integer = 0 To maxPagesWide - 1 
                    pages.Add(pageCounter + x, New pageDetails With {.columns = pages(x).columns, .rows = 0, .startCol = pages(x).startCol, .startRow = r}) 
                Next 

                rowSum = DataGridView1.ColumnHeadersHeight + DataGridView1.Rows(r).Height 
                rowCounter = 1 
            End If 
            If r = DataGridView1.Rows.Count - 2 Then 
                For x As Integer = 0 To maxPagesWide - 1 
                    If pages(pageCounter + x).rows = 0 Then 
                        pages(pageCounter + x) = New pageDetails With {.columns = pages(pageCounter + x).columns, .rows = rowCounter, .startCol = pages(pageCounter + x).startCol, .startRow = pages(pageCounter + x).startRow} 
                    End If 
                Next 
            End If 
        Next 

        maxPagesTall = pages.Count \ maxPagesWide 

    End Sub 

    ''' <summary> 
    ''' this is the actual printing routine. 
    ''' using the pagedetails i calculated earlier, it prints a title, 
    ''' + as much of the datagridview as will fit on 1 page, then moves to the next page. 
    ''' this is setup to be dynamic. try resizing the dgv columns or rows 
    ''' </summary> 
    ''' <param name="sender"></param> 
    ''' <param name="e"></param> 
    ''' <remarks></remarks> 
    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage 
        Dim rect As New Rectangle(20, 20, CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Width), Label1.Height) 
        Dim sf As New StringFormat 
        sf.Alignment = StringAlignment.Center 
        sf.LineAlignment = StringAlignment.Center 

        e.Graphics.DrawString(Label1.Text, Label1.Font, Brushes.Black, rect, sf) 

        sf.Alignment = StringAlignment.Near 

        Dim startX As Integer = 50 
        Dim startY As Integer = rect.Bottom 

        Static startPage As Integer = 0 

        For p As Integer = startPage To pages.Count - 1 
            Dim cell As New Rectangle(startX, startY, DataGridView1.RowHeadersWidth, DataGridView1.ColumnHeadersHeight) 
            e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell) 
            e.Graphics.DrawRectangle(Pens.Black, cell) 

            startY += DataGridView1.ColumnHeadersHeight 

            For r As Integer = pages(p).startRow To pages(p).startRow + pages(p).rows - 1 
                cell = New Rectangle(startX, startY, DataGridView1.RowHeadersWidth, DataGridView1.Rows(r).Height) 
                e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell) 
                e.Graphics.DrawRectangle(Pens.Black, cell) 
                e.Graphics.DrawString(DataGridView1.Rows(r).HeaderCell.Value.ToString, DataGridView1.Font, Brushes.Black, cell, sf) 
                startY += DataGridView1.Rows(r).Height 
            Next 

            startX += cell.Width 
            startY = rect.Bottom 

            For c As Integer = pages(p).startCol To pages(p).startCol + pages(p).columns - 1 
                cell = New Rectangle(startX, startY, DataGridView1.Columns(c).Width, DataGridView1.ColumnHeadersHeight) 
                e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell) 
                e.Graphics.DrawRectangle(Pens.Black, cell) 
                e.Graphics.DrawString(DataGridView1.Columns(c).HeaderCell.Value.ToString, DataGridView1.Font, Brushes.Black, cell, sf) 
                startX += DataGridView1.Columns(c).Width 
            Next 

            startY = rect.Bottom + DataGridView1.ColumnHeadersHeight 

            For r As Integer = pages(p).startRow To pages(p).startRow + pages(p).rows - 1 
                startX = 50 + DataGridView1.RowHeadersWidth 
                For c As Integer = pages(p).startCol To pages(p).startCol + pages(p).columns - 1 
                    cell = New Rectangle(startX, startY, DataGridView1.Columns(c).Width, DataGridView1.Rows(r).Height) 
                    e.Graphics.DrawRectangle(Pens.Black, cell) 
                    e.Graphics.DrawString(DataGridView1(c, r).Value.ToString, DataGridView1.Font, Brushes.Black, cell, sf) 
                    startX += DataGridView1.Columns(c).Width 
                Next 
                startY += DataGridView1.Rows(r).Height 
            Next 

            If p <> pages.Count - 1 Then 
                startPage = p + 1 
                e.HasMorePages = True 
                Return 
            Else 
                startPage = 0 
            End If 

        Next 

    End Sub 

End Class 

解决方案

To make that printing RTL, you need to make some changes in the posted code

  1. You should use a StringFormat having StringFormatFlags.DirectionRightToLeft format glag.
  2. Also instead of drawing rectangles from left to right, you should correct coordinates to support drawing from right to left.

To solve the first issue, it's enough to add the mentioned flag to the string format:

sf.FormatFlags = sf.FormatFlags Or StringFormatFlags.DirectionRightToLeft

To solve the second issue, you should create such method:

Public Function GetRTLCoordinates(container As Rectangle, drawRectangle As Rectangle) _
    As Rectangle
    Return New Rectangle(container.Width - drawRectangle.Width - drawRectangle.X, _
        drawRectangle.Y, drawRectangle.Width, drawRectangle.Height)
End Function

Then in the code, after each line of code which calculated a rectangle named cell, add this line of code:

cell = GetRTLCoordinates(rect, cell)

Code

Here is the changed version of PrintDocument1_PrintPage method. Don't forget to copy GetRTLCoordinates method which is mentioned above.

Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Dim rect As New Rectangle(20, 20, CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Width), Label1.Height)
    Dim sf As New StringFormat
    sf.Alignment = StringAlignment.Center
    sf.LineAlignment = StringAlignment.Center
    sf.FormatFlags = sf.FormatFlags Or StringFormatFlags.DirectionRightToLeft

    e.Graphics.DrawString(Label1.Text, Label1.Font, Brushes.Black, rect, sf)

    sf.Alignment = StringAlignment.Near

    Dim startX As Integer = 50
    Dim startY As Integer = rect.Bottom

    Static startPage As Integer = 0

    For p As Integer = startPage To pages.Count - 1
        Dim cell As New Rectangle(startX, startY, DataGridView1.RowHeadersWidth, DataGridView1.ColumnHeadersHeight)
        cell = GetRTLCoordinates(rect, cell)
        e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell)
        e.Graphics.DrawRectangle(Pens.Black, cell)

        startY += DataGridView1.ColumnHeadersHeight

        For r As Integer = pages(p).startRow To pages(p).startRow + pages(p).rows - 1
            cell = New Rectangle(startX, startY, DataGridView1.RowHeadersWidth, DataGridView1.Rows(r).Height)
            cell = GetRTLCoordinates(rect, cell)
            e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell)
            e.Graphics.DrawRectangle(Pens.Black, cell)
            e.Graphics.DrawString(DataGridView1.Rows(r).HeaderCell.Value.ToString, DataGridView1.Font, Brushes.Black, cell, sf)
            startY += DataGridView1.Rows(r).Height
        Next

        startX += cell.Width
        startY = rect.Bottom

        For c As Integer = pages(p).startCol To pages(p).startCol + pages(p).columns - 1
            cell = New Rectangle(startX, startY, DataGridView1.Columns(c).Width, DataGridView1.ColumnHeadersHeight)
            cell = GetRTLCoordinates(rect, cell)
            e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell)
            e.Graphics.DrawRectangle(Pens.Black, cell)
            e.Graphics.DrawString(DataGridView1.Columns(c).HeaderCell.Value.ToString, DataGridView1.Font, Brushes.Black, cell, sf)
            startX += DataGridView1.Columns(c).Width
        Next

        startY = rect.Bottom + DataGridView1.ColumnHeadersHeight

        For r As Integer = pages(p).startRow To pages(p).startRow + pages(p).rows - 1
            startX = 50 + DataGridView1.RowHeadersWidth
            For c As Integer = pages(p).startCol To pages(p).startCol + pages(p).columns - 1
                cell = New Rectangle(startX, startY, DataGridView1.Columns(c).Width, DataGridView1.Rows(r).Height)
                cell = GetRTLCoordinates(rect, cell)
                e.Graphics.DrawRectangle(Pens.Black, cell)
                e.Graphics.DrawString(DataGridView1(c, r).Value.ToString, DataGridView1.Font, Brushes.Black, cell, sf)
                startX += DataGridView1.Columns(c).Width
            Next
            startY += DataGridView1.Rows(r).Height
        Next

        If p <> pages.Count - 1 Then
            startPage = p + 1
            e.HasMorePages = True
            Return
        Else
            startPage = 0
        End If

    Next

End Sub

这篇关于从右到左打印DataGridView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆