windows窗体继承问题

         窗体继承什么时候用的到呢?当我们使用三层架构来编写我们的cs程序时,我们的U层大部分是windows窗体。这个时候如果我们有一些公共变量,或者是一个窗体需要使用另一个窗体的数据。或者是有一些用于判断的公共的方法。比如为空判断、合法判断。对于这些判断而言。我们当然可以在U层放一个类。然后需要用到这些函数的时候就从这些类里面掉。对于需要用到其他窗体的变量我们当然可以用  (U窗体).变量  的方式调用。但现在的问题出来了。如果我某一天这个窗体的不想要了,那任何用到我这个窗体变量的窗体就统统的瘫痪了。这是不是就存在过于的耦合的。然后说放在一个公共的类里面。这样确实很好。但是不免让人家说你这个有点四不像了。U层放界面的地方你却放了类进去。这个时候窗体继承自然就出来了。而且我们会发现我们需要调用父类的方法。在子类中能直接写出来了。


        但不了解窗体继承还是会有些问题的。


  1. 从父类继承一个窗体后,发现打开子类窗体的设计界面时出错了,错误提示各种各样,原因只有一个:

由于vs的继承是必须先生成组件后,再从组件中继承的,所以当父类窗口有load或shown这类的事件时,继承它的子窗体就会先执行这一类的事件。假如父窗口的load事件中有一些类似连接数据库的操作,则往往会出错而无法设计。

简单的解决方法是在父窗口的load或shown事件中加入:


 

if not me.DesignModethen
.....
end if


 

2、屏蔽父窗体的事件

继承窗体一定有一些例外事件,比如父窗体的FormClosed事件写了日志,而子窗体不希望写日志而是其它操作,这就需要屏蔽父类事件。

目前还找不到比较好的办法,有一种折中的办法可用:


   首先把父类的事件改名,如按钮事件改如下(baseform是父类名称,仅用于易区分,可以是任何字符)并改成protected权限


   protected void button1_Click_baseform(object sender, EventArgs e)

   设计器baseform.Designer.cs里面也要对应改一下才能通过编译

   this.button1.Click += new System.EventHandler(this.button1_Click_baseform);

   子类可以正常使用按钮事件,仅在需要屏蔽父类按钮事件时,作如下修改

   在子类设计器Form1.Designer.cs里面把父类事件去除即可

   this.button1.Click -= newSystem.EventHandler(this.button1_Click_baseform);   //注意这行

   this.button1.Click += new System.EventHandler(this.button1_Click);


如果你有多层窗体继承,可以如法炮制,只要把各层父类的按钮事件改名即可。


因为会执行父类按钮事件是父类有事件委托,去除委托就可以了,这比网上说的虚函数重载方法要方便得多。


希望这点东西能让你更好的了解vs的工作机制,以及对窗体继承能更好的利用。


原文地址:https://www.cnblogs.com/jiangu66/p/3161564.html