首页 新闻 会员 周边

C# 窗体 Close() 和 OnClosing() 的区别是什么

0
悬赏园豆:5 [已解决问题] 解决于 2014-02-21 13:28

rt,

发现重写OnClosing方法可以屏蔽窗体关闭事件,

  protected override void OnClosing(CancelEventArgs e)
        {
            e.Cancel = true;
        }

就是说这个方法和窗体关闭是挂钩的,但我直接调用这个方法却关不了窗体

this.OnClosing(new CancelEventArgs(false));

jerry128的主页 jerry128 | 初学一级 | 园豆:31
提问于:2014-02-20 11:48
< >
分享
最佳答案
1

Close是关闭窗体的方法,而onclosing是在关闭窗体引用的事件,当窗体close的时候,会触发onclosing事件,一般在onclosing事件中处理关闭窗体时需要做的事情,就onclosing而言,本事并不是关闭窗体,你调用onclosing事件肯定关闭不了。

关闭窗体:close-->onclosing-->onclosed

收获园豆:5
cenlo | 小虾三级 |园豆:583 | 2014-02-20 11:57

那为什么直接调用OnClosing方法关不了窗体?调用Close却能

jerry128 | 园豆:31 (初学一级) | 2014-02-20 11:58

@xmj112288: form.close()方法体中大约是这样的:

close()

{

  onclosing(this,e);

     if(!e.cancel)

  //do closeform

}

这样在调用close后。onclosing事件中可以取消窗口关闭,你直接调用OnClose则根本不会触发close代码

hailants | 园豆:750 (小虾三级) | 2014-02-20 12:59

@xmj112288: 这个其实是很简单的问题,建议提问者好好学习下基础知识。

hailants | 园豆:750 (小虾三级) | 2014-02-20 13:00

@xmj112288: 就像喝水,拿起杯子没有达到目的,而拿起杯子并把水喝了才是喝水

iEvent | 园豆:529 (小虾三级) | 2014-02-20 14:10

@hailants: 如果你有这方面(基础知识)的书籍或帖子的话,请推荐下.我是半路出生的,没系统的学过,所以很多你们看来是简单的问题,在我看来搞不明白的还是搞不明白,谢谢

jerry128 | 园豆:31 (初学一级) | 2014-02-20 18:10

@xmj112288: 去各大文库搜索一下.net开发基础之类的文章看一下。

学习与半路没什么关系,我也是半路,也没有经过系统学习,但是要记得,当遇到一个问题时,不光要知道怎么解,而且要学着知道为什么这么解,以上面的问题为例:你就需要尝试去了解:close和onclosing还有closing事件三个之间是什么关系。进而去深入了解什么是重载、什么是事件,为什么close要通过onclosing方法触发closing事件,这样的设计有什么样的好处……久而久之你的知识就会慢慢延伸组织成一个系统。

当然,如果你想要在这条路上一直走下去,那还是需要系统学习的,但是到那个时候,你系统学习的过程就是将你的知识网进行重组织,补齐其中缺失的地方。

先用后学,用以致学,学以致用……

hailants | 园豆:750 (小虾三级) | 2014-02-21 08:40
其他回答(3)
0

我觉得C#的事件系统和其他的差不多吧,我晓得我帮不了你,但是你去看一下C#的事件系统,就知道事件发生的顺序和事件的传播,肯定你就有方向了。

dsfadasa | 园豆:155 (初学一级) | 2014-02-20 11:54
0

OnClosing是winform窗体关闭前的响应事件
OnClose()是直接关闭当前窗体的办法

KivenRo | 园豆:1734 (小虾三级) | 2014-02-20 11:58

那为什么直接调用OnClosing方法关不了窗体?调用Close却能

支持(0) 反对(0) jerry128 | 园豆:31 (初学一级) | 2014-02-20 12:00

@xmj112288: 因为onclosing只是一个事件,本来并不包括关闭窗体的api,onclosing是告诉使用窗体的相关业务,现在窗体要关闭了,你们还有其他需要做的事情没,如果没有,我就关闭了。这样解释能明白么

支持(0) 反对(0) cenlo | 园豆:583 (小虾三级) | 2014-02-20 12:02
0

楼主成功把所有人都FAINT了。

1、在visual Studio里面,你写 this.OnClosing(new CancelEventArgs(false));直接会报错误的,不是关闭不了,而是编译不了。

2、我大概明白,你可能不想让Onclosing一直都有事件存在,而是在某个时候,不允许窗体关闭。

  这种情况在C#里面很好处理的,

      Addhandle me.onclosing, address of MyClosingHandle;

      大概这样就行了,你想关闭窗体直接 this.close()就行。

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-02-20 12:33

可以编译还能运行

支持(0) 反对(0) jerry128 | 园豆:31 (初学一级) | 2014-02-20 18:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册