【问题标题】:PrintPreviewDialog Modification possible?PrintPreviewDialog 可以修改吗?
【发布时间】:2010-05-12 18:22:19
【问题描述】:

目前,我正在做的是:

  1. 使用内置的 .NET PrintPreviewDialog
  2. 将我自己的 Click 处理程序附加到“打印”按钮,允许用户在最终打印之前选择打印机。

这一切都有效,但是,在用户选择实际打印机并单击打印之前,OnprintToolStripButtonClick 事件仍在将文档发送到默认打印机(这有效,但他们首先在默认打印机上获得了额外的副本来自旧的处理程序)。

我可以删除这个内置的点击处理程序吗?我已经尝试过这里提到的关于使用 EventHandlerList 删除处理程序的其他方法,但它不适用于内置打印事件。这是我当前代码的副本,以防有助于澄清:

// ... Irrelevant code before this
private PrintPreviewDialog ppdlg;

ToolStrip ts = new ToolStrip();
ts.Name = "wrongToolStrip";
foreach (Control ctl in ppdlg.Controls)
{
   if (ctl.Name.Equals("toolStrip1"))
   {
      ts = ctl as ToolStrip;
      break;
   }
}
ToolStripButton printButton = new ToolStripButton();
foreach (ToolStripItem tsi in ts.Items)
{
   if (tsi.Name.Equals("printToolStripButton"))
   {
      printButton = tsi as ToolStripButton;
   }
}
printButton.Click += new EventHandler(this.SelectPrinterAfterPreview);
// ... Irrelevant code afterwards omitted


// Here is the Handler for choosing a Printer that gets called after the
// PrintPreviewDialog's "Print" button is clicked.
private void SelectPrinterAfterPreview(object sender, EventArgs e)
{
   frmMainPage frmMain = (frmMainPage)this.MdiParent;
   if (frmMain.printDialog1.ShowDialog() == DialogResult.OK)
   {
      pd.PrinterSettings.PrinterName = frmMain.printDialog1.PrinterSettings.PrinterName;
      pd.PrinterSettings.Copies = frmMain.printDialog1.PrinterSettings.Copies;
      pd.Print();
   }
}

【问题讨论】:

  • 感谢您的想法。我正在寻找一种方法来了解用户是否实际打印了文档,因为我保存了打印日期。在打印预览对话框上,它总是从 ShowDialog 调用返回 Cancel。我使用您的技术找到了打印按钮,然后向它添加了一个额外的事件处理程序。该事件处理程序设置一个标志,然后关闭对话框。这解决了另一个问题 - 当您从打印预览对话框打印时,您仍然必须单击关闭按钮。

标签: c# printing dialog preview


【解决方案1】:

由于您可以访问工具栏中的按钮,因此请移除旧的打印按钮并添加您自己的按钮。从默认打印按钮分配图像,一切就绪。代码看起来像这样:

ts.Items.Remove(printButton);
ToolStripButton b = new ToolStripButton();
b.ImageIndex = printButton.ImageIndex;
b.Visible = true;
ts.Items.Insert(0, b);
b.Click += new EventHandler(this.SelectPrinterAfterPreview);

【讨论】:

  • 完美!这就像一个魅力。我被困在使用他们的按钮的心态中,忽略了替换它的简单得多的想法。谢谢,安钱德拉!
【解决方案2】:

我认为替换按钮或使用 PrintPreviewDialog 中的控件名称不是一个好选择。

从 Net1 到 Net2 更改了工具栏的名称。下一个版本也可以更改它或其他控件的名称。

PrintPreviewDialog 是一个封装 PrintPreviewControl 的非常简单的 Form。

您可以构建一个新的表单并放置自己的按钮并实现您的功能。

您可以在 Code-Project (CoolPrintPreviewDialog) An Enhaced PrintPreviewDialog 中找到一些 PrintPreview 对话框。

在我的 PrvDialog 上,当用户按下打印按钮时,我会显示一个 PageSelDialog 以允许用户选择要打印的范围(当前页面、某些页面、所有页面、取消)。

其他解决方案是从 PrintDocument 覆盖 OnBeginPrint / 订阅事件 BeginPrint。 在这里您可以显示 PageSelDialog,取消打印并更改 DefaultPageSettings PrintRange、FromPage、ToPage。

对于此选项,您需要知道何时是 PrintToPrinter、Preview 或 Print From PrintButon。 PrintController.IsPreview,解析预览选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2012-08-18
    • 2013-02-20
    • 2019-01-30
    • 2011-11-13
    相关资源
    最近更新 更多