我有一个DataTable
的应用程序,我需要将DataTable
中的每一行打印到一个单独的页面中,我有一段时间试图让它工作。我发现了大量与打印多个页面和打印DataGridViews 相关的帖子,但我找不到有关打印{{每行]的任何信息。 1}}分隔页面。
无论如何,这是我到目前为止所放在一起的东西,它并没有很好用。
DataTable
所以,这就是它对上面代码的作用:
所以基本上我的预览看起来就像我将相同的纸张多次送入打印机并打印在它上面。
任何有关使其发挥作用的帮助或建议都将受到极大的赞赏。
答案 0 :(得分:1)
这里的问题部分是你的逻辑。
if (PrintRow >= _dtTags.Rows.Count)
{
e.HasMorePages = PrintRow < _dtTags.Rows.Count;
return; //Done Printing
}
这是您设置e.HasMorePages的唯一地方。如果PrintRow大于或等于_dtTags的行数,则设置e.HasMorePages的语句将始终为false,因为它会询问PrintRow是否小于该行数。 e.HasMorePages设置为true并返回时将导致再次调用该处理程序。如果您想要更多页面,则需要在某处设置为true,如果要停止打印则需要设置为false。您的主要问题是e.HasMorePages永远不能用您的逻辑设置为true,因此永远不会打印多个页面。
答案 1 :(得分:1)
您似乎误解了PrintPage
事件是如何运作的。
e.HasMorePages
事件中的PrintPage
表示是否应打印其他页面,因此是否应再次提出PrintPage
事件。
@rleffler指出,设置e.HasMorePages
的逻辑是错误的。
PrintRow++;
if (PrintRow >= _dtTags.Rows.Count)
{
e.HasMorePages = PrintRow < _dtTags.Rows.Count;
return; //Done Printing
}
e.HasMorePages永远不能用你的逻辑设置为true,因此 永远不会打印多页。
PrintRow
号码必须在打印前重置,而不是在PrintPage
事件内重置。
PrintRow
值-1)。private void btnPrint_Click(object sender, EventArgs e)
{
printTag.DefaultPageSettings.Landscape = true;
PrintPreviewDialog preview = new PrintPreviewDialog();
// Reset before printing
PrintRow = 0;
preview.Document = printTag;
preview.Show();
}
private void printTag_PrintPage(System.Object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
//Here I set my Fonts, String Formats and Pen Styles
int maxRows = _dtTags.Rows.Count;
if (maxRows == 0) {
return;
}
PrintRow++;
e.HasMorePages = PrintRow < _dtTags.Rows.Count;
int lines = PrintRow - 1;
var row = _dtTags.Rows(lines);
//Pass data from current Row of DataTable to variables which are used to populate the e.Graphic
jobNum = _dsTags.Tables["Paint Tags"].Rows[lines].Field<string>("Job");
machInfo = _dsTags.Tables["Paint Tags"].Rows[lines].Field<string>("Job Desc");
jobNote = _dsTags.Tables["Paint Tags"].Rows[lines].Field<string>("Job Note");
color = _dsTags.Tables["Paint Tags"].Rows[lines].Field<string>("Color");
parts = _dsTags.Tables["Paint Tags"].Rows[lines].Field<string>("Parts");
empName = _dsTags.Tables["Paint Tags"].Rows[lines].Field<string>("Employee");
//Here my e.Graphic is created, located and filled out
}