【问题标题】:Cannot access disposed form despite creating it immediately prior尽管之前立即创建了已处理的表单,但无法访问它
【发布时间】:2014-09-08 17:01:03
【问题描述】:

我有一个 Windows 窗体 (VB/.NET),我想在单击特定按钮时打开它。它第一次正确打开,但在关闭它并尝试重新打开它后,我收到此错误:

“ObjectDisposedException 未处理:无法访问已处理的对象。对象名称:frm8100VI”

现在,我在调用它的 show() 方法之前创建了一个表单的新实例,所以我不知道它是如何处理的:

Dim form as New frm8100VI
form.show()

此代码在第一次调用时可以正常工作,但在关闭表单后再次无法正常工作,说明对象已被释放。要关闭表单,我只需调用 me.close()

【问题讨论】:

  • frm8100VI 构造函数/事件中一定有一些东西使自己无效,我认为你应该发布更多关于该类的代码。那些行显然不能产生一个已经被释放的对象。
  • 让我感到困惑的是,该消息表明该类本身已被处置... frm8100VI 是一个类...我认为这不可能,我以为您只能处置对象,或类的实例。我检查了项目中该名称的冲突使用,但没有发现。
  • 一个表单一个类;错误消息Cannot access a disposed object 表示对象 - 而不是类 - 已被处置。尝试使用像 frm 或 f 这样的变量名而不是类型名(表单)
  • To close the form all I do is call me.close() 处理它。你不能只是再次form.Show,而是创建一个新实例。这样就不需要额外的步骤来实际处理它们以释放资源。
  • Plutonix - 我确实创建了一个新实例...我在每次调用 from.Show() 之前执行“Dim form As New frm8100VI”。将对象名称更改为“f”没有任何区别,无论如何,谢谢。

标签: vb.net winforms


【解决方案1】:

我猜你的“Dim form as new frm8100VI”位于另一个对象内部的空间或永远不会超出范围的公共空间中。

一旦你说“form.show”,用户已经使用了表单,关闭了表单。

此时您不能在同一个表单对象上再次调用“form.Show”(它已被释放)。

您必须再次重新分配“form = New frm8011VI”,然后才能调用“form.show”(重新迭代,在处理后显示失败)

如果您试图将信息保留在“表单”对象中,那么您实际上不应该关闭表单;在 form_unload 事件中,您显示取消关闭表单并简单地隐藏表单。如果这样做,您可以再次调用“form.Show”而不会出现问题。

【讨论】:

  • 谢谢,但这就是我正在做的。提供的代码发生在处理程序内部,用于按下按钮,因此每次按下按钮时,我都会创建一个 frm8100VI 类的新实例,然后调用它的 show 方法。该按钮只工作一次,第二次我得到对象处置错误。
  • 你有一个非常奇怪的问题。尝试在表单本身的主要生命周期事件中放置断点:加载、关闭、关闭、dispose 方法等...并逐步查看发生了什么。检查每个点的调用堆栈,看看是什么触发了中断。另一件似乎不太可能发生的事情是,如果您的表单相当复杂,是否有人覆盖了“显示”例程,可能会尝试做某种单例表单并惹恼您。只是我最后的想法。
猜你喜欢
  • 2023-01-26
  • 2023-01-11
  • 1970-01-01
  • 2020-04-14
  • 2022-01-22
  • 2019-12-25
  • 2018-11-30
  • 1970-01-01
  • 2019-08-16
相关资源
最近更新 更多