windows窗体继承问题
窗体继承什么时候用的到呢?当我们使用三层架构来编写我们的cs程序时,我们的U层大部分是windows窗体。这个时候如果我们有一些公共变量,或者是一个窗体需要使用另一个窗体的数据。或者是有一些用于判断的公共的方法。比如为空判断、合法判断。对于这些判断而言。我们当然可以在U层放一个类。然后需要用到这些函数的时候就从这些类里面掉。对于需要用到其他窗体的变量我们当然可以用 (U窗体).变量 的方式调用。但现在的问题出来了。如果我某一天这个窗体的不想要了,那任何用到我这个窗体变量的窗体就统统的瘫痪了。这是不是就存在过于的耦合的。然后说放在一个公共的类里面。这样确实很好。但是不免让人家说你这个有点四不像了。U层放界面的地方你却放了类进去。这个时候窗体继承自然就出来了。而且我们会发现我们需要调用父类的方法。在子类中能直接写出来了。
但不了解窗体继承还是会有些问题的。
- 从父类继承一个窗体后,发现打开子类窗体的设计界面时出错了,错误提示各种各样,原因只有一个:
由于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窗体继承问题的更多相关文章
- 深入Windows窗体原理及控件重绘技巧
之前有学MFC的同学告诉我觉得Windows的控件重绘难以理解,就算重绘成功了还是有些地方不明白,我觉得可能很多人都有这样的问题,在这里我从Windows窗体的最基本原理来讲解,如果你有类似的疑惑希望 ...
- WinForm窗体继承
在Windows应用程序中,从现有的窗体继承,查看子窗体的设计视图时,会出现错误: 服务容器中已存在服务 System.Windows.Forms.Design.IEventHandlerServic ...
- 使用自定义验证组件库扩展 Windows 窗体
使用自定义验证组件库扩展 Windows 窗体 1(共 1)对本文的评价是有帮助 - 评价此主题 发布日期 : 8/24/20 ...
- 最佳实践扩展Windows窗体DataGridView控件 .net 4.5 附示例代码
Windows窗体DataGridView控件的性能调优.net 4.5 在处理大量数据时, DataGridView 控制可以消耗大量的内存开销,除非你仔细地使用它. 在客户有限的内存,你可以避 ...
- WinForm窗体继承自定义的模板窗体出错
在开发Winform程序的时候,我们往往需要根据需要做一些自定义的控件模块,这样可以给系统模块重复利用,或者实现更好的效果等功能.而今天自定义一个窗体,然后子窗体继承的时候出现了一点问题. 问题: 在 ...
- Windows窗体应用开发2--窗体和控件
1.Windows窗体应用程序的各种组件 2.windows窗体控件的主要类别和功能 3.Windows窗体应用程序处理事件的方法 4.添加并配置Windows窗体和控件 5.创建时间处理程序并监视程 ...
- Windows窗体间的数据交互
轻松掌握Windows窗体间的数据交互 作者:郑佐 2004-04-05 Windows 窗体是用于 Microsoft Win ...
- Windows 窗体设计器(Windows Forms Designer)入门
Visual Studio 2010 更新:2010 年 9 月 Windows 窗体设计器提供多个用于生成 Windows 窗体应用程序的工具. 本演练阐释如何使用设计器提供的各种工具生成应用程 ...
- [翻译]用于.NET Core的Windows窗体设计器发布
本文由微信公众号<开发者精选资讯>翻译首发,转载请注明来源 今天我们很高兴地宣布,.NET Core项目的Windows窗体设计器现在可以在 Visual Studio 2019 16.6 ...
随机推荐
- 全局scope与Isolate scope通信
AngularJS 全局scope与Isolate scope通信 在项目开发时,全局scope 和 directive本地scope使用范围不够清晰,全局scope与directive本地scope ...
- View中的Razor使用
View中的Razor使用 上一节:ASP.NET MVC5 + EF6 入门教程 (5) Model和Entity Framework 源码下载:点我下载 一.Razor简介 在解决方案资源管理 ...
- MvcPager分页控件以适用Bootstrap
随笔- 9 文章- 0 评论- 33 修改MvcPager分页控件以适用Bootstrap 效果(含英文版,可下载) 软件开发分页效果必不可少,对于Asp.Net MVC 而言,MvcPag ...
- Android多画面幻灯片:ViewPager基础上,利用与PagerTabStrip出生缺陷(源代码)
近期使用ViewPager.读了几个人说是不是很清晰的信息,干脆自己写demo总结下. 样例非常easy.Activity里有三个界面能够滑动.每个界面都有一个button并设置好了监听.PagerT ...
- Javascript中布尔运算符的高级应用
对象检测语句:var W3CDOM = document.getElementsByTagName && document.createElement 为了执行运算符&& ...
- 松瀚SN8P2501 定时器初始化程序--汇编源码
/* 松瀚 SN8P2501B 定时器初始化程序 */ INI_IRQ: ;定时器T0初始化 MOV A, #01100000b ;定时器模式Fcpu/4 16M/4/4=1M 1U计一次 B0MOV ...
- 订单处理(c#实现)
State模式的经典应用场景:订单处理(c#实现) State模式在对象内部状态发生变化的时候,改变自身的行为,这通常是通过切换内部状态对象实现的,对象将自身在各个状态的行为推给了状态对象,从而解开了 ...
- java class load
https://mp.weixin.qq.com/s?__biz=MjM5NzMyMjAwMA==&mid=403638649&idx=2&sn=4f17e8b58c64875 ...
- 一个ASP.NET Web API 2.0应用
在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.N ...
- 传说中的WCF(1):这东西难学吗?
WCF难学吗? 是啊,这问题估计很多人都会问,也包括阿拉在内,也有此深刻而严重的凝问. 也有人说:“如何某项技术可以化繁为简,学起来轻松一点就好了.”也许,人类开生就摆脱不了一种习性——懒惰:不过,也 ...