窗体继承什么时候用的到呢?当我们使用三层架构来编写我们的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的工作机制,以及对窗体继承能更好的利用。

windows窗体继承问题的更多相关文章

  1. 深入Windows窗体原理及控件重绘技巧

    之前有学MFC的同学告诉我觉得Windows的控件重绘难以理解,就算重绘成功了还是有些地方不明白,我觉得可能很多人都有这样的问题,在这里我从Windows窗体的最基本原理来讲解,如果你有类似的疑惑希望 ...

  2. WinForm窗体继承

    在Windows应用程序中,从现有的窗体继承,查看子窗体的设计视图时,会出现错误: 服务容器中已存在服务 System.Windows.Forms.Design.IEventHandlerServic ...

  3. 使用自定义验证组件库扩展 Windows 窗体

    使用自定义验证组件库扩展 Windows 窗体             1(共 1)对本文的评价是有帮助 - 评价此主题                          发布日期 : 8/24/20 ...

  4. 最佳实践扩展Windows窗体DataGridView控件 .net 4.5 附示例代码

    Windows窗体DataGridView控件的性能调优.net 4.5   在处理大量数据时, DataGridView 控制可以消耗大量的内存开销,除非你仔细地使用它. 在客户有限的内存,你可以避 ...

  5. WinForm窗体继承自定义的模板窗体出错

    在开发Winform程序的时候,我们往往需要根据需要做一些自定义的控件模块,这样可以给系统模块重复利用,或者实现更好的效果等功能.而今天自定义一个窗体,然后子窗体继承的时候出现了一点问题. 问题: 在 ...

  6. Windows窗体应用开发2--窗体和控件

    1.Windows窗体应用程序的各种组件 2.windows窗体控件的主要类别和功能 3.Windows窗体应用程序处理事件的方法 4.添加并配置Windows窗体和控件 5.创建时间处理程序并监视程 ...

  7. Windows窗体间的数据交互

    轻松掌握Windows窗体间的数据交互                                     作者:郑佐 2004-04-05 Windows 窗体是用于 Microsoft Win ...

  8. Windows 窗体设计器(Windows Forms Designer)入门

      Visual Studio 2010 更新:2010 年 9 月 Windows 窗体设计器提供多个用于生成 Windows 窗体应用程序的工具. 本演练阐释如何使用设计器提供的各种工具生成应用程 ...

  9. [翻译]用于.NET Core的Windows窗体设计器发布

    本文由微信公众号<开发者精选资讯>翻译首发,转载请注明来源 今天我们很高兴地宣布,.NET Core项目的Windows窗体设计器现在可以在 Visual Studio 2019 16.6 ...

随机推荐

  1. 接口自动化测试:参数化封装(excel文件读取)

    log4j.properties文件配置 log4j.rootLogger = DEBUG,stdout,F log4j.appender.stdout = org.apache.log4j.Cons ...

  2. Appium根据xpath获取控件实例随笔

    如文章<Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.其中一种就是根据控件所在页面的XPATH来定位控件. 本文就是尝试通过 ...

  3. web.xml运行序列总结

    在整个订单<context-param>--<listener>--<filter>--<servlet>. 其中,内的各类别中的序列被运行.和< ...

  4. ASP.NET中XML转JSON的方法

    原文:ASP.NET中XML转JSON的方法 许多应用程序都将数据存储为XML的格式,而且会将数据以JSON的格式发送到客户端以做进一步处理.要实现这一点,它们必须将XML格式转换为JSON格式. X ...

  5. 一个用MFC实现Com聚合样本

    ComATLATLMFCMFC MFCIUnknownMFCCCmdTargetComMFCCom MFCCOM 1. 1.1 #pragma once typedef long HRESULT; / ...

  6. 激活windows server 2012 R2的方法

    首先登陆dreamspark 注册一个账号https://www.dreamspark.com/Account/SignIn.aspx, 点击创建账户,信息可以完全瞎编,邮箱不存在也可以.然后使用“我 ...

  7. Maven包装过程中跳过测试

    在具体项目,步骤需要跳过假设检验,应采取skipTests此属性设置为true. <pre name="code" class="html">< ...

  8. mysql基础之对库表操作

    原文:mysql基础之对库表操作 查看一下所有的库,怎么办? Mysql>Show databases; 选库语句: Use 库名 创建一个数据库: create database 数据库名 [ ...

  9. FileWriter字符输出流和FileReader字符输出流

    //FileWriter public class FileWriterDemo { //字符流:适用于文本文件,以字符为单位进行操作,经常和缓冲流一起使用 /**  * 字符流操作步骤:  * 1. ...

  10. Bootstrap 模态框

    Bootstrap 模态框(也可以说的弹出层) 最近在尝试使用bootstrap的模态框 使用模态框主要要引入一下几个js和css: bootstrap.css jquery.1.9.1.js(这个可 ...