PrintPreviewDialog Модификация возможна? - PullRequest
5 голосов
/ 12 мая 2010

В настоящее время я делаю следующее:

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

Это все РАБОТАЕТ, ОДНАКО, событие 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();
   }
}

Ответы [ 2 ]

6 голосов
/ 12 мая 2010

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

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 голос
/ 28 июня 2010

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

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

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

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

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

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

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

Для этого параметра вам необходимо знать, когда используется PrintToPrinter, Preview или Print From PrintButon. PrintController.IsPreview, разрешение для предварительного просмотра.

...