gpt4 book ai didi

c# - 使用 Print Document 将 DataTable 中的每一行打印到单独的页面

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:49 38 4
gpt4 key购买 nike

我有一个 DataTable 的应用程序我需要打印 DataTable 中的每一行到一个单独的页面,我正在努力让它工作。我发现了很多与打印多于一页打印 DataGridViews 相关的帖子,但我找不到任何关于在 DataTable 中打印每一行的信息分隔页面。

无论如何,这就是我到目前为止所做的一切,但效果并不理想。

private void btnPrint_Click(object sender, EventArgs e)
{
printTag.DefaultPageSettings.Landscape = true;
PrintPreviewDialog preview = new PrintPreviewDialog();
preview.Document = printTag;
preview.Show();
}

private void printTag_PrintPage(System.Object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
PrintRow = 0;
//Here I set my Fonts, String Formats and Pen Styles

int maxRows = _dtTags.Rows.Count;
for (int lines = 0; lines < maxRows; ++lines)
{
PrintRow++;
if (PrintRow >= _dtTags.Rows.Count)
{
e.HasMorePages = PrintRow < _dtTags.Rows.Count;
return; //Done Printing
}

var row = _dtTags.Rows[PrintRow];

//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

}
}

因此,这是它对上述代码的作用:

  1. 如果我的表格只有一行,打印预览会变成空白。
  2. 如果我的表有多行,则不会打印最后一行。
  3. 表格中的每一行(最后一行除外,如果只有一行)打印在同一页上。

所以基本上我的预览看起来就像我将同一张纸多次送入打印机并在上面打印。

如能提供任何帮助或建议,我们将不胜感激。

最佳答案

您似乎误解了 PrintPage 事件的工作原理。PrintPage 事件中的 e.HasMorePages 指示是否应打印额外的页面,因此是否应再次引发 PrintPage 事件。

  • 正如@rleffler 指出的那样,设置e.HasMorePages 的逻辑是错误的。

    PrintRow++;
    if (PrintRow >= _dtTags.Rows.Count)
    {
    e.HasMorePages = PrintRow < _dtTags.Rows.Count;
    return; //Done Printing
    }

    e.HasMorePages can never be set to true with your logic, and therefore will never print more than one page.

  • PrintRow 编号必须在打印前重置,而不是在 PrintPage 事件中。

  • 无需在 PrintPage 事件中迭代 DGV 行,只需获取与其索引对应的当前行(在本例中,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



}

关于c# - 使用 Print Document 将 DataTable 中的每一行打印到单独的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25069994/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com