如何将打印对话框添加到printpreviewdialog?

我的老板要我创建具有打印function的窗体,但他希望在预览后打印datagridview

所以现在我鼓励这个问题,当我点击printpreviewdialog上的打印按钮时,我无法打印多套纸张或选择打印机或进行任何更改。当我点击按钮时,它将直接打印纸张。 所以我希望加入printpreviewdialogprintdialog

为什么printpreviewdialogprintdialog只能用于不同的按钮? 当需要单击一个按钮进行预览并单击另一个按钮来打印多个设置并更改打印机时,缺乏可用性。

任何人都可以帮助我吗?

PrintDialog类

 DialogResult result = printDialog1.ShowDialog(); // If the result is OK then print the document. if (result == DialogResult.OK) { position = 0; pageno = 1; printDocument2.DefaultPageSettings.Margins = new Margins(20, 20, 20, 20); printDocument2.OriginAtMargins = true; printPreviewDialog1.Document = printDocument2; printPreviewDialog1.ShowDialog(); } 

PrintPreviewDialog上

 printDocument3.DefaultPageSettings.Margins = new Margins(20, 20, 20, 20); printDocument3.OriginAtMargins = true; //((ToolStripButton)((ToolStrip)printPreviewDialog1.Controls[1]).Items[0]).Enabled = false; printPreviewDialog1.Document = printDocument3; printPreviewDialog1.ShowDialog(); 

我知道现在已经晚了,但我认为有人仍然需要这样做。 正如Hans Passant所说,“打印预览在很大程度上取决于打印机和页面设置。” 但是printpreviewdialog中有一个打印按钮,对于大多数情况来说仍然是合理的。 但该按钮直接打印到您的默认打印机,从不显示对话框。 如果需要printpreview对话框中的打印对话框,则只需操作PrintPreviewDialog的ToolStrip即可。

在这里(假设你初始化了printPreviewDialog1,printDialog1和printDocument1对象)

 printPreviewDialog1.Document = printDocument1; ToolStripButton b = new ToolStripButton(); b.Image = Properties.Resources.PrintIcon; b.DisplayStyle = ToolStripItemDisplayStyle.Image; b.Click += printPreview_PrintClick; ((ToolStrip)(printPreviewDialog1.Controls[1])).Items.RemoveAt(0); ((ToolStrip)(printPreviewDialog1.Controls[1])).Items.Insert(0, b); printPreviewDialog1.ShowDialog(); 

使用上面的代码,您可以删除PrintPreview的ToolStrip上的默认打印按钮,并将其替换为新创建的“打印按钮”。 此按钮现在具有Click事件处理程序,通过使用它,您可以显示PrintDialog。

 private void printPreview_PrintClick(object sender, EventArgs e) { try { printDialog1.Document = printDocument1; if (printDialog1.ShowDialog() == DialogResult.OK) { printDocument1.Print(); } } catch (Exception ex) { MessageBox.Show(ex.Message, ToString()); } } 

效果很好……有一个提示……您可以通过以下方式重新使用当前图标:

 this.ToolStripButton.Image = ((System.Windows.Forms.ToolStrip)(printPreviewDialog.Controls[1])).ImageList.Images[0]; 

片段的其余部分:

  { this.ToolStripButton = new System.Windows.Forms.ToolStripButton(); this.ToolStripButton.Image = ((System.Windows.Forms.ToolStrip)(printPreviewDialog.Controls[1])).ImageList.Images[0]; this.ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.ToolStripButton.Click += new System.EventHandler(this.printPreview_PrintClick); ((System.Windows.Forms.ToolStrip)(printPreviewDialog.Controls[1])).Items.RemoveAt(0); ((System.Windows.Forms.ToolStrip)(printPreviewDialog.Controls[1])).Items.Insert(0, ToolStripButton); } private void printPreview_PrintClick(object sender, System.EventArgs ee) { try { this.printDialog.Document = printDocument; if (printDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { printDocument.Print(); } } catch (System.Exception ex) { System.Windows.MessageBox.Show(ex.Message, ToString()); } } private System.Windows.Forms.ToolStripButton ToolStripButton; 

上面的@AceIndy提供的代码段不会考虑用户是否更改默认打印机或其设置。 这就是我解决这个问题的方法:

 private void printPreview_PrintClick(object sender, EventArgs e) { try { printDialog.Document = printDocument; if (printDialog.ShowDialog() == DialogResult.OK) { printDocument.PrinterSettings = printDialog.PrinterSettings; printDocument.Print(); } } catch (Exception ex) { MessageBox.Show(ex.Message, ToString()); } }