【问题标题】:Use PrintDocument to print each row in DataTable to seperate page使用 PrintDocument 打印 DataTable 中的每一行以分隔页面
【发布时间】:2014-07-31 22:29:37
【问题描述】:

我有一个带有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. 表格中的每一行(最后一行除外,如果只有一行)打印在同一页上。

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

我们将不胜感激任何有关使其发挥作用的帮助或建议。

【问题讨论】:

    标签: c# printing datagridview datatable printdocument


    【解决方案1】:

    您似乎误解了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 永远不能根据您的逻辑设置为 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
    
    
    
    }
    

    【讨论】:

      【解决方案2】:

      这里的问题部分是你的逻辑。

              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,因此永远不会打印超过一页。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多