C# 通过不同的形式检测CloseEvent

C# 通过不同的形式检测CloseEvent,c#,winforms,C#,Winforms,问题已解决 短篇小说 我想通过不同的表单来检测“FormClosing()”事件,即,当form1在form2中被实例化时,form2是否可以检测到用户何时在form1中按下exit 说来话长 我和我的团队正在开发一个windows窗体应用程序。项目有两个表单:一个是主表单页面,另一个通过此主表单访问。主窗体如下所示: 第二个是这样的: 如果按下主窗体中的“Ekle/Sil”按钮,则会转到窗体2,您可以在其中编辑数据库条目。当您按下主窗体中的“SayfayıYenile”按钮时,文本区域的

问题已解决


短篇小说

我想通过不同的表单来检测“FormClosing()”事件,即,当form1在form2中被实例化时,form2是否可以检测到用户何时在form1中按下exit

说来话长

我和我的团队正在开发一个windows窗体应用程序。项目有两个表单:一个是主表单页面,另一个通过此主表单访问。主窗体如下所示:

第二个是这样的:

如果按下主窗体中的“Ekle/Sil”按钮,则会转到窗体2,您可以在其中编辑数据库条目。当您按下主窗体中的“SayfayıYenile”按钮时,文本区域的内容将通过从数据库中重新获取条目来刷新

我的问题是,我想在用户关闭第二个表单时自动刷新主表单。我的研究建议我应该使用“FormClosing()”事件来检测结束表单。但是,我想从主窗体中检测这一点。在第二个表单的源代码中实例化主表单似乎不是一个可靠的解决方案。谁能告诉我怎么做


编辑
我解决了这个问题: 1) 在主窗体中创建了刷新页面的公共方法。 2) 创建第二个窗体时,从主窗体发送“this”属性。 3) 在调用此公共方法的第二个表单中添加了“FormClosed()”处理程序

不过,我还是在寻找更好的解决方案


编辑2

更好的解决方案

您可以在第二个表单中创建一个事件,并在表单关闭时引发它。
在主窗体中处理事件并在引发事件时刷新主窗体

您可以在第二个窗体中创建事件,并在窗体关闭时引发它。
在主窗体中处理事件,并在引发事件时刷新主窗体

另一个选项是将Form1作为参数传递给Form2。然后使用Form2中的Form.Closing事件并使用Form1引用来触发某些内容

Form1 form1Ref;

public Form2(Form1 mainform)
{
     form1Ref = mainform;
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
     form1Ref.SomeMethod();
}

另一种选择是将Form1作为参数传递给Form2。然后使用Form2中的Form.Closing事件并使用Form1引用来触发某些内容

Form1 form1Ref;

public Form2(Form1 mainform)
{
     form1Ref = mainform;
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
     form1Ref.SomeMethod();
}

只需使用新子窗口窗体的
Form.Closed
事件即可。一切都从主窗体处理:

void EkleSil_Clicked(object sender, EventArgs e) //or whatever method is called when button is clicked
{
     var newChildForm = new ChildForm();
     newChildForm.Closed += childFormClosed;
     newChildForm.Show();
}

void childFormClosed(object sender, EventArgs e)
{
     ((Form)sender).Closed -=childFormClosed;
     updateShownData();
}

只需使用新子窗口窗体的
Form.Closed
事件即可。一切都从主窗体处理:

void EkleSil_Clicked(object sender, EventArgs e) //or whatever method is called when button is clicked
{
     var newChildForm = new ChildForm();
     newChildForm.Closed += childFormClosed;
     newChildForm.Show();
}

void childFormClosed(object sender, EventArgs e)
{
     ((Form)sender).Closed -=childFormClosed;
     updateShownData();
}


有这样的事件时为什么要创建新事件:
FormClosing
FormClosing
?是的。这也是一个解决方案如果在form2内触发,我如何处理form1中的事件?如何安装此链接?主窗体中必须有子窗体对象。使用该对象在主窗体中添加事件处理程序因此,如果我在主窗体中定义一个私有窗体对象(如全局变量),而不是在本地创建第二个窗体的实例,则将第二个窗体实例分配给该变量将允许我处理该事件?为什么在发生此类事件时创建新事件:
FormClosing
FormClosed
?是。这也是一个解决方案如果在form2内触发,我如何处理form1中的事件?如何安装此链接?主窗体中必须有子窗体对象。使用该对象在主窗体中添加事件处理程序因此,如果我在主窗体中定义一个私有窗体对象(如全局变量),而不是在本地创建第二个窗体的实例,将第二个表单实例分配给此变量允许我处理该事件?根据您的需要,您应该使用在表单关闭后调用的或在表单关闭前调用的,您也可以在其中取消关闭事件。第二个表单是否使用
ShowDialog()
打开?如果是这样的话,您是否可以让您的其他代码继续运行,而不需要观看事件?否,第二个表单是实例化的,并通过说“form.Show()”1)将parentform作为引用发送到构造函数中的childform
public childform(parentform parent)中
2)在ParentForm中订阅childform的
onClose
事件尽管我不想这样做,但KamikyIT的建议解决了我的问题。遗憾的是,我不得不在应该是私有的情况下使用公共方法。根据您的需要,您应该使用在表单关闭后调用的方法,或者在表单关闭前调用的方法,您也可以在其中取消关闭事件。第二个表单是否使用
ShowDialog()
打开?如果是这样的话,您是否可以让您的其他代码继续运行,而不需要观看事件?否,第二个表单是实例化的,并通过说“form.Show()”1)将parentform作为引用发送到构造函数中的childform
public childform(parentform parent)中
2)在ParentForm中订阅childform的
onClose
事件尽管我不想这样做,但KamikyIT的建议解决了我的问题。可悲的是,我不得不在应该是私有的地方使用公共方法。为什么我之前没有看到这一点?谢谢,为什么我没早点看到?非常感谢。