zoukankan      html  css  js  c++  java
  • VS .NET 窗体继承时错误解决方案

    WinForm窗体继承是必须的,但是vs的窗体继承不如Delphi那样随心所欲。

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

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

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

    if (!DesignMode) { 你的代码段..... }

    终极解决方案:不要在基类窗体中注册Load、、等等事件.

    参考资料:http://www.cnblogs.com/batoosai/archive/2006/04/05/367484.html

     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);

        子类可以正常使用按钮事件,仅在需要屏蔽父类按钮事件时,在子类的构造函数中把对应事件的父类委托去除即可,如下

        public Form1()
        {
                InitializeComponent();
                this.button1.Click -= new EventHandler(base.button1_Click_baseform); //增加这行

        }

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

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

  • 相关阅读:
    慎用const_cast
    python中string的操作函数
    C++ Const总结
    python dict sorted 排序
    "没有找到MSVCP80D.dll,因此这个应用程序未能启动。重新安装应用程序...
    提高你开发效率的十五个 Visual Studio 使用技巧
    一些 python 插件 编译安装的注意事项
    html 制作表格 合并 样式
    将一个表的数据更新到另一个表中
    屏蔽web页面的右键,但不屏蔽输入框中的右键
  • 原文地址:https://www.cnblogs.com/perzy/p/3470358.html
Copyright © 2011-2022 走看看