Vb.net 如何在VB中格式化打印报告的结构数组?
我正在开发一个程序,该程序接受来自文本框的输入,并将该输入放入一个结构数组中。这些结构包括一个名称字符串变量、一个5个双精度数组,最后是一个保存前一个数组中值平均值的双精度数组。我试图将整个结构数组发送到一个可打印的报告中,但在为打印机格式化如此大量的数据时遇到了很大的困难。为了更好地解释我的困难,以下是我迄今为止所写的内容:Vb.net 如何在VB中格式化打印报告的结构数组?,vb.net,Vb.net,我正在开发一个程序,该程序接受来自文本框的输入,并将该输入放入一个结构数组中。这些结构包括一个名称字符串变量、一个5个双精度数组,最后是一个保存前一个数组中值平均值的双精度数组。我试图将整个结构数组发送到一个可打印的报告中,但在为打印机格式化如此大量的数据时遇到了很大的困难。为了更好地解释我的困难,以下是我迄今为止所写的内容: 'Print the report header e.Graphics.DrawString("Class Report",
'Print the report header
e.Graphics.DrawString("Class Report",
New Font("Courier New", 12, FontStyle.Bold),
Brushes.Black,
150,
10)
e.Graphics.DrawString("Date and Time: " & Now.ToString(),
New Font("Courier New", 12, FontStyle.Bold),
Brushes.Black,
10,
38)
'Prints the column headers
e.Graphics.DrawString(String.Format("{0, 20} {1, 20} {2, 20}",
"Name",
"Test Scores",
"Average"),
New Font("Courier New", 12, FontStyle.Bold),
Brushes.Black,
10,
66)
'prints the data
For intCount = 0 To 5
e.Graphics.DrawString(String.Format("{0, 20} {1, 5} {2, 5} {3, 5} {4, 5} {5, 5} {6, 5} {7, 20}",
ClassScores(intCount).strName,
ClassScores(intCount).dblTestScores(0),
ClassScores(intCount).dblTestScores(1),
ClassScores(intCount).dblTestScores(2),
ClassScores(intCount).dblTestScores(3),
ClassScores(intCount).dblTestScores(4),
ClassScores(intCount).dblTestAvg),
New Font("Courier New", 12, FontStyle.Regular),
Brushes.Black,
150,
165)
Next
现在,这段代码抛出system.format异常。这让我难以置信地困惑,因为之前我相当确定我在尝试对打印的内容进行一些更改(即将结构转换为并行字符串数组)之前就已经有了这段代码,但是我放弃了这一尝试,尝试返回到代码的前一版本,显然没有成功
也就是说,当我实际使用代码时,打印的文档有很多问题。例如,标题行没有居中,而是挂在文档的右上角。第二,当打印实际数据时,所有数据都打印在一行上,一列中的名称和另一列中的所有数字都打印在彼此的顶部。具体列举我寻求帮助的内容:
非常感谢。这个程序有很多可移动的部分,因此如果您想了解我正在处理的数据类型的更多上下文,请告诉我,因为我不知道我提供的信息有多大帮助。问题似乎是,您传递给第二个
字符串的格式说明符。format
调用需要八个值(索引0到7)而你只通过了7次(1次姓名,5次分数,1次平均分)。您的格式说明符应为:
{0,20}{1,5}{2,5}{3,5}{4,5}{5,5}{6,20}
而不是
{0,20}{1,5}{2,5}{3,5}{4,5}{5,5}{6,5}{7,20}
1.错误信息是什么?2。您正在为绘制
字符串的位置指定X和Y坐标。如果你想让每一行在页面的下方更远,那么Y坐标就需要增加。您正在指定每列的宽度和对齐方式。正宽度表示右对齐,负宽度表示左对齐。如果您有五列宽度为5的分数,那么这些列的标题需要为5x5+4=29,而您只指定了20。不要反复创建Font
对象。它们都是相同的,所以只需创建一个并重用它。另外,当你处理完它时,你应该处理掉它。为此,使用
语句创建一个,然后它将隐式地放置在块的末尾。关于增加绘制记录的Y坐标,因为您处于
For循环中,显然,要做的事情是将循环计数器乘以行高,然后将其添加到基Y值中。对于等待,我深表歉意。1.该异常是一个System.Format异常,其内容为“索引(基于零的)必须大于或等于零且小于参数列表的大小”。此答案修复了该异常,但是所有数据仍落在一行上,并且前两个标题仍然拼错