我的应用程序中有Form1调用另一个窗体 - Form2使用ShowDialog()方法。在一些用户交互之后,Form2调用其Hide()方法。之后我的申请有时会失去焦点。这可能是一些设计错误。
代码提取:
public class Form1 : Form
{
Form2 form2;
public void SomeMethod()
{
if (form2==null) form2 = new Form2();
DialogResult result = form2.ShowDialog(this);
}
}
public class Form2 : Form
{
public Form2()
{
this.FormClosing += new FormClosingEventHandler(Form2_FormClosing);
}
void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
Hide();
}
}
}
编辑: 我的代码在线上有错误
DialogResult result = form2.ShowDialog(this);
是
DialogResult result = ShowDialog(form2,this);
答案 0 :(得分:2)
如果隐藏对话框,则Form1仍然无法访问,因为ShowDialog要求您在重新聚焦之前将其关闭。
如果您打算对它执行某些操作,则仅处理Form 2的关闭。否则只需让对话框关闭就没有任何好处来隐藏它。
有关详细信息,请参阅MSDN Form.ShowDialog。
代码示例
public class Form1: Form
{
private Form2: form2;
private bool doDbQuery;
public Form1()
{
doDbQuery = true;
}
public void SomeMethod()
{
if (form2 != null)
{
form2 = new Form();
}
if (doDbQuery)
{
// do DB query
// take a note of the information you retrieve
doDbQuery = false;
}
// pass this information to Form2 for it to display.
DialogResult result = form2.Execute(...);
}
}
public class Form2 : Form
{
public Form2()
{
}
public DialogResult Execute(...)
{
// use the execute method to inject the data you require for the form
return ShowDialog;
}
}
答案 1 :(得分:1)
private: System::Void form_closing(System::Object^ sender, CancelEventArgs^ e) {
MessageBox::Show( "Ulosteministeri Katainen" );
e->Cancel = true;
form->Hide();
this->Focus();//this is the parent form
}
答案 2 :(得分:0)
如果你使用一些“懒惰”函数,你可以在关闭表单的末尾使用asynchronous methods(委托回调)。