System.ObjectDisposedException: не удается получить доступ к удаленному объекту - почему это происходит? - PullRequest
2 голосов
/ 16 февраля 2012

Я получил сообщение об ошибке трассировки стека ...

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'Button'.
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.Control.PointToScreen(Point p)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Код, выдающий эту ошибку ....

Friend Sub GoHome(ByVal sender As Form)
  InTransit = True
  sender.Close()
  fMain.Show()
End Sub

Не выдает ошибку, когда я просто переключаю порядок методов .show и .close

Friend Sub GoHome(ByVal sender As Form)
  InTransit = True
  fMain.Show()
  sender.Close()
End Sub

Подскажите, пожалуйста, почему в первом случае это дает ошибку, а во втором - нет?

1 Ответ

0 голосов
/ 16 февраля 2012

Являются ли sender и fMain одним и тем же объектом в этом случае?

Если это так ... когда вы вызываете sender.Close, вы фактически вызываете fMain.Close, а метод Close будет удалять этот объект за кадром. Если впоследствии вы вызываете fMain.Show, то вызываете его для объекта, который вы только что удалили, отсюда и ошибка.

Или, альтернативно ...

Может быть, sender является одним из дочерних элементов управления на fMain?

Вы звоните sender.Close, выбрасывая дочерний контроль. Затем вы вызываете fMain.Show, который пытается сделать что-то с дочерними элементами управления, принадлежащими fMain. Ошибка возникает, когда он пытается что-то сделать с дочерним элементом управления, который вы только что удалили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...