我有一个c#类,这是一个Windows窗体应用程序。在此应用程序中,当我右键单击特定控件时,会打开一个新窗体。关闭新窗体关闭另一窗体的消息框
这个新窗体有一些信息和一个按钮。当你点击这个按钮时,会调用主类(表单)中的函数。通过使用运行this.Close()
的停用事件失去焦点时,窗体(通过右键单击主窗体获得的窗体)会关闭。
问题是它也关闭了从调用的函数运行的消息框。
这是为什么?我说this.Close()
其中this
是新窗体而不是主窗体的消息框。
我有一个c#类,这是一个Windows窗体应用程序。在此应用程序中,当我右键单击特定控件时,会打开一个新窗体。关闭新窗体关闭另一窗体的消息框
这个新窗体有一些信息和一个按钮。当你点击这个按钮时,会调用主类(表单)中的函数。通过使用运行this.Close()
的停用事件失去焦点时,窗体(通过右键单击主窗体获得的窗体)会关闭。
问题是它也关闭了从调用的函数运行的消息框。
这是为什么?我说this.Close()
其中this
是新窗体而不是主窗体的消息框。
打开MessageBox将停用您的子窗体,因此它被关闭。 当打开一个MessageBox而不告诉它的父项时,将使用当前的活动窗口,在这种情况下是你的子窗体。当MessageBox的父级(子窗体)关闭时,MessageBox get也关闭。
如果您希望主窗体打开MessageBox,即使它从另一个窗口调用,也可以使用使用IWin32Window owner
-Parameter的重载。
public partial class MainForm : Form {
public MainForm() {
InitializeComponent();
}
private void button_Click(object sender, EventArgs e) {
var form = new ChildForm(this);
form.Show();
}
// Method called by ChildForm
public void OpenMessageBox() {
IWin32Window owner = this;
MessageBox.Show(owner, "MessageBox opened from MainForm, but called from within ChildForm");
}
}
我看到您的代码有一个问题。您正在将控制逻辑从MainForm委托到ChildForm中,并返回到MainForm中。试着让MainForm通过使用ChildForm的FormClosed-Event来控制逻辑流程。请注意,这是一个可选步骤,让我们说一个更清晰的方法来获得您想要达到的行为。
private void button_Click(object sender, EventArgs e) {
var form = new ChildForm(this);
form.FormClosed += ChildFormClosed;
form.Show();
}
private void ChildFormClosed(object sender, FormClosedEventArgs formClosedEventArgs) {
var childForm = (Form)sender;
childForm.FormClosed -= ChildFormClosed;
MessageBox.Show("MessageBox opened from MainForm");
}
}
谢谢!如果我愿意的话,我会投票回答。 – Dave
你可以在这里发布你的代码给我们看看会发生什么吗? – Kurubaran