首页 > 解决方案 > 如何关闭打印预览对话框?

问题描述

我有文件打印功能。我试图在用户按下打印按钮后关闭打印预览对话框表单。一旦按下打印预览对话框中的打印按钮,事件就会启动下面的函数来打印文档。我希望当我打电话时表格会关闭,printPreviewDialog1.Close()但它只是越界了,什么也没有发生。

但它不会在打印作业完成后关闭打印预览对话框。

    public void _start_Print(object sender, EventArgs e)
    {
        printDocument1.Print();

    }

根据评论中的要求添加。初始化打印预览对话框

    private void btnPrint_Click(object sender, EventArgs e)
    {
        PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog();
        printPreviewDialog1.Document = printDocument1;

        ToolStrip ts = new ToolStrip();
        ts.Name = "wrongToolStrip";
        foreach (Control ctl in printPreviewDialog1.Controls)
        {
            if (ctl.Name.Equals("toolStrip1"))
            {
                ts = ctl as ToolStrip;
                break;
            }
        }

        ToolStripButton printButton = new ToolStripButton();
        ToolStripButton closeButton = new ToolStripButton();

        foreach (ToolStripItem tsi in ts.Items)
        {
            if (tsi.Name.Equals("printToolStripButton"))
            {
                printButton = tsi as ToolStripButton;
            }
            else if (tsi.Name.Equals("closeToolStripButton"))  // idk if this is the name of the close button im trying to programmatically close it after printing
            {
                closeButton = tsi as ToolStripButton;
            }
        }

        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._start_Print);

        printPreviewDialog1.WindowState = FormWindowState.Maximized;
        printPreviewDialog1.ShowDialog();
        printPreviewDialog1.Dispose(); //< doesnt do anything 
        closeButton.PerformClick(); // < doesn't do anything, possibly using wrong name for toolstripbutton

    }

按照评论中的要求初始化打印文档

    private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
        e.Graphics.DrawRectange(Pens.Black, 60, 60, 60,60);
    }

标签: c#.net

解决方案


解决了。

我创建了一个全局ToolStripButtoncloseToolStripButton使用printPreviewDialog.

然后我在打印作业完成后以编程方式单击此按钮。

    private ToolStripButton closeButton = new ToolStripButton();  <-- global variable

    private void btnPrint_Click(object sender, EventArgs e)
    {
        foreach (ToolStripItem tsi in ts.Items)
        { 
            if (tsi.Name.Equals("closeToolStripButton"))
            {
                closeButton = tsi as ToolStripButton;
            }
            else if (tsi.Name.Equals("printToolStripButton"))
            {
                printButton = tsi as ToolStripButton;
            }
        }

        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._start_Printer); //<-- this starts the printer event where i "PerformClick() on the initialized closeButton"

        printprevDialog.WindowState = FormWindowState.Maximized;
        printprevDialog.ShowDialog();

    }


    public void _start_Printer(object sender, EventArgs e) // <--- then i just performed the close click here right after i hit the print button
    {
        printDocument1.Print();
        closeButton.PerformClick(); // <-- this way im not violating cross thread operations
    }

推荐阅读