给控件动态添加属性的做法、IExten…

最近在做项目的过程中,发现前面的同事在设计功能的时候引用了属性添加的这样类似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 class IntelligentSave : System.ComponentModel.Component ,IExtenderProvider
    {
        private Hashtable _innerTable = new Hashtable();
        private System.ComponentModel.Container components = null;


        public IntelligentSave(System.ComponentModel.IContainer container)
        {
            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属性。


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

需要说明的地方:

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

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

(3)   public bool CanExtend(object extendee)
        {
            // TODO: 添加 Component1.CanExtend 实现
            if (extendee is Control && !(extendee is IntelligentSave))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

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

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

转载地址


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值