仅遍历打开的表单并关闭特定的表单
Posted
技术标签:
【中文标题】仅遍历打开的表单并关闭特定的表单【英文标题】: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”应该是什么意思:)
【参考方案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
。
【讨论】:
我几乎写完了同样的东西,所以我冒昧地将初始化部分添加到您的答案中。 @TimSchmelterformsToClose.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。以上是关于仅遍历打开的表单并关闭特定的表单的主要内容,如果未能解决你的问题,请参考以下文章