遍历OpenForms时排除ActiveMdiChild的实现问题及解决方案
遍历打开窗体并排除活动MDI子窗体的正确实现
问题背景
我需要实现一个遍历所有已打开窗体的循环,但要排除当前活动的MDI子窗体。一开始用ActiveForm.ActiveMdiChild.Name = FormRefresh.Name来判断排除,结果遇到同名窗体时,非活动的同名窗体也被误排除了。另外,我写的Public Shared Sub VerificaAlterações()里的判断语句一直报错,后来把Shared关键字删掉就正常了。
问题拆解与原因
- 同名窗体判断失效:靠
Name属性判断窗体根本不靠谱——如果同一个窗体类实例化了多个窗口,它们的Name值都是一样的,根本区分不开不同的实例。得直接对比窗体的实例引用才行。 - Shared方法报错的坑:
Shared方法属于类本身,不属于某个具体窗体实例,在这种方法里没法访问实例级的成员(比如ActiveMdiChild这种和具体实例绑定的对象),所以把Shared去掉改成实例方法,就能正常访问这些内容了。
可行的代码实现
Public Sub VerificaAlterações() ' 先拿到当前活动的MDI子窗体实例 Dim activeChild As Form = Me.ActiveMdiChild ' 遍历所有已打开的窗体 For Each openForm As Form In Application.OpenForms ' 用实例引用判断,排除活动子窗体 If openForm IsNot activeChild Then ' 这里写你要对非活动窗体执行的操作 ' 比如检查窗体内容是否有变更之类的 End If Next End Sub
关键注意点
- 别再用窗体名称判断了,直接对比
Is/IsNot实例引用,每个窗体实例都是唯一的,不会有同名混淆的问题。 - 如果你的方法需要用到窗体实例的属性或方法(比如
ActiveMdiChild),就别加Shared关键字,老老实实用实例方法。
内容的提问来源于stack exchange,提问作者Heitor Badotti
相关产品推荐
相关产品推荐

