我有一个带有多个MDI子窗口的winforms C#应用程序,每个窗口都可以包含更改的用户数据。
当单独关闭子窗口时,会向用户发出有关已更改数据的警告,这样可以正常工作。
但是,如果用户试图关闭应用程序,我只想为所有子窗口发出一次警告,如果有任何更改了数据(数据不是那么关键)。
所以想法是挂钩主窗口的OnClosing事件,在任何子窗口中查找已更改的用户数据,如果找到任何已更改的数据,只显示一次警告,并设置布尔值以防止每个子窗口多次打扰用户。
我看到的问题是,在触发每个子窗口的OnClosing事件后触发主窗口的OnClosing事件,所以我不能很快设置我的布尔值。
是否存在应用程序关闭的事件,我可以挂钩,比OnClosing更快到达,或者是否有可能存在的Windows消息?
答案 0 :(得分:2)
解决了它,我只需要挂钩WM_CLOSE Windows消息:
protected override void WndProc(ref Message m)
{
// Crucially, this message arrives before my child windows get the OnClosing event.
if (m.Msg == WM_CLOSE)
{
// So I set my boolean here and everything works great.
}
base.WndProc(ref m);
}
答案 1 :(得分:2)
如果FormClosing为MdiFormClosing
,您可以让您的子表单订阅FormClosingEventArgs.CloseReason事件并跳过处理,而不是挂钩到MDI父表单关闭消息和设置标记:
private void ChildForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.MdiFormClosing) return; // Do nothing
// ...
}
答案 2 :(得分:0)
我会在每个子窗口中创建一个布尔值,指示是否打开提示。
public bool Prompt = true;
private void Form_Closing(object sender, EventArgs e)
{
if (Prompt)
{
MessageBox.Show("Data thingy...whatever");
}
}
然后在您的主窗体中,您可以将此布尔值设置为false。
private void MainForm_Closing(object sender, EventArgs e)
{
form1.Prompt = false;
form1.Close();
form2.Prompt = false;
form2.Close();
//etc
}