3

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

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

我知道Application.OpenForms 中的怪癖(错误),我不相信在创建 Messagebox 或其他类似表单后会更改属性的任何情况。在任何情况下,这应该只影响那些表单,所有其他表单仍然应该在 ApplicationOpenForms 中列出。

有没有一种优雅的方式来遍历和关闭应用程序中任何类型的每一种形式,除了我关心的那个?(或者严格来说,要关闭它们,除了 MDI 父级,然后打开我关心的那个。)

4

2 回答 2

1

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

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

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

其他内置的 Windows 窗体,例如 PrintDialog 和 FileOpenDialog 具有类似于 MessageBox 的问题。我没有费心去重新创建我自己的这些版本。如果不小心打开了一个,不会造成很大的伤害。仅当有人在打开 PrintDialog 和实际点击 PrintDialog 表单上的 Print 按钮之间走开时才会发生这种情况,然后在不活动计时器到期之前不会回来。

可能有一种相对简单的方法可以向这些类型的表单发送消息以告诉它们关闭 - 最坏的情况,查找它们并使用低级别的 Windows 消息传递。

于 2013-07-02T19:46:54.827 回答
0

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

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

于 2013-06-24T23:53:44.703 回答