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之敏捷并行開發方法
敏捷軟件工程實驗室
作者:魏瓊東?
出處:http://www.cnblogs.com/eastjade
關于作者:有13年的軟件從業經歷,專注于中小軟件企業軟件開發過程研究,通過在技術與管理幫助中小軟件企業實現技術層面開源節流的目的。熟悉需求分析、企業架構、項目管理。現主要從事基于AgileEAS.NET平臺的技術咨詢工作,主要服務于醫療衛生、鐵路、電信、物流、物聯網、制造、零售等行業。如有問題或建議,請多多賜教!?
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,可以通過mail.james@qq.com?聯系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同討論,非常感謝。
? ? 本文轉自魏瓊東博客園博客,原文鏈接:http://www.cnblogs.com/eastjade/archive/2010/08/10/1796422.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的NET快速开发实践中的IExtenderProvider扩展组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java.util.regex包下的Pa
- 下一篇: Lync 2013就地升级到Skype