PrintPage PrintPageEventHandler打印太多副本

时间:2012-04-23 20:12:18

标签: c# winforms printing

我必须为我们公司生产的产品打印运输标签。

为了让我自己了解这些标签的结果,我使用Windows窗体进行设计。这允许我使用Label控件定位文本,设置正确的字体等,添加自定义BarCode控件,并使用{{1获取“ fancy ”控件将项目分组到框中。

每个页面都有两(2)个标签。

当我的代码打印标签文档时,我要求2,4或6份副本。有时,也会使用“打印预览”。在这种情况下,我必须重置创建的标签数量。

然而,当文件打印时:

  • 如果请求是2份,则代码打印2张纸(4个标签)
  • 如果请求是4份,则代码打印8张纸(16个标签)
  • 如果请求是6份,则代码打印出18页(36个标签)

有没有人看到模式?我没有。

这是我的打印命令:

Panel

我必须编写一个自定义的PrintPreview类,它将public int Print(string docName, int rows, int columns, int copies) { short shortCopies = (short)copies; LabelsHorizontal = rows; LabelsVertical = columns; Size docSize = PrintPreview.Document.DefaultPageSettings.Bounds.Size; float height = 0.8F * Screen.PrimaryScreen.WorkingArea.Size.Height; float width = (height * docSize.Width) / docSize.Height; Size winSize = new Size((int)width, (int)height); PrintPreview.Height = winSize.Height; PrintPreview.Width = winSize.Width; if (!String.IsNullOrEmpty(docName)) { PrintPreview.Document.DocumentName = docName; } PrintPreview.Document.PrinterSettings.Copies = shortCopies; PrintPreview.SettingsFilename = Settings.PageSettingsLocation; if (!PrintPreview.PrinterSelected) { if (PrintPreview.ShowPrinterSelectDialog() != DialogResult.OK) { return 0; } } labelQtyPrinted = 0; if (ShowPrintPreview) { PrintPreview.ShowDialog(); } else { PrintPreview.PrintDocument(); } return labelQtyPrinted; } // Resets the Label Count between PrintPreview and Print private void PrintPreview_OnPrintClicked(object sender, EventArgs e) { labelQtyPrinted = 0; } 作为基类,以便我可以使用 printButton_Click 方法覆盖其Print按钮:

PrintPreviewDialog

// Handles the Printing of the Document internal void printButton_Click(object sender, EventArgs e) { if (OnPrintClicked != null) { OnPrintClicked(sender, e); // this resets my labelQtyPrinted value shown above } Document.Print(); printed = true; Close(); } 方法(第一段代码)中,Print只是调用PrintPreview.PrintDocument()事件的代码。

我的 PrintPageEventHandler 如下所示:

printButton_Click

总而言之,它运作良好。 “Run Away Printer”永远不会抛出异常。

那么,为什么要制作这么多副本?

打印机是HP LaserJet 4050,如果这有任何区别的话。

1 个答案:

答案 0 :(得分:3)

我知道了!

开心辞典!

好的,如果有人关心,这是交易:我需要每页打印两(2)个标签。

我需要做的是使用垂直和水平打印的标签数量来计算要打印的页数。

我添加了变量labelsRequested并将现有变量labelQtyPrinted更改为labelsPrinted

private int labelsPrinted;
private int labelsRequested;

我的公开Print方法更改为:

public int Print(string docName, int rows, int columns, int copies) {
  LabelsHorizontal = rows;
  LabelsVertical = columns;
  if (!String.IsNullOrEmpty(docName)) {
    PrintPreview.Document.DocumentName = docName;
  }
  labelsRequested = copies;
  //PrintPreview.Document.PrinterSettings.Copies = (short)copies;
  PrintPreview.SettingsFilename = Settings.PageSettingsLocation;
  if (!PrintPreview.PrinterSelected) {
    if (PrintPreview.ShowPrinterSelectDialog() != DialogResult.OK) {
      return 0;
    }
  }
  if (ShowPrintPreview) {
    Size docSize = PrintPreview.Document.DefaultPageSettings.Bounds.Size;
    float height = 0.8F * Screen.PrimaryScreen.WorkingArea.Size.Height;
    float width = (height * docSize.Width) / docSize.Height;
    Size winSize = new Size((int)width, (int)height);
    PrintPreview.Height = winSize.Height;
    PrintPreview.Width = winSize.Width;
    PrintPreview.Document.PrinterSettings.Copies = (short)labelsRequested; // this may cause problems
    PrintPreview.ShowDialog();
  } else {
    PrintPreview.PrintDocument();
  }
  return labelsPrinted;
}

现在,我没有像以前那样添加print_Click事件处理程序,而是将Document的{​​{1}}和BeginPrint连接起来,如下所示:

EndPrint

但是,这里的关键显然来自于我尝试在void Document_BeginPrint(object sender, PrintEventArgs e) { labelsPrinted = 0; float fPerPage = LabelsHorizontal * LabelsVertical; if (1 < fPerPage) { float fQty = labelsRequested; float fTotal = fQty / fPerPage; PrintPreview.Document.PrinterSettings.Copies = (short)fTotal; } } void Document_EndPrint(object sender, PrintEventArgs e) { Printed = (labelsPrinted == labelsRequested); } 事件处理程序中设置HasMorePages值。

“为什么?”你问。因为我只打印了相同的1页大小的文档的多个副本。 如果 我的一个文档要跨越多个页面,那么我需要确保PrintPage已设置。

不用多说,这是我的HasMorePages事件处理程序(请注意,很多代码都非常通用,可以轻松编辑以适用于其他代码):

PrintPage