关闭所有打开的WinForms,但一个?

时间:2013-06-24 20:13:49

标签: .net winforms

我正在使用Windows窗体应用程序.NET 3.5。我已经设置了一个计时器,如果在一段时间后没有活动,则关闭当前表单并且用户返回默认的“未登录”表单,该表单显示某些信息但不允许访问其他表单。

Application.OpenForms为我提供了一个列表,允许我关闭大多数可能保持打开的表单,但Application.OpenForms似乎只知道MDI表单。其中一些MDI表单可能包含MessageBoxes或其他模式表单。甚至可能存在模态形式本身具有弹出对话框的情况。

我知道quirk (bug) in Application.OpenForms,我不相信在创建Messagebox或其他类似表单后,有任何情况会改变属性。在任何情况下,这应该仅影响那些表单,其他所有表单仍应列在ApplicationOpenForms中。

除了我关心的那个之外,是否有一种优雅的方式来迭代并关闭应用程序中任何类型的每种形式? (或者严格地说,关闭它们除了MDI Parent之外,然后打开我关心的那个。)

2 个答案:

答案 0 :(得分:1)

这对我来说是98%的答案,对其他人来说可能是100%。

几乎在所有情况下,给出麻烦的表格只是通知或确认,即“保存记录”或“你真的想要取消吗?”并使用MessageBox实现。所需要的只是创建我自己的形式,它在功能上等同于MessageBox,在需要它的MDI子项中创建一个实例,然后使用它。当MDI子窗体关闭时(通过迭代Application.OpenForms找到),模式确认窗体也会关闭。我想,MessageBox没有关闭的原因是因为它实际上并不是由MDI子窗体拥有的。 (MSDN:“您无法创建MessageBox类的新实例。”)

当然我不需要复制整个MessageBox功能,在大多数情况下我真正需要的只是一个文本框和几个按钮。

其他内置Windows窗体(如PrintDialog和FileOpenDialog)存在类似于MessageBox的问题。我没有麻烦重新创建我自己的这些版本。如果一个人意外地被打开,不会造成很大的伤害。只有当有人走出PrintDialog并实际点击PrintDialog表单上的Print按钮,然后在不活动计时器到期之前没有回来时,才会发生这种情况。

可能有一种相对简单的方法可以将消息发送到这些类型的表单以告诉它们关闭 - 最坏的情况是,查看它们并使用低级别的窗口消息。

答案 1 :(得分:0)

您是否可以考虑在创建表单时使用数据结构(如定义为单例的数组)注册表单的句柄/引用。

使用这种方法,您将创建所有表单,甚至可以在同一结构上存储其他感兴趣的信息。获得列表后,可以在第二个线程中运行工作进程,根据存储在数据结构中的信息进行清理