我已经按照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
还有更好的方法吗?解决方法使我感到紧张。
[通过跟踪事件,我意识到了自己的问题的答案。焦点是Dispose
中的usercontrol.designer.vb
方法。但是,众所周知,不应直接修改设计者生成的代码,因为在对设计器中的用户控件进行任何后续更改之后,它可以并且将被刷新和覆盖。
除了...该规则并不完全适用于某些方法,例如Dispose
。 See 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