【问题标题】:C# WinForm PrintPreviewDialog: Print Preview to Display Multiple Labels Per PageC# WinForm PrintPreviewDialog:打印预览以每页显示多个标签
【发布时间】:2011-04-28 05:58:19
【问题描述】:

我有一个用于创建标签的 WinForm。

它调用PrintPreviewDialog 并使用PrintDocumentPrintPageEventHandler 中的PrintPageEventArgs 显示信息。

void Document_Printed(object sender, PrintPageEventArgs e) {
  // Code goes here
}

如果标签是指向 8.5x11 字母的小地址标签,而不是在 PrintPreviewDialog 中看到单个标签,我想查看适合 PageSettings.PaperSize 的标签数量。

示例:假设四 (4) 个项目适合所选介质(Avery 打印机标签或任何东西)。

  • 如果我的最终用户指定要打印 1 到 4 个副本,我希望我的打印预览对话框显示所有副本。

  • 如果我的最终用户指定的项目超过四 (4) 个,打印预览对话框应该显示多个页面(我以前从未处理过多个页面)。

我可以调整我的数据大小以适合我的标签大小,但我不知道如何让我的PrintPageEventHandlerPrintPreviewDialog 上显示多个标签。

有人可以告诉我这是怎么做到的吗?如何在每张工作表中显示和打印多个标签(文档?)?

编辑:这是我的代码,它基于 2 个 RectangleF 对象:pageRect 和 LabelRect:

void Document_Printed(object sender, PrintPageEventArgs e) {
  if (printPreview == null) return;
  int labelSupport = 1;
  RectangleF pageRect = new RectangleF(0, 0, printPreview.Document.DefaultPageSettings.PaperSize.Width, printPreview.Document.DefaultPageSettings.PaperSize.Height);
  float fW = (pageRect.Width < LabelRect.Width) ? (pageRect.Width / LabelRect.Width) : (LabelRect.Width / pageRect.Width);
  float fH = (pageRect.Height < LabelRect.Height) ? (pageRect.Height / LabelRect.Height) : (LabelRect.Height / pageRect.Height);
  // START Portion I need HELP with!
  if (1 < LabelsPerPage) {
    if (Landscape) {
    } else {
    }
  } else {
    if (Landscape) {
    } else {
    }
  }
  // END (I think) Portion I need HELP with!
  SizeF ratio = new SizeF(fW, fH);
  Graphics G = e.Graphics;
  foreach (Label item in labelList) {
    Console.WriteLine(item.Name);
    using (SolidBrush b = new SolidBrush(Color.Black)) {
      using (Pen p = new Pen(b)) {
        float x = ratio.Width * (float)item.Location.X;
        float y = ratio.Height * (float)item.Location.Y;
        float w = ratio.Width * (float)item.Size.Width;
        float h = ratio.Height * (float)item.Size.Height;
        RectangleF r = new RectangleF(x, y, w, h);
        G.DrawString(item.Text, item.Font, b, r);
      }
    }
  }
}

编辑 2: 我需要一种方法在一页上打印 2 个或更多文档。到目前为止,还没有解决这个关键点。这就是我需要的答案。

【问题讨论】:

  • 看看你的 PrintPageEventHandler 的一些渲染代码可能会很有用
  • 明白。从 EDIT: 部分开始添加了一个代码示例。
  • 这看起来不错。不过,我会在方法的顶部放置一个断点,并逐行遍历它,以确保您期望发生的事情实际上正在发生。例如,您的绘图循环中的每个项目的大小和位置值是否都在变化?看起来应该是这样,但如果您没有在其他地方正确分配这些值,那么您可能会再次绘制相同的内容,或者在之前的标签之上绘制每个新标签。
  • 哈哈。对于那个很抱歉。我正在尝试让此代码打印多份。当你请求代码时,我粘贴了我现在屏幕上的内容,并删除了不相关的内容。
  • 如果您指的是 labelList 中每个项目的大小和位置,则这些 不应 在调用此 Print Preview 包装器时传入,因为它们不会发生变化。

标签: c# winforms print-preview


【解决方案1】:

在第一个页面之后打印实际上很容易做到:只需将 PrintPageEventArgs HasMorePages property 设置为 true。

棘手的部分是通过将 HasMorePages 设置为 false 来知道何时停止此操作。为此,我将每个打印作业的数据存储在一个列表中,并使用索引值来跟踪我在此列表中的位置。

每次 PrintPage 事件触发时,我都会增加我在 List 中使用的索引,以向 PrintPage 事件提供我想要打印的页面的详细信息,如果我在最后一个元素上,我将 HasMorePages 设置为 false。

void Document_Printed(object sender, PrintPageEventArgs e) { 
   // Get data for this page.
   //xxx =  pageDataList[indexValue];

   // Code to print stuff.

   indexValue++;
   e.HasMorePages = (pageDataList.Length == indexValue);
}

这种方法也适用于您,也许与我在您的代码中看到的 labelList 一起使用。由于您将分四批打印,显然您必须稍微调整一下逻辑,但我想您明白了。

【讨论】:

  • 你知道,我看到了HasMorePages 属性,但我只是查看它,而不是设置它。
  • 老鼠。按 [CR] 提交评论而不是中断到下一行。 {叹气!}无论如何,我会试试这个,看看我是否可以在一张 8.5x11 的纸上打印/显示多个小标签。
  • 我不得不将我的 virtual 页面缩小到我想在屏幕上显示的页面数量,但否则这确实有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多