当Microsoft Access关闭时,如何在放置控件之前捕获CustomTaskPane的当前属性。??

问题描述 投票:0回答:1

我已经按照Microsoft大师Andrew Whitechapel here的指示为Microsoft Access创建了VSTO插件,并且运行良好。但是该插件具有CustomTaskPane,当Access关闭时,我遇到了问题。

如果在Access关闭时打开了CustomTaskPane,则该插件应保存CustomTaskPane控件的属性。如果将此代码放置在ThisAddIn_Shutdown()中,则会收到以下错误:

System.ObjectDisposedException: Cannot access a disposed object.
  at Microsoft.Office.Tools.CustomTaskPane.get_Control()
  at MyAddin.ThisAddIn.ThisAddIn_Shutdown(Object sender, EventArgs e) in C:\...\ThisAddIn.vb:line nn

我不确定这是否是CustomTaskPanes或Windows Forms控件的正常操作,还是因为VSTO不是为Access设计的。我想知道是否会发生这种情况,因为Access没有像Access.Application。“ OnClose”这样的应用程序级事件,其他VSTO批准的应用程序(如Excel&Word)也没有。

[经过一些实验之后,我发现通过对控件使用HandleDestroyed事件来发现变通方法,该事件发生在Dispose()之前,因此控件属性仍然可用。这有效:

Private Sub TextBox1_HandleDestroyed(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles TextBox1.HandleDestroyed
    MsgBox(TextBox1.Text)
End Sub

还有更好的方法吗?解决方法使我感到紧张。

vsto office-addins customtaskpane
1个回答
0
投票

[通过跟踪事件,我意识到了自己的问题的答案。焦点是Dispose中的usercontrol.designer.vb方法。但是,众所周知,不应直接修改设计者生成的代码,因为在对设计器中的用户控件进行任何后续更改之后,它可以并且将被刷新和覆盖。

除了...该规则并不完全适用于某些方法,例如DisposeSee here.如果程序员随后将此类方法从usercontrol.designer.vb移至usercontrol.vb,则设计人员将在usercontrol.vb中使用它们,而不会在usercontrol.designer.vb中重新生成它们。

因此,我们得出了答案:将Dispose方法移至usercontrol.vb,删除System.Diagnostics.DebuggerNonUserCode属性,然后添加必要的代码以保存控件属性,如下所示:

Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    Try
        SaveUserControlProperties()    <--- additional code added here
        If disposing AndAlso components IsNot Nothing Then
            components.Dispose()
        End If
    Finally
        MyBase.Dispose(disposing)
    End Try
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.