这一定是个愚蠢的问题,但我无法弄清楚。我也无法使用设计器,因为在我之前的编码器设法将GUI和逻辑全部集中在一起,所以现在它很困惑。我必须按照旧学校的方式去做。
我有一个可以通过3种方式关闭的表格:关闭按钮,文件/关闭菜单和X图标。我希望他们都做同样的事情。拦截按钮和菜单事件很容易。事实上,两者都与onCloseConfig
方法联系在一起。顺便问一下,这个方法有更好的名称吗?
private void onCloseConfig(object sender, System.EventArgs e)
{
if (! m_configControl.Modified)
{
Application.Exit(); // Or should it be this.Close();
}
....
// Else present a dialog, ask if they want to save.
}
所以,拦截我试过的X
:this.FormClosing +=new FormClosingEventHandler(this.onCloseConfig);
我相信这是导致无限循环的原因。我不希望:) FormClosed
是另一种选择,但似乎为时已晚。我只想拦截点击X的事实,而不是表格正在关闭的事实。
答案 0 :(得分:12)
我认为你确实希望关闭表单,你可能缺少的是检查关闭的原因,只有来自用户才取消它。例如
private void my_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true; //I'm sorry Dave, I'm afraid I can't do that.
}
}
隐藏'X'集Form.ControlBox = false
,但这也将消除最小/最大。
答案 1 :(得分:3)
为按钮/菜单关闭创建单独的方法:
private void myButton_Click(object sender, EventArgs e)
{
this.Close();
}
private void myMenuButton_Click(object sender, EventArgs e)
{
this.Close();
}
private void myForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (m_configControl.Modified)
{
var result = MessageBox.Show("Name Of Application", "Would you like to save before closing?", MessageBoxButtons.YesNoCancel);
if(result == DialogResult.Yes)
//Save here
else if(result == DialogResult.Cancel)
e.Cancel = true;
}
}
或者,您可以通过设置this.ControlBox = false
答案 2 :(得分:1)
顺便问一下,这有更好的名字吗? 方法
关闭[FormName]可能是更好的选择。
或者应该是this.Close();
是的,如果你想要的只是关闭表格。
您应该为FormClosing事件创建一个新的事件处理程序。它接受FormClosingEventArgs而不是EventArgs作为参数。在按钮和菜单项的单击处理程序中,只需执行此操作。关闭()。
这将调用该事件,您可以将所有支票放在那里。
答案 3 :(得分:1)
表单关闭后会出现FormClosed event。这绝对不是你想要的。
FormClosing event更有可能是您需要的。
无论单击任何按钮或菜单链接,都会触发FormClosing事件。尝试关闭表单的任何内容都将触发FormClosing事件。
现在,在FormClosing事件处理程序方法中使用FormClosingEventArgs的更合适的方法如下:
if(m_configControl.Modified)
e.Cancel = true;
因此,除非修改配置控件,否则表单将继续关闭。您希望仅在存在更改或未保存的更改时阻止其关闭。
编辑2 在重新阅读您的问题之后,请参阅下面我对更高代码的更改:
if(m_configControl.Modified)
if(DialogResult.OK == MessageBox.Show("Do you want to save changes?", "Changes detected")
SaveChanges();
然后,这将提示用户进行未保存的更改,并仅在用户在MessageBox中单击“确定”时保存。请注意,您必须在MessageBox.Show()方法的其他参数中相应地添加按钮。
如果您想在FormClosing上完成是/否/取消,那么您必须采用这种方式:
if(m_configControl.Modified) {
DialogResult dr = MessageBox.Show(...);
switch(dr) {
case DialogResult.OK:
SaveChanges();
break;
case DialogResult.No:
// Do nothing...
break;
case DialogResult.Cancel:
e.Cancel = true;
}
}
因此,当用户单击“是”时,您的应用程序将保存更改。当他点击否时,应用程序将不会对此做任何事情,并将继续关闭。当用户希望返回应用程序时,将阻止关闭。
编辑1 请留意我对This Question的回答,这似乎是您想要完成的事情。
答案 4 :(得分:0)
这会阻止窗口关闭: FormClosing(对象发送者,System.EventArts e) { if(e.CloseReason == CloseReason.UserClosing) e.Cancel = true; }