C# 如何避免使用Windows窗体C增加已加载内容的内存?
我正在用C#在Windows窗体中编程一个库存系统,我设计了一个管理仪表盘。我正在使用MDI,通过单击“产品”按钮加载产品 加载子窗体时,一切正常: 但是,当我一次又一次地加载产品时,我注意到在Windows任务管理器中,每当我加载产品或单击“产品”按钮时,程序都会消耗太多内存。内存消耗非常大 这是我的代码: 从父级加载子窗体:C# 如何避免使用Windows窗体C增加已加载内容的内存?,c#,winforms,entity-framework,mdi,C#,Winforms,Entity Framework,Mdi,我正在用C#在Windows窗体中编程一个库存系统,我设计了一个管理仪表盘。我正在使用MDI,通过单击“产品”按钮加载产品 加载子窗体时,一切正常: 但是,当我一次又一次地加载产品时,我注意到在Windows任务管理器中,每当我加载产品或单击“产品”按钮时,程序都会消耗太多内存。内存消耗非常大 这是我的代码: 从父级加载子窗体: public partial class Layout2 : BaseContext { public Layout2() {
public partial class Layout2 : BaseContext
{
public Layout2()
{
InitializeComponent();
}
//loads the products form
private void ventas_boton_Click(object sender, EventArgs e)
{
var frm = new Inventario();
frm.TopLevel = false;
frm.FormBorderStyle = FormBorderStyle.None;
panel3.Controls.Add(frm);
frm.WindowState = FormWindowState.Maximized;
frm.Visible = true;
}
}
子表单内容
基本上下文
我认为var frm=newinventario()代码>导致问题,因为每次单击按钮显示表单时,它都在创建新对象
我的问题很简单,但我是Windows窗体的新手,如何解决每次打开或更新产品窗体时的内存消耗问题
我认为另一个好主意是,当我点击产品按钮时,它不会加载表单,因为它已经打开了。我认为第二个选择是好的
您可以使用panel3.Controls
检查产品表单是否已打开。像这样的方法应该会奏效:
//loads the products form
private void ventas_boton_Click(object sender, EventArgs e)
{
if (panel3.Controls.OfType<Inventario>().Any()) return;
var frm = new Inventario();
...
我认为另一个好主意是,当我点击产品按钮时,它不会加载表单,因为它已经打开了。我认为第二个选择是好的
您可以使用panel3.Controls
检查产品表单是否已打开。像这样的方法应该会奏效:
//loads the products form
private void ventas_boton_Click(object sender, EventArgs e)
{
if (panel3.Controls.OfType<Inventario>().Any()) return;
var frm = new Inventario();
...
我不是WinForm程序员,但我认为你走的路是对的。您正在创建一个新对象,并将其反复添加到panel3。您永远不会删除以前添加到panel3的内容。看看这个答案是否有用:因此,每次单击按钮时,它都会打开一个新的子窗体,而您永远不会关闭子窗体。我说的对吗?没错,因为它们是子窗体,所以必须粘贴在面板中,并且不能有关闭按钮。当然,子窗体将保留它们的内存。您需要确定在某个时候关闭以前打开的子窗体的计划。是否要在新的Inventario
打开时自动关闭它们?是的,单击按钮时关闭上一个子表单是个好主意。我认为另一个好主意是,当我单击products按钮时,它不会再次加载表单,因为它已经打开,这将避免创建新的表单实例。我认为第二个选择会很好。我不是WinForm程序员,但我认为你走的是正确的道路。您正在创建一个新对象,并将其反复添加到panel3。您永远不会删除以前添加到panel3的内容。看看这个答案是否有用:因此,每次单击按钮时,它都会打开一个新的子窗体,而您永远不会关闭子窗体。我说的对吗?没错,因为它们是子窗体,所以必须粘贴在面板中,并且不能有关闭按钮。当然,子窗体将保留它们的内存。您需要确定在某个时候关闭以前打开的子窗体的计划。是否要在新的Inventario
打开时自动关闭它们?是的,单击按钮时关闭上一个子表单是个好主意。我认为另一个好主意是,当我单击products按钮时,它不会再次加载表单,因为它已经打开,这将避免创建新的表单实例。我认为第二个选择是好的。
//loads the products form
private void ventas_boton_Click(object sender, EventArgs e)
{
if (panel3.Controls.OfType<Inventario>().Any()) return;
var frm = new Inventario();
...
private void AddForm<T>(Func<T> formCreator) where T: Form
{
var form = panel3.Controls.OfType<T>().FirstOrDefault();
if (form != null)
{
//if the form of a given type already exists bring it to front
form.BringToFront();
return;
}
form = formCreator();
form.TopLevel = false;
form.FormBorderStyle = FormBorderStyle.None;
form.WindowState = FormWindowState.Maximized;
form.Visible = true;
panel3.Controls.Add(form);
}
AddForm(() => new Inventario());
AddForm(() => new ClientForm());