我已经按照微软大师Andrew Whitechapel here的指示为微软Access创建了一个VSTO插件,它工作得很好。但是插件有一个CustomTaskPane,当访问关闭时,我遇到了一个问题。
如果在关闭访问时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认可的应用程序一样。
经过一些试验,我找到了一种变通方法,使用控件的HandleDestroyed事件,该事件发生在Dispose()之前,因此控件属性仍然可用。这是可行的:
Private Sub TextBox1_HandleDestroyed(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles TextBox1.HandleDestroyed
MsgBox(TextBox1.Text)
End Sub有没有更好的方法?变通方法让我很紧张。
发布于 2020-01-12 10:39:29
在追踪事件的过程中,我意识到了我自己问题的答案。重点是usercontrol.designer.vb中的Dispose方法。然而,众所周知的是,设计器生成的代码不应该被直接修改,因为在设计器中对用户控件进行任何后续更改后,它都可以并将被刷新和覆盖。
Except...that规则并不完全适用于某些方法,例如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 Subhttps://stackoverflow.com/questions/59697174
复制相似问题