【问题标题】:Closing Window's from upon switching to another or vice versa切换到另一个窗口时关闭窗口,反之亦然
【发布时间】:2015-08-31 11:35:08
【问题描述】:

我编写了一个窗口应用程序,它有两个不同的父窗体(form1 和 form2)。每个表单都有几个子表单。登录后打开form1。现在我在form1 上有一个按钮(称为切换到form2),它切换到form2。现在我需要在打开 form2 后关闭 form1。我需要从 form2 到 form1 做同样的事情。

处理这个问题的最佳方法是什么。

我通过在每个表单的表单加载下添加此代码来关闭表单,尝试了类似下面的操作,但我得到了以下异常。

 A first chance exception of type 'System.InvalidOperationException' occurred in mscorlib.dll

Additional information: Collection was modified; enumeration operation may not execute.

你能建议我处理这个问题吗?

表格 1

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
 For Each frm As Form In Application.OpenForms
   If frm.Name.ToLower = "form2" Then
      frm.Close()
   End If
 Next
End Sub

表格 2

Private Sub Form2_Load(sender As Object, e As System.EventArgs) Handles Me.Load
 For Each frm As Form In Application.OpenForms
   If frm.Name.ToLower = "form1" Then
      frm.Close()
   End If
 Next
End Sub

【问题讨论】:

  • 你得到了什么异常?
  • 哦,不应该是frm.Name.ToLower()(注意括号)吗?我可能错了,我真的不熟悉vb语法。
  • 在 mscorlib.dll 中出现“System.InvalidOperationException”类型的第一次机会异常附加信息:集合已修改;枚举操作可能无法执行。
  • 使用您问题下方的小编辑链接将此例外编辑到您的问题中 - 这是解决您问题的一些有价值的信息!
  • 正如错误所说,在枚举集合时不能更改集合。当您关闭表单时,OpenForms 集合会更改

标签: vb.net winforms formclosing


【解决方案1】:

我想您负责创建表单。
如果是这样,我将重载每个表单的构造函数,以获取另一个表单类型的参数并将其关闭。
对于您的Form1,它将是:

Public Sub New(form2 As Form2)
  InitializeComponent()
  'and the rest of your initialization code

  If form2 IsNot Nothing Then
    form2.Close()
  End If
End Sub

Form2 的构造函数反之亦然。

它甚至不必像上面那样专门化。您总是可以将其概括为将Form 类型的对象作为参数。

【讨论】:

    【解决方案2】:

    为什么不使用 Form1.Hide()?

    这样您仍然可以在其他表单不可见时访问它。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多