2

我收到堆栈跟踪的错误...

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

你能告诉我为什么在第一种情况下它会出错,为什么在第二种情况下没有?

4

1 回答 1

0

sender在这种情况下和fMain是同一个对象吗?

如果是这样...当您调用时,sender.Close您实际上是在调用fMain.Close,并且该Close方法将在幕后处理该对象。如果您随后调用fMain.Show,那么您将在刚刚处理的对象上调用它,因此会出现错误。

或者,另一种...

也许sender是子控件之一fMain

你调用sender.Close,配置子控件。然后,您调用fMain.Showwhich 尝试对属于 的子控件执行某些fMain操作。当它尝试对您刚刚处置的子控件执行特定操作时,就会发生错误。

于 2012-02-16T17:38:38.660 回答