C# ProperTyGrid 自定义属性
C# 如果要实现自定义属性必须要需要实现接口ICustomTypeDescriptor
// 摘要:
// 提供为对象提供动态自定义类型信息的接口。
public interface ICustomTypeDescriptor
例子:
/// <summary>
/// 自定义属性对象
/// </summary>
public class MyAttr
{
private string name = string.Empty; public string Name
{
get { return name; }
set { name = value; }
}
private object value = null; public object Value
{
get { return this.value; }
set { this.value = value; }
} private string description = string.Empty; public string Description
{
get { return description; }
set { description = value; }
} public override string ToString()
{
return string.Format("Name:{0},Value:{1}",name.ToString(),value.ToString());
}
} /// <summary>
/// 自定义性质描述类
/// </summary>
public class MyPropertyDescription : PropertyDescriptor
{
private MyAttr myattr = null;
public MyPropertyDescription(MyAttr myattr, Attribute[] attrs): base(myattr.Name, attrs)
{
this.myattr = myattr;
}
public override bool CanResetValue(object component)
{
return false;
} public override Type ComponentType
{
get
{
return this.GetType();
}
} public override object GetValue(object component)
{
return myattr.Value;
} public override bool IsReadOnly
{
get
{
return false;
}
} public override Type PropertyType
{
get
{
return myattr.Value.GetType();
}
} public override void ResetValue(object component)
{
//不重置,无动作
} public override void SetValue(object component, object value)
{
myattr.Value = value;
}
/// <summary>
/// 是否应该持久化保存
/// </summary>
/// <param name="component"></param>
/// <returns></returns>
public override bool ShouldSerializeValue(object component)
{
return false;
}
/// <summary>
/// 属性说明
/// </summary>
public override string Description
{
get
{
return myattr.Description;
}
}
} /// <summary>
/// 实现自定义的特殊属性对象必须继承ICustomTypeDescriptor,并实现Dictionary
/// </summary>
public class MyAttrCollection : Dictionary<String, MyAttr>, ICustomTypeDescriptor
{
/// <summary>
/// 重写Add方法
/// </summary>
/// <param name="attr"></param>
public void Add(MyAttr attr)
{
if (!this.ContainsKey(attr.Name))
{
base.Add(attr.Name, attr);
}
} public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
} public string GetClassName()
{
return TypeDescriptor.GetClassName(this,true);
} public string GetComponentName()
{
return TypeDescriptor.GetClassName(this, true);
} public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
} public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
} public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
} public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
} public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
} public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
} public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
int count=this.Values.Count;
PropertyDescriptor[] pds=new PropertyDescriptor[count];
int index = ;
foreach (MyAttr item in this.Values)
{
pds[index] = new MyPropertyDescription(item,attributes);
index++;
}
return new PropertyDescriptorCollection(pds);
} public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
} public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
}
前台调用
private void btnAddProperType_Click(object sender, EventArgs e)
{
MyAttr attr = new MyAttr();
attr.Name = txtName.Text.Trim();
attr.Value = txtValue.Text.Trim();
attr.Description = txtDescription.Text.Trim();
mac.Add(attr);
MyGrid.Refresh();
}
private void button1_Click(object sender, EventArgs e)
{
AddAttrColor();
AddAttrImage();
AddAttrEmun();
MyGrid.Refresh();
} private void AddAttrEmun()
{
MyAttr attr = new MyAttr();
attr.Name = "Dock";
attr.Value = DockStyle.Fill;
attr.Description = "枚举";
mac.Add(attr);
} private void AddAttrImage()
{
MyAttr attr = new MyAttr();
attr.Name = "Image";
attr.Value = new Bitmap(,);
attr.Description = "图片";
mac.Add(attr);
} private void AddAttrColor()
{
MyAttr attr = new MyAttr();
attr.Name = "Color";
attr.Value = Color.Red;
attr.Description = "颜色";
mac.Add(attr);
}
效果图
C# ProperTyGrid 自定义属性的更多相关文章
- PropertyGrid控件由浅入深(二):基础用法
目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要 ...
- PropertyGrid控件由浅入深(一):文章大纲
Winform中PropertyGrid控件是一个非常好用的对象属性编辑工具,对于Key-Value形式的数据的处理也是非常的好用. 因为Property控件设计良好,在很小的空间内可以展示很多的内容 ...
- C# 如何定义让PropertyGrid控件显示[...]按钮,并且点击后以下拉框形式显示自定义控件编辑属性值
关于PropertyGrid控件的详细用法请参考文献: 1.C# PropertyGrid控件应用心得 2.C#自定义PropertyGrid属性 首先定义一个要在下拉框显示的控件: using Sy ...
- WinForm窗体PropertyGrid控件的使用
使用过 Microsoft Visual Basic 或 Microsoft Visual Studio .NET的朋友,一定使用过属性浏览器来浏览.查看或编辑一个或多个对象的属性..NET 框架 P ...
- PropertyGrid排序
解决PropertyGrid对自定义属性排序的问题. 参考了:http://www.cnblogs.com/greatverve/archive/2012/02/08/propergrid-order ...
- PropertyGrid—添加属性Tab
零.引言 PropertyGrid用来显示和编辑对象的属性,前面已经简单介绍了如何使用该控件和提供不同的属性编辑方法.前面主要讲如何使用该控件,但有时,该控件无法满足我们的需求,就需要对其进行扩展.本 ...
- c# propertyGrid下拉选项
实现下面效果的propertygrid属性下拉选择
- System.Windows.Forms.PropertyGrid的使用
PropertyGrid 控件简介 .NET 框架 PropertyGrid 控件是 Visual Studio .NET 属性浏览器的核心.PropertyGrid 控件显示对象或类型的属性,并主要 ...
- 数据网格和树-EasyUI Datagrid 数据网格、EasyUI Propertygrid 属性网格、EasyUI Tree 树、EasyUI Treegrid 树形网格
EasyUI Datagrid 数据网格 扩展自 $.fn.panel.defaults.通过 $.fn.datagrid.defaults 重写默认的 defaults. 数据网格(datagrid ...
随机推荐
- 琐碎-hadoop2.2.0-hbase0.96.0-hive0.13.1整合
关于hadoop和hive.hbase的整合就不说了,这里就是在hadoop2.2.0的环境下整合hbase和hive 因为hive0.12不支持hadoop2,所以还要替换一些hadoop的jar包 ...
- Redis客户端Java服务接口封装
最近在学习Redis并集成到Spring中去,发现Spring的RedisTemplate并不好用,还没有MongoTemplate好用. 而且发现Jedis和ShardedJedis的方法非常多,覆 ...
- ubuntu 12.10安装VIM
使用命令:sudo apt-get install vim vim-gtk 可能安装时出错,可用下面更新系统,再执行上面的安装命令. 更新:sudo apt-get update
- revel + swagger 文档也能互动啦
beego 从 1.3 后开始支持自动化API文档,不过,目测比较复杂,一直期望 revel 能有官方支持. revel 确实已经有了官方支持的计划,有可能将在 0.14 版本支持,现在才 0.11. ...
- jQuery .on() 绑定事件无效
前几天,要在移动端实现一系列的功能,用 HTML + JS. 按照以往的思路,事件绑定就直接 $(document).on "click", "selector" ...
- HttpServletResponse接口
public interface HttpServletResponse extends ServletResponse 描述一个返回到客户端的HTTP回应.这个接口允许Servlet程序员利用HTT ...
- codevs4600 [NOI2015]程序自动分析==洛谷P1955 程序自动分析
4600 [NOI2015]程序自动分析 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 在实现 ...
- Filter的执行顺序及实例
学习中的收藏,该文出自http://www.cnblogs.com/Fskjb/archive/2010/03/27/1698448.html 在此,非常感谢该文章作者的分享,本文完全转载自上面链接, ...
- ORACLE之表
本文章中的表在以后的例子中会用到. 首先有t_fn_person和t_fn_dept表. ) primary key not null, person_code ) not null, person_ ...
- Android之动态图片
在Android中,比起静态图片来动态图片会更加生动更加酷炫,因为这种视觉效果,你应该会发现我们手机中大多数应用软件的导航页面也都是采用动态图片来展示.动态图片的格式有gif.png格式等等. 我们就 ...