Возможная Модификация PrintPreviewDialog?

В настоящее время то, что я делаю, является этим:

  1. Используя встроенную.NET PrintPreviewDialog
  2. Присоединение моего собственного обработчика Щелчков к Кнопке печати, которая позволяет, чтобы пользователь выбрал принтер перед окончательной печатью.

Это все РАБОТАЕТ, ОДНАКО событие OnprintToolStripButtonClick все еще отправляет документ принтеру по умолчанию, ПРЕЖДЕ ЧЕМ пользователь доберется, чтобы выбрать реальный принтер и нажать Print (который работает, но они получают дополнительную копию на принтере по умолчанию сначала от старого Обработчика).

Я могу удалить этот встроенный обработчик Щелчков? Я попробовал другие методы, упомянутые на здесь в отношении использования 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();
   }
}
5
задан John Saunders 12 May 2010 в 19:42
поделиться

2 ответа

Поскольку у вас есть доступ к кнопкам в наборе инструментов, удалите старую кнопку печати и добавьте свою собственную. Назначьте изображение с кнопки печати по умолчанию, и все готово. Код будет выглядеть примерно так:

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);
6
ответ дан 14 December 2019 в 08:44
поделиться

Я думаю, что замена кнопок или использование имен элементов управления из PrintPreviewDialog - не лучший вариант.

При переходе от Net1 к Net2 меняется имя панели инструментов. Следующая версия также может изменить его или название других элементов управления.

PrintPreviewDialog - это очень простая форма для инкапсуляции PrintPreviewControl.

Вы можете создать новую форму, поместить в нее собственные кнопки и реализовать свои функции.

Вы можете найти некоторые диалоги для PrintPreview на Code-Project (CoolPrintPreviewDialog) An Enhanced PrintPreviewDialog.

В моем PrvDialog, когда пользователь нажимает кнопку Print, я показываю PageSelDialog, чтобы позволить пользователю выбрать диапазон для печати (текущая страница, несколько страниц, все страницы, отмена).

Другое решение - переопределить OnBeginPrint / подписать событие BeginPrint от PrintDocument. Здесь вы можете показать диалог PageSelDialog, отменить печать и изменить DefaultPageSettings PrintRange, FromPage, ToPage.

Для этого параметра необходимо знать, когда происходит печать на принтере, предварительный просмотр или печать из PrintButon. PrintController.IsPreview, разрешить для опции Preview.

1
ответ дан 14 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: