我有两种获胜形式,f1和f2。当我在f1上单击datagridview的行标题时,f1隐藏,f2显示,数据从f1传递到f2。现在用户使用f2并点击“关闭”后,f2隐藏并显示f1。我在f1中创建了函数来捕获用户对数据库所做的任何更改。问题是如何在f2隐藏和f1显示时自动调用此函数而不是使用按钮?感谢。
答案 0 :(得分:1)
在隐藏Form1(f1)之前和Form2(f2)创建之后,向f2传递一个Action代理,当它关闭时将由f2调用。此委托方法将在Form1类中,并将重新激活隐藏的实例
public class Form2: Form
{
public Action ReactivateParent;
.... form2 methods ....
// Here I call the ReactivateParent inside the FormClosed event handler
// of Form2, but these lines can also in a button click event
// that terminates the Form2 instance....
protected void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
if(ReactivateParent != null)
ReactivateParent();
}
}
现在在Form1中,当您准备显示Form2实例时,请绑定Action委托
Form2 f2 = new Form2();
f2.ReactivateParent += ReactivateMe;
this.Hide
f2.Show();
...
并向Form1添加一个名为ReactivateMe的方法
private void ReactivateMe()
{
// Add here whatever you need to update your Form1 instance....
....
// Reshow the now updated Form1 instance...
this.Show();
}
这种方法的优点在于,Form2并不关心ReactivateParent中的内容,并且应用程序中的每个其他形式都可以重用Form2的功能,并在Form2实例关闭时得到通知。
为了进一步改进此模式,您还可以考虑修改Action委托以接收将由Form2实例填充并修改数据的自定义类的实例。这可以帮助避免调用数据库来更新Form1实例。
答案 1 :(得分:0)
问题是如何自动调用此函数而不是使用 一个按钮
然后在Form构造函数中调用该函数或处理FormLoad事件并在事件处理程序中调用该函数。
答案 2 :(得分:-1)
表单的事件中有一个名为Shown
的事件。每次表单重新出现时都会运行。
我希望这会有所帮助。
修改强>
请改为尝试:
this.Hide();
f2.ShowDialog();
MethodUpdateValues();
this.Show();
这将在第二行暂停,并在您关闭f2时继续。