C# 如何限制用户关闭WinC窗体#

C# 如何限制用户关闭WinC窗体#,c#,.net,winforms,mdi,formclosing,C#,.net,Winforms,Mdi,Formclosing,我知道这是一个非常简单的问题,但我正在寻找简洁明了的建议。我的应用程序是一个MDI应用程序。创建了一个在整个应用程序中使用的基本表单。有两个表单我们不希望用户关闭,因此为了避免人为错误,我们计划不允许用户关闭这些表单 我试图在表单关闭事件中设置e.cancel=true,但似乎不起作用。有人能给我一些建议吗 编辑: 问题是,当我使用此代码时,我的MDI应用程序中没有一个窗体正在关闭,甚至主MDI父窗体也是如此。您也无法显示关闭按钮: Cody Gray在评论中提供了一个更好的链接,也不允许Al

我知道这是一个非常简单的问题,但我正在寻找简洁明了的建议。我的应用程序是一个MDI应用程序。创建了一个在整个应用程序中使用的基本表单。有两个表单我们不希望用户关闭,因此为了避免人为错误,我们计划不允许用户关闭这些表单

我试图在表单关闭事件中设置
e.cancel=true
,但似乎不起作用。有人能给我一些建议吗

编辑:


问题是,当我使用此代码时,我的MDI应用程序中没有一个窗体正在关闭,甚至主MDI父窗体也是如此。

您也无法显示关闭按钮:

Cody Gray在评论中提供了一个更好的链接,也不允许Alt-F4关闭:


您也无法显示关闭按钮:

Cody Gray在评论中提供了一个更好的链接,也不允许Alt-F4关闭:


这里的问题可能是,当应用程序存在时,您希望窗口关闭,但如果用户试图手动关闭窗口,则不希望窗口关闭

要做到这一点,您必须有一个手动覆盖,比如定义了一个名为
allowShutdown
的变量,并且有一个方法可以在MdiParent关闭时进行设置

private void Form_Closing(object sender, EventArgs e)
{
  if( !allowShutdown) e.Cancel = true;
}

public void ForceShutdown()
{
  allowShutdown = true;
  Close();
}
然后在您的家长表格中:

private void Form_Closing(object sender, EventArgs e)
{
  if( childForm != null ) childForm.ForceShutdown();
}

这假定您在创建父窗体时,正在父窗体中维护对子窗体的引用。将此功能与另一篇文章中提到的隐藏关闭按钮的功能结合起来,您应该会有一个有效的解决方案。

这里的问题可能是您希望在应用程序存在时关闭窗口,但如果用户试图手动关闭窗口,则不会

要做到这一点,您必须有一个手动覆盖,比如定义了一个名为
allowShutdown
的变量,并且有一个方法可以在MdiParent关闭时进行设置

private void Form_Closing(object sender, EventArgs e)
{
  if( !allowShutdown) e.Cancel = true;
}

public void ForceShutdown()
{
  allowShutdown = true;
  Close();
}
然后在您的家长表格中:

private void Form_Closing(object sender, EventArgs e)
{
  if( childForm != null ) childForm.ForceShutdown();
}


这假定您在创建父窗体时,正在父窗体中维护对子窗体的引用。将这一点与隐藏另一篇文章中提到的关闭按钮的功能结合起来,您应该会有一个有效的解决方案。

我怀疑会给您足够的信息来确定是否有条件地取消关闭。

我怀疑会给您足够的信息来确定是否有条件地取消关闭。

您的意思是只是防止关上窗户?甚至停止这个过程?一个代码示例会很有帮助。e、 取消=真;应该可以。请告诉我们您设置
e.Cancel=true的代码设置
e.Cancel
应该可以工作。描述一下接下来会发生什么。我的票数都不多了,但这是重复的:。正如其他人提到的,
e.Cancel
应该可以工作,但它不是一个特别健壮的解决方案。你的意思是防止关闭窗口?甚至停止这个过程?一个代码示例会很有帮助。e、 取消=真;应该可以。请告诉我们您设置
e.Cancel=true的代码设置
e.Cancel
应该可以工作。描述一下接下来会发生什么。我的票数都不多了,但这是重复的:。正如其他人提到的,
e.Cancel
应该可以工作,但它不是一个特别健壮的解决方案。但是用户可以使用Alt+F4关闭表单。是的,这是禁用关闭按钮的错误方式。正如Fischermaen提到的,用户仍然可以使用键盘关闭窗口。相反,您应该将
CS\u NOCLOSE
样式添加到window类中,如前所述。@CodyGray很好找到了!我将更新答案以包含您的链接。如果你把它作为一个答案发布,我会投票给你,希望能给你一个被接受的标题。@ach:我已经把它作为另一个问题的答案发布了。。。大约一年前,但用户可以使用Alt+F4关闭表单。是的,这是禁用关闭按钮的错误方式。正如Fischermaen提到的,用户仍然可以使用键盘关闭窗口。相反,您应该将
CS\u NOCLOSE
样式添加到window类中,如前所述。@CodyGray很好找到了!我将更新答案以包含您的链接。如果你把它作为一个答案发布,我会投票给你,希望能给你一个被接受的标题。@ach:我已经把它作为另一个问题的答案发布了。。。大约一年前是的,这可能会奏效,但这是一个相当丑陋的解决方案。您正在阻止用户在不告诉用户不允许关闭表单的情况下关闭表单。他们会坐在那里徒劳地点击“X”按钮,什么也不会发生。绝对没有任何线索表明他们不被允许关上窗户。我在上面的链接是一个更好的选择。它最大限度地减少了您必须在每个表单中编写的代码量,并且让用户清楚地知道他们不允许关闭窗口。哈哈哈,不会有消息显示不要关闭仪表板,因为这是在获取实时数据,但是为了避免人为错误,我们正在实施这个解决方案。我在另一篇文章中说过要将这个方案与视觉变化一起实施。是的,这可能会奏效,但这是一个相当丑陋的解决方案。您正在阻止用户在不告诉用户不允许关闭表单的情况下关闭表单。他们会坐在那里徒劳地点击“X”按钮,什么也不会发生。绝对没有任何线索表明他们不被允许关上窗户。我在上面的链接是一个更好的选择。它最大限度地减少了您必须在每个表单中编写的代码量,并且让用户清楚地知道他们不允许关闭窗口。哈哈哈,不会有消息显示不要关闭仪表板,因为这是在获取实时数据,但是为了避免人为错误,我们正在实现这个解决方案。我在另一篇文章中说要实现这个解决方案以及视觉变化。