我无法调整我的四列:
标题的字符串格式正常。当我读取下一行并将其放入列表时,String.Format获取视频名称并创建调整为视频名称长度的列。我该如何解决这个问题?
Private Sub pdPrint_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles pdPrint.PrintPage
e.Graphics.DrawString("Movie Collection", New Font("Courier", 20, FontStyle.Bold), Brushes.Black, 300, 10)
e.Graphics.DrawString(String.Format("{0, -20} {1,-20} {2, -20} {3,-20}", "VIDEO NAME", "YEAR PRODUCED", "RUNNING TIME", "RATING"), New Font("Courier", 12, FontStyle.Bold), Brushes.Black, 10, 70)
Using reader As New StreamReader("testing.txt")
Dim intVertPosition As Integer = 90
While Not reader.EndOfStream
Dim videoName As String = reader.ReadLine()
Dim yearProduced As String = reader.ReadLine()
Dim runningTime As String = reader.ReadLine()
Dim rating As String = reader.ReadLine()
Dim extraline As String = reader.ReadLine()
e.Graphics.DrawString(String.Format("{0, -30} {1,30} {2, 30} {3,30}", videoName.ToString(), yearProduced.ToString(), runningTime.ToString(), rating.ToString()), New Font("Courier", 12, FontStyle.Regular), Brushes.Black, 10, intVertPosition)
intVertPosition += 14
End While
End Using
End Sub
答案 0 :(得分:2)
e.Graphics.DrawString(..., New Font("Courier", 20, FontStyle.Bold), ...)
这是问题的开始。如果空格的宽度与字母的宽度相同,则此类格式化只能正常工作。或者换句话说,它需要固定间距字体。但是你可以从屏幕截图中清楚地看出你有一个按比例调整的字体。因此,粗略地说,第一列中的文本越多,它推出下一列的次数就越多。
这是因为你选择了“Courier”。它是遗留设备字体的名称,仅在27年前编写的程序中有用。 Graphics.DrawString()需要可缩放的字体轮廓,True-Type字体是特定的,并且不能使用设备字体。所以字体映射器开始提供替代方案,遗憾的是它不够聪明,无法识别你想要一个固定间距的字体。
使用“Courier New”代替修复问题。