C# Windows窗体:等待其他窗体关闭

C# Windows窗体:等待其他窗体关闭,c#,winforms,C#,Winforms,我的情况是,formA需要更新一些数据,但只有在formB关闭之后。有没有一个简单的方法可以做到这一点 private void newProjectButton_Click(object sender, EventArgs e) { NewProjectForm newProjectForm = new NewProjectForm(); newProjectForm.Show(); //wait for newProjectForm to close...

我的情况是,
formA
需要更新一些数据,但只有在
formB
关闭之后。有没有一个简单的方法可以做到这一点

private void newProjectButton_Click(object sender, EventArgs e)
{
    NewProjectForm newProjectForm = new NewProjectForm();
    newProjectForm.Show();

    //wait for newProjectForm to close...

    DataTable dt = Util.ToDataTable(ProjectParticipantTable.GetUserProjectsDetails(Util.currentUserId));
    userProjectsDGV.DataSource = dt;
}

您必须使用
ShowDialog()
方法,并管理
DialogResult
属性。为此,您必须在NewProjectForm的某些部分上设置
对话框Result
集,这可以通过在按钮中设置属性来完成,也可以通过代码简单地设置属性。这将向父窗体激发DialogResult并关闭窗体

您可以这样做:

using(NewProjectForm newProjectForm = new NewProjectForm())
{
   if(newProjectForm.ShowDialog() == DialogResult.OK)
   {
       DataTable dt = Util.ToDataTable(ProjectParticipantTable.GetUserProjectsDetails(Util.currentUserId));
       userProjectsDGV.DataSource = dt;
   }
}

您必须使用
ShowDialog()
方法,并管理
DialogResult
属性。为此,您必须在NewProjectForm的某些部分上设置
对话框Result
集,这可以通过在按钮中设置属性来完成,也可以通过代码简单地设置属性。这将向父窗体激发DialogResult并关闭窗体

您可以这样做:

using(NewProjectForm newProjectForm = new NewProjectForm())
{
   if(newProjectForm.ShowDialog() == DialogResult.OK)
   {
       DataTable dt = Util.ToDataTable(ProjectParticipantTable.GetUserProjectsDetails(Util.currentUserId));
       userProjectsDGV.DataSource = dt;
   }
}

如果不想使用模态showdialog模式,也可以使用此方法

private void newProjectButton_Click(object sender, EventArgs e)
{
    NewProjectForm newProjectForm = new NewProjectForm();
    newProjectForm.FormClosed += NewProjectForm_FormClosed;
    newProjectForm.Show();
}

private void NewProjectForm_FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e)
{
    ////will run when new form is closed

    DataTable dt = Util.ToDataTable(ProjectParticipantTable.GetUserProjectsDetails(Util.currentUserId));
    userProjectsDGV.DataSource = dt;
}

如果您只需要一个单例,则将newProjectForm变量设置为静态单例。

如果您不想使用模态showdialog模式,也可以使用这种方法

private void newProjectButton_Click(object sender, EventArgs e)
{
    NewProjectForm newProjectForm = new NewProjectForm();
    newProjectForm.FormClosed += NewProjectForm_FormClosed;
    newProjectForm.Show();
}

private void NewProjectForm_FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e)
{
    ////will run when new form is closed

    DataTable dt = Util.ToDataTable(ProjectParticipantTable.GetUserProjectsDetails(Util.currentUserId));
    userProjectsDGV.DataSource = dt;
}

如果您只需要一个单例,那么将newProjectForm变量设为静态单例。

您是否在寻找
ShowDialog
?我猜
formB
不是模态的?这似乎是一个太明显的解决方案。正如Reza建议的那样,将
Show()
更改为
ShowDialog()
在关闭
newProjectForm
之前,您将无法对当前打开的其他表单执行任何操作。这非常简单谢谢你在找
ShowDialog
?我猜
formB
不是模态的?这似乎是一个太明显的解决方案。正如Reza建议的那样,将
Show()
更改为
ShowDialog()
在关闭
newProjectForm
之前,您将无法对当前打开的其他表单执行任何操作。这非常简单谢谢@RezaAghaei你明白了。我更新了我的答案,以跟上好消息practices@RezaAghaei你明白了。我更新了我的答案,以跟上良好实践