使用PrintDocument将DataTable中的每一行打印到单独的页面

时间:2014-07-31 22:29:38

标签: c# printing datagridview datatable printdocument

我有一个DataTable的应用程序,我需要将DataTable中的每一行打印到一个单独的页面中,我有一段时间试图让它工作。我发现了大量与打印多个页面打印DataGridViews 相关的帖子,但我找不到有关打印{{每行]的任何信息。 1}}分隔页面。

无论如何,这是我到目前为止所放在一起的东西,它并没有很好用。

DataTable

所以,这就是它对上面代码的作用:

  1. 如果我的表只有一行,则打印预览显示为空白。
  2. 如果我的表格有多行,则最后一行不会打印。
  3. 表格中的每一行(除了最后一行,如果只有一行)打印在同一页面上。
  4. 所以基本上我的预览看起来就像我将相同的纸张多次送入打印机并打印在它上面。

    任何有关使其发挥作用的帮助或建议都将受到极大的赞赏。

2 个答案:

答案 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事件内重置。

  • 无需在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



}