【问题标题】:iterate through open forms and close particular forms only仅遍历打开的表单并关闭特定的表单
【发布时间】:2014-07-21 12:13:42
【问题描述】:
  • 下面是我写的代码

    Private Sub CloseTransactionForms()
      Dim ActiveFroms As New List(Of String)
      Dim formToClose As New List(Of Form)
      Dim j As Integer
      ActiveFroms.Add("FrmSale")
      ActiveFroms.Add("FrmpPurchase")
      ActiveFroms.Add("FrmSaleReturn")
      ActiveFroms.Add("FrmPurchaseReturn")
        Try
          For Each frm As Form In My.Application.OpenForms
            For j = 0 To ActiveFroms.Count - 1
                If frm.Name.ToString() = ActiveFroms.Item(j) Then
                    formToClose.Add(frm)
                End If
            Next
        Next
        If formToClose.Count > 0 Then
            Dim i As Integer
            For i = 0 To formToClose.Count - 1
                Dim xform As Form = formToClose.Item(i)
                xform.Close()
            Next
        End If
      Catch ex As Exception
     End Try
    End Sub
    
  • 此代码将遍历我的应用程序中打开的表单并关闭应用程序中的定义的表单

  • 1234563

注意:我已经看过this question in SO

【问题讨论】:

  • 这看起来像您链接的问题的副本,并且还不清楚您在问什么。为什么代码看起来“不适合你”?您也许可以使用 LINQ (IEnumerable.Any) 更优雅地过滤表单,但这与关闭表单没有太大关系。
  • duplicate > 不是因为在我的情况下,我只需要关闭openfoms 的 4 个表格 .... 对你不利 > 因为你可以看到我在该代码中使用了 3 for loop
  • 您修改了正在迭代的集合。结果总是很糟糕。您必须将其从 Count-1 向后迭代到 0 以避免发生意外。
  • @Hans:他实际上是在创建一个单独的表单列表来关闭。
  • 好吧,不知道“vlose”应该是什么意思:)

标签: c# vb.net winforms openform


【解决方案1】:

您可以使用 LINQ 查找要关闭的表单并使用List.ForEach 关闭它们:

Dim ActiveFroms = New List(Of String) From {"FrmSale", "FrmpPurchase", "FrmpSaleReturn", "FrmPurchaseReturn"}

Dim formsToClose = From form In My.Application.OpenForms.Cast(Of Form)()
                   Join activeFormName In ActiveFroms
                   On form.Name Equals activeFormName
                   Select form

formsToClose.ToList().ForEach(Sub(form) form.Close())

您不能在上面的查询中使用For Each,因为Form.Close 将修改集合which is not allowed。因此我使用List.ForEach

【讨论】:

  • 我几乎写完了同样的东西,所以我冒昧地将初始化部分添加到您的答案中。
  • @TimSchmelter formsToClose.ToList().ForEach(Sub(form) form.Close()) 是否正确?我在sub上得到Expression Expected
  • 您使用的是哪个版本的 Vb.Net?
  • @TimSchmelter Visual Studio 2008 (VB 9.0)
  • @keet: 那么lambda-expressions 已经被支持了。它对我有用,我已经测试过了。您确定在... ForEach(Sub ... 处收到编译器错误吗?但是,作为一种解决方法,您也可以使用Dim listOfForms=formsToClose.ToList()。然后使用一个简单的For-loop。
猜你喜欢
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
相关资源
最近更新 更多