Когда Microsoft Access завершает работу, как я могу поймать текущие свойства CustomTaskPane до удаления элементов управления? - PullRequest
0 голосов
/ 11 января 2020

Я создал надстройку VSTO для Microsoft Access, следуя указаниям гуру Microsoft Эндрю Уайтчепела здесь , и он прекрасно работает. Но у надстройки есть CustomTaskPane, и у меня возникает проблема с ним, когда закрывается Access.

Если CustomTaskPane открывается при закрытии Access, надстройка должна сохранять свойства элементов управления 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.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

Есть ли лучший способ ..? Обходные пути заставляют меня нервничать.

1 Ответ

0 голосов
/ 12 января 2020

Следуя по пути событий, я понял ответ на свой вопрос. Фокусной точкой является метод Dispose в usercontrol.designer.vb. Однако широко известный код, сгенерированный дизайнером, не должен изменяться напрямую, так как он может и будет обновляться и перезаписываться после любых последующих изменений в usercontrol в конструкторе.

За исключением ... что правило не полностью применяется к определенным методам, таким как Dispose. См. Здесь. Если программист впоследствии перемещает такие методы с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...