关于windform中show()后窗口关闭的问题
一直没有在博客完上写过东西,今天开博,记录下遇到的问题及解决方法,供以后回顾参考....
前一阵子,在公司的一个项目中遇到这样一个问题:程序是winform程序,在程序中对于错误的提示进行了统一封装,并且用类似于msn的信息提示方式把错误及其他提示信息显示出来,然后在弹出的Pop窗口中设置一个定时器,来关闭提示窗口.这种实现在一般的情况下没有什么问题,但是在另外情况下就出现问题了.例如:在主程序的基础上在通过模式的ShowDialog弹出窗口,此时恰好在弹出窗口上进行某项操作之后,报错了,提示窗口也弹出来了.等到提示窗口关闭之后,原先弹出窗口也一同被关闭了.有时这种情况出现也影响不大,但是客户是上帝,上帝提出来说不行,那我们就得改.当然这种错误出现也是不允许的.于是,调试程序发现,当弹出的提示窗口自动关闭时,原先ShowDialog出来的窗口的DialogResult变为Cancel了,所以关闭掉了.但是,为什么会造成这种情况呢?一时半会也没有找出原因来....
一时没有找出来原因,于是把弹出消息窗口改进了一下,对弹出消息窗口使用单件模式,构造唯一实例,然后在定时器事件里面把窗口Hide()掉,下次再要显示消息时再Show()出来,定时器重置也可以达到相同的效果.虽然这样是解决掉了上面提出的问题,但是这样实现会出现一个新的问题.本来弹出的消息窗口有一个渐变效果是放在shown事件里面,有一些初始化工作放在load事件里面,这样一来重新show()出窗口时渐变效果和一些初始化工作不好处理,也增加了代码量.思量一番,还是回头解决之前窗口一同关闭的问题.再一次仔细调试一下代码,发现是在调用this.Close()之后,调用垃圾回收方法,代码:
1 protected override void Dispose(bool disposing)
2 {
3 if (disposing && (components != null))
4 {
5 components.Dispose();
6 }
7 base.Dispose(disposing);
8 }
方法调用了base.Dispose(disposing)引起的,找到原因,解决起来就方便了,于是把这一句注掉,解决.