NET快速开发实践中的IExtenderProvider扩展组件
说起扩展编程组件,我们不得不起到一个接口IExtenderProvider,参考msdn的定义:定义将属性扩展到容器中的其他组件的接口;下面我贴上IExtenderProvider的定义:
/// <summary>/// 定义将属性扩展到容器中的其他组件的接口。/// </summary>public interface IExtenderProvider{/// <summary>/// 指定此对象是否可以将其扩展程序属性提供给指定的对象。/// </summary>/// <param name="extendee">要接收扩展程序属性的System.Object。</param>/// <returns>如果此对象可以扩展程序属性提供给指定对象,则为true;否则为false。</returns>bool CanExtend(object extendee);}
根据定义我们可以理解为,实现了IExtenderProvider接口的某个控件或者组件有扩展其他组件的能力,IExtenderProvider接口借助VisualStudio设计器的功能,使我们可以动态的为控件增加属性,并可以在设计时通过属性窗口修改这些属性,而不需要继承控件类。这样做的最大好处是可以借助Visual Studio的能力,并保持控件原有的设计时支持。
IExtenderProvider接口组件提供了一种与容器中其他组件的粘合能力,这无疑是为我们提供了另一种组件的扩展思想,我理解为侵入编程,假设没有这个方式,我们扩展一个组件需求继承原有的组件并且增加一个或多个扩展属性,比如我们要达到这么一个目的,界面上指定的方本模框必须输入字符才能离开输入焦点,如果我们用传统方法,需求重写TextBox控件,代码如下:
public class TextBoxEx:TextBox{protected override void OnDragLeave(EventArgs e){if (this.allowInput){if(this.Text.Trim().Length ==0){MessageBox.Show("文本框必须输入字符!", "提示", MessageBoxButtons.OK,
MessageBoxIcon.Information);if (this.CanFocus)this.Focus();}base.OnDragLeave(e);}}/// <summary>/// 是否容器输入为空。/// </summary>[Category("验证")][Description("获取/设置是否必须输入")][DefaultValue(false)][Browsable(true)]public bool AllowInput{get{return this.allowInput;}set{this.allowInput = value;}}/// <summary>/// 默认必须输入字符。/// </summary>private bool allowInput = false;}
我们来在UI上拖一个TextBoxEx控件,可以通过设置属性AllowEmpty来控件是否允许输入空值:
以下这种方式可以理解为.NET的原生实现方式,需求继续原来控件,并且在应用过程上需要调用UI的控件,比较麻烦,下面我们来用IExtenderProvider做一个实现:
[ToolboxItem(true)][Description("TextBox必须输入组件。")][ProvideProperty("AllowInput", typeof(TextBox))]public partial class TextBoxAllowInput : Component, System.ComponentModel.IExtenderProvider{private Dictionary<TextBox, bool> allowInputList = null;public TextBoxAllowInput(){InitializeComponent();allowInputList = new Dictionary<TextBox, bool>();}public TextBoxAllowInput(IContainer container){container.Add(this);InitializeComponent();allowInputList = new Dictionary<TextBox, bool>();}[Category("输入验证")][Description("获取/设置文本框是否必须输入")]public bool GetAllowInput(TextBox textBox){if (allowInputList.ContainsKey(textBox)){return (bool)allowInputList[textBox];}return false;}public void SetAllowInput(TextBox textBox, bool allowInput){if (!allowInputList.ContainsKey(textBox)){allowInputList.Add(textBox, allowInput);textBox.Leave += new EventHandler(textBox_Leave); }else{allowInputList[textBox] = allowInput;}}void textBox_Leave(object sender, EventArgs e){TextBox tb = sender as TextBox;if (this.GetAllowInput(tb)){if (tb.Text.Trim().Length == 0){MessageBox.Show("文本框必须输入字符!", "提示", MessageBoxButtons.OK,
MessageBoxIcon.Information);if (tb.CanFocus)tb.Focus();}}} public bool CanExtend(object extendee){return (extendee is TextBox); //只扩展TextBox}}
我们来在UI上拖一个几个TextBox控件,再拖一个TextBoxAllowInput 组件,我们可以通过设置TextBox的在TextBoxAllowInput 上的扩展属性AllowEmpty来控件是否允许输入空值:
上例简单的介绍了一下IExtenderProvider接口及其背后的编程思想,在开发过程中,我们可以应用这种侵入式编程接口实现很多的扩展组件如数据绑定、输入验证、焦点跳转、输入法切换等多种多样的快捷编程辅助组件。
下面我将会介绍基于IExtenderProvider扩展技术的UI控件与实体的数据绑定组件。
QQ群:15118502
链接:AgileEAS.NET应用开发平台介绍
AgileEAS.NET之敏捷并行开发方法
敏捷软件工程实验室
NET快速开发实践中的IExtenderProvider扩展组件相关推荐
- 为什么调用webservice接口只有 string arg0_快速开发平台中关于支持第三方接口开发的指导
说明: 本示例中的代码和截图可能和您现在手中的版本不同,但操作思路一样. 以下例子要自己写代码,是写死的那种代码类型,请根据自己实际业务编写代码只是作为参考,不能直接调用 背景介绍 表单或者列表部分数 ...
- 【组件开发实践】云巧流程组件对接实践
1. 用户需求 假设A系统有如下员工请假审批流场景: 员工请假小于等于3天,只需主管直接审批:大于3天需要主管先审批,审批通过后再由二级主管进行审批.当员工请假审批流节后后,需要通知A系统进行业务处理 ...
- android 组件生命周期,Android组件化开发实践(五):组件生命周期管理
每个Android应用启动时,都会先创建一个Application.通常在Application里我们会做一些应用初始化的操作,常见的有第三方SDK初始化.在应用组件化之后,组件与壳工程是隔离开来的, ...
- android组件化数据生命周期,Android组件化开发实践(五):组件生命周期管理
每个Android应用启动时,都会先创建一个Application.通常在Application里我们会做一些应用初始化的操作,常见的有第三方SDK初始化.在应用组件化之后,组件与壳工程是隔离开来的, ...
- 《盟威软件快速开发平台》开发
来源:http://www.accessoft.com/rdp/tutorial/main.html 因此在使用<盟威软件快速开发平台>时,会有一些特别的讲究,如数据和程序分离(分为后台数 ...
- SNF快速开发平台MVC-高级查询组件
1. 高级查询 在我们做项目的时候经常想要按名称.编号进行查询数据,可在开发时会把最常用的查询条件写上,不常用的就不写了,也是因为把所有字段都写上太多了,布局不好看而且不实用.还有些查询条件几百年 ...
- SNF快速开发平台MVC-自由排序组件
1. 自由排序功能使用 在一些需要排序优先级的数据进行调整处理,如民族数据,在北方实施的时候汉族比较多,希望把汉族放在第一位.在蒙古实施项目时,蒙古族人最多把蒙古族放在第一选择位. 1.1. ...
- 一. 卡尔曼滤波器开发实践之一: 五大公式详解
既然标题名称是开发实践,本系列文章将主要介绍如何在工程实践中使用卡尔曼滤波器,至于卡尔曼滤波器的五大公式如何推导而来,网上有很多大拿们写的都很精彩,这里不再叙述.可以参考了下面两篇博文: 1. 卡尔曼 ...
- 快速开发平台分享-UCML快速开发七种武器
传统的快速开发平台强调的是组件重用.构件重用,主要解决功能重用层面,一般提供了软件开发最常用的功能:表单设计.BPM(业务流程管理).报表.组织机构及权限等功能.但只有功能重用,没有过程重用,要么只能 ...
最新文章
- mysql自定义收藏分类_MYSQL中SHOW的使用整理收藏
- python三:if...else
- xsy 1836 - Shop
- 初识mysql学习笔记
- k8s使用kubectl命令部署nginx并以nodeport方式暴露端口
- MySQL字符集的基本类型与统一字符集
- Linux之定时任务补充
- mysql t 保存_检查 (调试) - 离线消息保存到 MySQL - 《EMQ X Enterprise v4.1 中文文档》 - 书栈网 · BookStack...
- 《剑指Offer》 最小的K个数
- WEB消息提醒实现之二 实现方式-Jquery Ajax轮询
- app接口服务器请求为什么会报错307_Vue接口代理和数据Mock,你会了吗
- 根据专利号到专利查询的网站上抓取想要的信息(上)
- linux中elf文件的作用,Linux中ELF格式文件介绍
- 给定一个整数序列,求中位数
- 程序员面试金典——11.6矩阵元素查找
- ZLMediaKit+wvp-GB28181-pro,搭建28181协议视频平台
- Flutter框架详解
- 计算机中丢失msvcp120.dll是什么意思,win7系统玩游戏提示“msvcp120.dll丢失”怎么修复...
- 愿得一心人:硅谷亿万富豪们的婚姻怎样?有人白首相守七十年
- 掘金mysql_我的 mysql 半年小得 | 掘金征文
热门文章
- python开发一个彩票系统_[宜配屋]听图阁
- python的输出方式_Python--输出方式
- 生鲜配送小程序源码_生鲜配送小程序开发
- Google Guava官方教程(中文版)
- Android安全加密:消息摘要Message Digest
- python简单的小程序_初学python的一些简单程序(1)
- stp协议c语言,STP(生成树协议)
- 基于Java的RDMA高性能通信库(六):SDP - Java Socket Direct Protocol
- matlab如何表示一阶导数,三阶样条插值(一阶导数边界条件) matlab程序
- Redis基础知识总结概述