您的位置:首页 > 其它

给控件动态添加属性的做法、IExtenderProvider接口的使用

2013-12-10 12:03 375 查看
最近在做项目的过程中,发现前面的同事在设计功能的时候引用了属性添加的这样类似tooltip功能的控件,之前没有研究过,度娘后发现这篇文章写的不错,转载。 

用过tooltip的人都知道,在添加一个tooltip后,所有界面上的控件自动加上一个“在tooltip1上的tooltip”的属性,这是怎么实现的呢?这是以为tooltip继承了接口IExtenderProvider,Vs在设计控件的时候就留有接口让程序员扩充控件的属性,这样我们不必为了给控件添加一个小小的属性就继承重写控件了。

    例子如下:

  写了一个IntelligentSave的类,继承了System.ComponentModel.Component,IExtenderProvider,并且实现了IExtenderProvider的固定方法,

代码:

using System;

using System.ComponentModel;

using System.Collections;

using System.Windows.Forms;

namespace IntelligentSave

{

   /// 

   /// 

   [ProvideProperty("SaveDeploy",typeof(Control))]//注意SaveDeploy名字必须和GetSaveDeploy、SetSaveDeploy相同

    public classIntelligentSave : System.ComponentModel.Component,IExtenderProvider

    {

       private Hashtable _innerTable = new Hashtable();

       private System.ComponentModel.Container components = null;

       public IntelligentSave(System.ComponentModel.IContainercontainer)

       {

           InitializeComponent();

       }

       [DefaultValue(false),Description("")]

       public bool GetSaveDeploy(Control control)

       {

           return this._innerTable.Contains(control);

       }

       public void SetSaveDeploy(Control control, bool value)

       {

           if (value)//要保存配置

           {

               this._innerTable.Add(control, value);

                

           }

           else

           {

               this._innerTable.Remove(control);

           }

       }

 

       public IntelligentSave()

       {

           ///

           /// Windows.Forms 类撰写设计器支持所必需的

           ///

           InitializeComponent();

           //

           // TODO: 在 InitializeComponent 调用后添加任何构造函数代码

           //

       }

       /// 

       protected override void Dispose( bool disposing )

       {

           if( disposing )

           {

               if(components != null)

               {

                   components.Dispose();

               }

           }

           base.Dispose( disposing );

       }

      #region 组件设计器生成的代码

       /// 

       private void InitializeComponent()

       {

           components = new System.ComponentModel.Container();

       }

       #endregion

       #region IExtenderProvider 成员

       public bool CanExtend(object extendee)

       {

           // TODO: 添加 Component1.CanExtend 实现

           if (extendee is Control &&!(extendee is IntelligentSave))

           {

               return true;

           }

           else

           {

               return false;

           }

       }

       #endregion

    }

}

 

把该代码放到一个cs文件中生成一遍,在另一个项目中添加该组件,并且添加其他的控件,可以看到其他的控件都添加了一个属性,如下intelligentSave1上的SaveDeploy属性。





需要说明的地方:

(1)我添加的是个bool类型的属性,可以添加其他任意类型的属性。在publicbool GetSaveDeploy中设定,并且可以设定默认值DefaultValue(false),

(2)我添加的名称是SaveDeploy,可以改成其他任何名字,记住要把GetSaveDeploy、SetSaveDeploy同时一起改。

(3)   publicbool CanExtend(object extendee)

       {

           // TODO: 添加 Component1.CanExtend 实现

           if (extendee is Control &&!(extendee is IntelligentSave))

           {

               return true;

           }

           else

           {

               return false;

           }

       }

方法中是是否实现添加属性的代码,如果只需给某一类控件加上属性,那么只需要把extendeeis Control 改成extendeeis Button等。记住一般情况下要排除自身!(extendeeis IntelligentSave)

就说这么多,给自己学习充电,也留给他人分享! 

转载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  控件
相关文章推荐