NET快速开发实践中的IExtenderProvider扩展组件
? ? ?說起擴展編程組件,我們不得不起到一個接口IExtenderProvider,參考msdn的定義:定義將屬性擴展到容器中的其他組件的接口;下面我貼上IExtenderProvider的定義:
/// <summary>/// 定義將屬性擴展到容器中的其他組件的接口。/// </summary>public interface IExtenderProvider{/// <summary>/// 指定此對象是否可以將其擴展程序?qū)傩蕴峁┙o指定的對象。/// </summary>/// <param name="extendee">要接收擴展程序?qū)傩缘腟ystem.Object。</param>/// <returns>如果此對象可以擴展程序?qū)傩蕴峁┙o指定對象,則為true;否則為false。</returns>bool CanExtend(object extendee);}????????? 根據(jù)定義我們可以理解為,實現(xiàn)了IExtenderProvider接口的某個控件或者組件有擴展其他組件的能力,IExtenderProvider接口借助VisualStudio設(shè)計器的功能,使我們可以動態(tài)的為控件增加屬性,并可以在設(shè)計時通過屬性窗口修改這些屬性,而不需要繼承控件類。這樣做的最大好處是可以借助Visual Studio的能力,并保持控件原有的設(shè)計時支持。
????????? IExtenderProvider接口組件提供了一種與容器中其他組件的粘合能力,這無疑是為我們提供了另一種組件的擴展思想,我理解為侵入編程,假設(shè)沒有這個方式,我們擴展一個組件需求繼承原有的組件并且增加一個或多個擴展屬性,比如我們要達(dá)到這么一個目的,界面上指定的方本模框必須輸入字符才能離開輸入焦點,如果我們用傳統(tǒng)方法,需求重寫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("獲取/設(shè)置是否必須輸入")][DefaultValue(false)][Browsable(true)]public bool AllowInput{get{return this.allowInput;}set{this.allowInput = value;}}/// <summary>/// 默認(rèn)必須輸入字符。/// </summary>private bool allowInput = false;}????????? 我們來在UI上拖一個TextBoxEx控件,可以通過設(shè)置屬性AllowEmpty來控件是否允許輸入空值:
????????? 以下這種方式可以理解為.NET的原生實現(xiàn)方式,需求繼續(xù)原來控件,并且在應(yīng)用過程上需要調(diào)用UI的控件,比較麻煩,下面我們來用IExtenderProvider做一個實現(xiàn):
[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("獲取/設(shè)置文本框是否必須輸入")]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 組件,我們可以通過設(shè)置TextBox的在TextBoxAllowInput 上的擴展屬性AllowEmpty來控件是否允許輸入空值:
????????? 上例簡單的介紹了一下IExtenderProvider接口及其背后的編程思想,在開發(fā)過程中,我們可以應(yīng)用這種侵入式編程接口實現(xiàn)很多的擴展組件如數(shù)據(jù)綁定、輸入驗證、焦點跳轉(zhuǎn)、輸入法切換等多種多樣的快捷編程輔助組件。
????????? 下面我將會介紹基于IExtenderProvider擴展技術(shù)的UI控件與實體的數(shù)據(jù)綁定組件。
QQ群:15118502
鏈接:AgileEAS.NET應(yīng)用開發(fā)平臺介紹
AgileEAS.NET之敏捷并行開發(fā)方法
敏捷軟件工程實驗室
作者:魏瓊東?
出處:http://www.cnblogs.com/eastjade
關(guān)于作者:有13年的軟件從業(yè)經(jīng)歷,專注于中小軟件企業(yè)軟件開發(fā)過程研究,通過在技術(shù)與管理幫助中小軟件企業(yè)實現(xiàn)技術(shù)層面開源節(jié)流的目的。熟悉需求分析、企業(yè)架構(gòu)、項目管理。現(xiàn)主要從事基于AgileEAS.NET平臺的技術(shù)咨詢工作,主要服務(wù)于醫(yī)療衛(wèi)生、鐵路、電信、物流、物聯(lián)網(wǎng)、制造、零售等行業(yè)。如有問題或建議,請多多賜教!?
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,可以通過mail.james@qq.com?聯(lián)系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同討論,非常感謝。
? ? 本文轉(zhuǎn)自魏瓊東博客園博客,原文鏈接:http://www.cnblogs.com/eastjade/archive/2010/08/10/1796422.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的NET快速开发实践中的IExtenderProvider扩展组件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java.util.regex包下的Pa
- 下一篇: Lync 2013就地升级到Skype