【问题标题】:Not closing a form with AxAcroPdf reader不使用 AxAcroPdf 阅读器关闭表单
【发布时间】:2017-02-18 07:03:12
【问题描述】:

我有一个带有pdf阅读器的winform控制AxAcroPdf阅读器,事情是在我将pdf文档检索到控制之后,当我想关闭表单时,完成事件大约需要30秒,我一直搜索问题,事件将Dispose()事件放到控件中,但无法在适当的时间内关闭表单,总是需要30秒左右才能关闭表单...

这是我拥有控制权的表单中的代码...

Private Sub cargarPdf(ByRef nombre_Archivo)
        Try
            AxAcroPDF1.Visible = True
            Dim con As SqlConnection = New SqlConnection(cadena)
            Dim comando As SqlCommand = con.CreateCommand()
            comando.CommandText = "SELECT file_stream FROM dbo.Tabla_archivos where name = @name"
            comando.Parameters.AddWithValue("@name", nombre_Archivo)
            con.Open()
            Dim dr As SqlDataReader = comando.ExecuteReader(CommandBehavior.CloseConnection)
            dr.Read()
            Dim bufferSize As Integer = Convert.ToInt32(dr.GetBytes(0, 0, Nothing, 0, 0))
            datos = New Byte(bufferSize - 1) {}
            dr.GetBytes(0, 0, datos, 0, bufferSize)
            dr.Close()
            WriteBinaryFile("C:\Cobit\" + nombre_Archivo, datos)
            AxAcroPDF1.src = "C:\Cobit\" + nombre_Archivo
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

这是基本形式的代码...

Private Sub BtnCerrar_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If NombreLbl.Text = "Vista Archivos de evidencia" Then
            Try
                Frm_vista_archivos_evidencia.AxAcroPDF1.Dispose()

            Catch ex As Exception
            End Try
        End If
        Me.Close()
    End Sub

具有控件的表单是从 Frm_base 派生的表单

【问题讨论】:

  • 我曾经遇到过这个问题,最后唯一对我有用的是在关闭它之前将读者的来源设置为不存在的文档,这似乎可以释放所有内容并允许读者关闭

标签: vb.net winforms


【解决方案1】:

在最近版本的 Acrobat Reader 中存在一个错误,该错误会导致在表单关闭时释放控件时出现延迟。似乎有一些链接可以打开 PDF 文档。您可以通过将其src 属性设置为不存在的PDF 文件来强制控件关闭文档;将其设置为 Nothing 或空字符串无效。此文档关闭技术的功劳归于 Adob​​e 论坛中的“kenstanley2014”How do I clear the file from AxAcroPDF object?。如果你先关闭文件然后关闭表单,它会很快关闭。但是,我发现这必须通过两个单独的 UI 交互,因为将它们放在相同的方法中会失败,就像设置 src 属性并使用计时器触发关闭命令一样。

无论出于何种原因,我决定看看隐藏表单是否会产生影响。确实如此!而且根本不需要设置src 属性。只需在 FormClosed 事件处理程序中将 Form 的 Visible 属性设置为 False。

Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    Me.Visible = False
End Sub

我不知道为什么会这样,您的体验可能会有所不同。 使用 Adob​​e Acrobat Reader DC 版本在 64 位 Windows 10 上测试。 15.023.20056.16516.

【讨论】:

  • 谢谢你,我会尝试这些方法,当我到办公室时会检查版本并在这里假设文档海豚会发生什么......谢谢你TnTinMn
  • 嗨@TnTinMn,我已经尝试将可见属性设置为false,但没有奏效,因为我正在使用子程序在应用程序中显示表单... form_1.showdialog(me) 和在下一行 form_1.dispose() 中,因此在关闭事件和关闭事件中不起作用。但是我在表单中编写了删除控件的代码,并且工作正常,我检查了几次并且根本没有崩溃。 acrobat的版本是2015.023.20056; os 是 windows 10 64 位。感谢您花时间阅读这些行...
  • @JorgeTorselli,如何显示包含 AxAcroPDF 控件的表单并不重要。 FormClosed 事件将触发。实际上,我只展示了表单事件的用法,因为这是大多数人使用的;我更喜欢重写引发事件的方法:Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs).
  • 我刚刚在关闭表单时发现了导致异常的原因,因为我之前使用 sub 写的内容,是的,你在正确的地方,我使用另一个事件犯了错误,但问题是,当我尝试使用在您的机器上工作的解决方案时,在表单关闭事件中,在我的机器上关闭表单需要 19 到 25 秒......唯一快速的方法是删除控制...
  • 即使我尝试使用 Overriding the event as you cocomed 但仍然相同的 19 到 25 秒来关闭表单... :( 是否有另一个可以读取 PDF 文件的控件,以避免使用 adobe读者...?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多