给控件动态添加属性的做法、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属性。
![](http://s6.sinaimg.cn/mw690/59cea87ftx6CuFxSbtz15&690)
需要说明的地方:
(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)
就说这么多,给自己学习充电,也留给他人分享!
转载地址
用过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)
就说这么多,给自己学习充电,也留给他人分享!
转载地址
相关文章推荐
- [c#.net]做tooltip给控件动态添加属性的做法、IExtenderProvider接口的使用
- c#.net]做tooltip给控件动态添加属性的做法、IExtenderProvider接口的使用
- c#.net]做tooltip给控件动态添加属性的做法、IExtenderProvider接口的使用
- [c#.net]做tooltip给控件动态添加属性的做法、IExtenderProvider接口的使用
- 给控件动态添加属性的做法、IExten…
- 【C#】使用IExtenderProvider为控件添加扩展属性,像ToolTip那样
- 用于创建实现 System.ComponentModel.INotifyPropertyChanged 接口的动态类型,并添加各个 public 属性的定义
- C#.NET常见问题(FAQ)-如何使用变量动态添加控件
- 使用xib给label等文字显示控件添加attributed属性
- 使用代码动态添加、删除view,通过tag寻找控件
- Android动态布局,并动态为TextView控件设置drawableLeft、drawableRight等属性添加图标
- 在dojo 下使用checkbox时,动态添加checked属性问题
- 在C#中使用属性控件添加属性窗口
- 使用 Columns 集合动态向 DataGrid 控件添加列。
- iOS 面试题(十):runtime 使用——(动态添加方法/动态交换方法/动态添加属性)
- 后台动态添加布局文件、控件与动态设置属性2
- iOS:runtime的使用(动态添加方法、关联方法、交换方法、遍历私有属性)
- Android中的基础-----如何使用JAVA动态的添加并设置组件属性
- C#.NET常见问题(FAQ)-如何使用变量动态添加控件
- 动态向页面添加控件和使用正则表达式