【问题标题】:How to add print dialog to the printpreviewdialog?如何将打印对话框添加到 printpreviewdialog?
【发布时间】:2016-10-25 09:28:04
【问题描述】:

我的老板要我创建具有打印功能的窗体,但他想在预览后打印datagridview

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

为什么printpreviewdialogprintdialog 只能用于不同的按钮?在需要单击一个按钮预览并单击另一个按钮打印多组和更改打印机时缺乏可用性。

谁能帮帮我?

打印对话框

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

打印预览对话框

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

【问题讨论】:

  • 我不太确定你的目标是什么。您想单击启动打印对话框并将其中的所有更改反映到预览中吗?所以你同时启动两个窗口?
  • 习惯上在查看预览之前选择纸张尺寸和打印机。鉴于预览将在很大程度上取决于纸张尺寸和打印机功能。这就是 PrintPreviewDialog 没有这些按钮的原因。使用 PrintPreviewControl 制作您自己的自定义对话框,但请考虑一下。

标签: c# printing datagridview


【解决方案1】:

我知道已经晚了,但我认为仍然有人需要它。 正如 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());
    }
}

【讨论】:

  • 仅在客户端 PC 上,使用 PrintPreviewDialog 时显示正确的结果,但是当我尝试打印时,文档内容大小会增加并被纸张修剪(即使我尝试将其打印到“Microsoft print to Pdf”打印机)
【解决方案2】:

效果很好... 给点建议... 您可以通过以下方式重复使用当前图标:

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

sn-p 的其余部分:

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

【讨论】:

    【解决方案3】:

    上面@AceIndy 提供的sn-p 不考虑用户是否更改了默认打印机或其设置。我就是这样解决这个问题的:

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

    【讨论】:

    • Stephen ...我想谈谈降价...我认为降价是不公平的,因为所有编辑都是我的话“我希望这会有所帮助.. . " ...特别是因为这些精确的词被用于本网站的大量答案中...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多