首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当Microsoft Access关闭时,如何在释放控件之前捕获CustomTaskPane的当前属性?

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

Stack Overflow用户
提问于 2020-01-12 02:02:03
回答 1查看 29关注 0票数 0

我已经按照微软大师Andrew Whitechapel here的指示为微软Access创建了一个VSTO插件,它工作得很好。但是插件有一个CustomTaskPane,当访问关闭时,我遇到了一个问题。

如果在关闭访问时CustomTaskPane处于打开状态,则外接程序应保存CustomTaskPane控件的属性。如果这方面的代码放在ThisAddIn_Shutdown()中,我会收到以下错误:

代码语言:javascript
复制
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()之前,因此控件属性仍然可用。这是可行的:

代码语言:javascript
复制
Private Sub TextBox1_HandleDestroyed(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles TextBox1.HandleDestroyed
    MsgBox(TextBox1.Text)
End Sub

有没有更好的方法?变通方法让我很紧张。

EN

回答 1

Stack Overflow用户

发布于 2020-01-12 10:39:29

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

Except...that规则并不完全适用于某些方法,例如DisposeSee here.如果程序员随后将这些方法从usercontrol.designer.vb移动到usercontrol.vb,则设计者将在usercontrol.vb中遵循这些方法,而不会在usercontrol.designer.vb中重新生成它们。

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59697174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档