c# - C# 从另一个窗体打开一个窗体(处理内存过多)
问题描述
我一直在寻找从另一个已经显示的表单打开第二个表单的方法。
这是一段有效的代码:
frmSecond second = new frmSecond();
this.Hide();
second.ShowDialog();
this.Close();
它所做的基本上是对Hide()
当前打开的表单,然后打开另一个表单(ShowDialog()
方法)。Close()
当您刚刚创建的表单关闭时,它只会显示当前隐藏的表单。
这里的问题是:这种做法会创建一个巨大的表单线程。如果我需要从frmSecond
to frmThird
,它将保持第一个表单并frmSecond
在后台执行,同时只显示frmThird
.
然后,由于frmThird
是打开的,如果我需要回到第一个表单,我会使用一些代码,例如:
frmFirst first = new frmFirst();
this.Hide();
first.ShowDialog();
this.Close();
它会创造另一个frmFirst
!然后我们将在后台执行三个表单(第一个frmFirst
、frmSecond
和frmThird
)。
此方法有效,但使用的处理内存量越来越大,这可能对任何类型的项目都不利。
是否有任何替代方案或加起来来纠正这个问题?
如果有任何不清楚的地方,请不要费心让我知道。谢谢你。
解决方案
如果您想访问已创建的表单,请尝试使用静态Application.OpenForms
属性。它包含当前在您的应用程序中打开的所有表单的列表。文档在这里。
例如,如果您总是想保持frmFirst
打开状态,然后在关闭其他表单之一时导航回它,您可以这样做:
frmFirst existing = Application.OpenForms.OfType<frmFirst>().FirstOrDefault();
if (existing != null)
existing.Show();
您需要删除您的this.Close()
呼叫才能使其正常工作。
推荐阅读
- linux - Google chrome 未在 ubuntu 18.04 环境中运行
- cmake - clion wsl "需要 CMake 3.20 或更高版本。您正在运行版本 3.16.3"
- gtk - 缺少用于构建 libgtkwebkit 的 libsoup3
- c++ - 将无符号值分配给整数数据类型
- sql-server - Dbeaver 到 SQL Server 的连接
- excel - 如何在列中获取重复项并使用其他特定列复制到另一张表中
- javascript - 如何在不使用 JavaScript 中的内置函数的情况下将字符串大写转换为小写
- android - Android Navigation - 导航时弹出当前片段
- firebase - 颤动的火力基地中的snapshot.data为空
- jquery - 如何在 $.each 函数内的 .on(click) 上返回当前 ID - jQuery