我有一个c#类,它是一个Windows窗体应用程序。在此应用程序中,当我右键单击特定控件时,将打开一个新表单。
这个新表单有一些信息和一个按钮。单击此按钮时,将调用主类(窗体)中的函数。通过使用运行this.Close()
的deactivate-event失去焦点时,表单(通过右键单击主窗体获得的表单)将关闭。
问题是它还关闭了一个从被调用的函数运行的消息框。
这是为什么?我说this.Close()
其中this
是新表单,而不是主表单中的消息框。
答案 0 :(得分:0)
正在打开的MessageBox正在停用您的子表单,因此它已关闭。 在不告知其父级的情况下打开MessageBox时,将使用当前活动窗口,在本例中为您的子窗体。当MessageBox的父(子窗体)关闭时,MessageBox也会关闭。
如果您希望主窗体打开MessageBox,即使从另一个窗口调用它,也要使用使用IWin32Window owner
- 参数的重载。
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");
}
}