PrintPreviewDialog修改可能吗?

时间:2010-05-12 18:22:19

标签: c# printing dialog preview

目前,我正在做的是:

  1. 使用内置的.NET PrintPreviewDialog
  2. 将我自己的Click处理程序附加到Print按钮,允许用户在最终打印之前选择打印机。
  3. 这一切都工作,但OnprintToolStripButtonClick事件仍在将文档发送到默认打印机之前,用户可以选择实际的打印机并单击打印(这有效,但是他们首先在默认打印机上获得一个额外的副本来自旧的汉德勒。)

    我可以删除此内置Click处理程序吗?我已经尝试了这里提到的其他方法,关于使用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();
       }
    }
    

2 个答案:

答案 0 :(得分:6)

由于您可以访问工具栏中的按钮,因此请删除旧的打印按钮并添加自己的按钮。从默认打印按钮分配图像,您已全部设置。代码看起来像这样:

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);

答案 1 :(得分:1)

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

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

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

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

你可以在Code-Project(CoolPrintPreviewDialog)找到一些PrintPreview的对话框。增强的PrintPreviewDialog。

在我的PrvDialog上,当用户按下Print按钮时,我会显示一个PageSelDialog,允许用户选择Range to Print(当前页面,Some Pages,All-Pages,Cancel)。

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

对于此选项,您需要知道什么时候是PrintToPrinter,预览或从PrintButon打印。 PrintController.IsPreview,解析预览选项。