zoukankan      html  css  js  c++  java
  • 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的工作机制,以及对窗体继承能更好的利用。


  • 相关阅读:
    svn checkout单个文件
    ubuntu下使用fstab挂载硬盘时,属于root,如何把它改为属于一个用户的(如sgjm)
    TCP/IP 端口号大全
    Netstat命令详解(windows下)
    Linux netstat命令详解
    windows下用cmd命令netstat查看系统端口使用情况
    LR函数基础(一)(二)
    loadrunner error 27796 Failed to connect to server
    安装lr时无法将值Disable Script Debugger 写入注册表
    LR接口性能测试提示Code
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3161564.html
Copyright © 2011-2022 走看看