0

我想打印一个 html 报告时遇到了这个特殊的问题。该文件本身是一个普通的本地 html 文件,位于我的硬盘上。

为此,我尝试了以下方法:

    public static void PrintReport(string path)
    {
        WebBrowser wb = new WebBrowser();
        wb.Navigate(path);
        wb.ShowPrintDialog()
    }

我有一个带有点击事件按钮的表单:

    private void button1_Click(object sender, EventArgs e)
    {
        string path = @"D:\MyReport.html";
        PrintReport(path);
    }

这绝对没有任何作用。这有点奇怪……但事情变得更奇怪了……

编辑打印功能时执行以下操作:

    public static void PrintReport(string path)
    {
        WebBrowser wb = new WebBrowser();
        wb.Navigate(path);
        MessageBox.Show("TEST");
        wb.ShowPrintDialog()
    }

有用。是的,只添加一个 MessageBox。MessageBox 正在显示,然后是打印对话框。我也尝试过使用 Thread.Sleep(1000) 代替,但它不起作用。谁能向我解释这里发生了什么?为什么消息框会有任何不同?

可能是某种许可问题吗?我已经在 Windows 7 和 8 上重现了这个,同样的事情。我只用上面的代码制作了这个小应用程序来隔离问题。我很确定它可以在 Windows XP 上运行,因为我正在处理的应用程序的旧版本在它上面运行。当尝试直接使用 mshtml-dll 执行此操作时,我也会遇到问题。

非常感谢任何输入或澄清!

4

1 回答 1

2

问题是浏览器还没有准备好打印。您需要将事件处理程序 WebBrowserDocumentCompletedEventHandler 添加到 WebBrowser 对象。下面的示例代码。

public static void PrintReport(string path)
{
    WebBrowser wb = new WebBrowser();
    wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
    wb.Navigate(path);
}

public static void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    WebBrowser wb = (WebBrowser)sender;
    if (wb.ReadyState.Equals(WebBrowserReadyState.Complete))
        wb.ShowPrintDialog();
}
于 2012-12-11T23:02:02.790 回答