如何确定表单是否已引发其已显示事件

时间:2011-08-05 15:41:10

标签: .net vb.net

我有一个可以在TABBED或WINDOWED模式下运行的MDI应用程序。当用户从菜单中选择某些内容时,将显示一个表单。所有menuItem点击几乎都是一样的:

Dim frm As New <SomeForm>
frm.MdiParent = MDIParentForm
frm.Show()

有一个计时器每隔xx秒唤醒一次,并检查应用程序是在TABBED还是WINDOWED模式下运行。如果应用程序在TABBED模式下运行,它将遍历所有MDIChildren并将它们添加到选项卡(在列表中跟踪它们)。我发现在tabcontrol中向窗口添加表单时有一个错误 - 它没有正确清除MDIParent,并且在PropertyStore中有一个对该表单的引用(由.NET MDI系统使用),因此大内存泄漏。为了解决这个问题,我尝试在添加到tabpage之前将表单的MDIParent设置为Nothing / Null,但是这会抛出.NET框架的StackOverflowException。我怀疑StackOverflowException是由于我在加载表单时尝试更改MDIParent而导致的。我发现(通过1个表单上的测试)如果我能够捕获“已显示”事件,我可以毫无问题地更改MDIParent。问题是这些menuItemClick事件处理程序有很多,并且每个都不可行,所以我不能及早为每个表单订阅“已显示”事件。

假设我从这个MDI应用程序中显示了无数个这些表单,并且更改这些表单中的每一个都不实用,所以我需要从MDI应用程序中做一些事情。 Sub()设置MDIParent = Nothing以确定表单是否已经提升其“已显示”事件的方法是什么? (我试过检查frm.Visible = True但是会抛出相同的异常)

3 个答案:

答案 0 :(得分:0)

不是删除MDIParent父属性,而是复制表单并删除原始文件:

  1. 创建子表单的新实例(不包含MDI父级)
  2. 将其添加到tabcontrol
  3. 在选项卡的新子窗体中复制MDI Child中的所有内容。
  4. 删除MDI子表单。

答案 1 :(得分:-1)

查看Activated事件。

答案 2 :(得分:-1)

re:有一个计时器每隔xx秒唤醒一次,并检查应用程序是在TABBED还是WINDOWED模式下运行。

为什么在编辑模式值而不是使用计时器后才运行代码?

re: Sub()设置MDIParent = Nothing以确定表单是否已经提升其“已显示”事件的方式是什么?

您可以创建一个表单级属性,默认值为false,并在form_show事件中设置为true。