C# System.Windows.Forms.WebBrowser控件以显示pdf

C# System.Windows.Forms.WebBrowser控件以显示pdf,c#,winforms,browser,.net-2.0,C#,Winforms,Browser,.net 2.0,有没有办法查询IE插件(Adobe Reader)的状态?我的情况是,我们通过一个由选项卡页面托管的嵌入式浏览器(基于我的研究,这是首选模式)向用户呈现许多多页报告。当用户离开报表时(通常是为了修改数据),他们会返回重新初始化的Adobe Reader。这意味着它们的位置已丢失,扩展的书签节点已折叠 下面是一个简化的代码片段,我希望它能充分表达我问题的本质 Public partial class ReportView : UserControl { private System.Wi

有没有办法查询IE插件(Adobe Reader)的状态?我的情况是,我们通过一个由选项卡页面托管的嵌入式浏览器(基于我的研究,这是首选模式)向用户呈现许多多页报告。当用户离开报表时(通常是为了修改数据),他们会返回重新初始化的Adobe Reader。这意味着它们的位置已丢失,扩展的书签节点已折叠

下面是一个简化的代码片段,我希望它能充分表达我问题的本质

Public partial class ReportView : UserControl
{ 
    private System.Windows.Forms.WebBrowser webBrowser; 
    private MyNamespace.ReportGenerator reportGen;  
    private String currentPDFtempPath; 

    public ReportView() 
    {
        InitializeComponent();
        this.Leave += (o, e) => { /*how can I save current place in pdf?*/ };
        this.Enter += (o, e) => { /*return user last place in large pdf*/ };
    }

    public void ViewReport(string reportName)
    {
        currentPDFtempPath = reportGen.GetReport(reportName);
        webBrowser.Navigate(currentPDFtempPath);
    }

    private void RefreshReport()
    {
        webBrowser.Navigate(currentPDFtempPath); /*reinitializes Adobe Reader*/
    }
}

public class ReportController
{
    private DataModel model;
    private ReportView view;

    ReportController(DataModel m, ReportView v)
    {
        this.model = m;
        this.view = v;

        model.Changed += (o, e) => { view.RefreshReport(); }
    }
}

如果您的用户群已标准化为Acrobat的一个版本,或不断更新为最新和最优秀的Acrobat,另一种解决方案是取消webbrowser控件,并添加对AcroPDF/AxAcroPDF库/active x控件的引用,该控件可从windows窗体工作。在过去的6年里,我一直在我的公司里使用它,它工作得非常完美。

很难理解这段代码的意义。只需删除Enter事件处理程序。当对模型数据进行更改时,需要重新生成报告。真正的代码通过控制器进行不同的处理,但我认为这是表达我试图实现的本质的最简洁的方式。只需调用ViewReport来显示另一个报告。Enter事件不会修改模型数据,因此不应重新生成报告。我根据您的评论修改了代码,以提供更准确的表示。有一个控制器类,最初为了简洁而省略,它修改模型并更新视图。用户群远未标准化,但我曾考虑将特定版本的Adobe Reader与我的安装捆绑在一起,并使用active x控件。尽管这需要进行一次重大的重写,但我很难找到activex控件的API参考,我在一个线程上看到一条评论,即较新版本的adobereader对此提供的支持较少。