В настоящее время то, что я делаю, является этим:
Это все РАБОТАЕТ, ОДНАКО событие 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();
}
}
Поскольку у вас есть доступ к кнопкам в наборе инструментов, удалите старую кнопку печати и добавьте свою собственную. Назначьте изображение с кнопки печати по умолчанию, и все готово. Код будет выглядеть примерно так:
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);
Я думаю, что замена кнопок или использование имен элементов управления из 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.