自定义PropertyGrid控件【转】
这篇随笔其实是从别人博客上载录的。感觉很有价值,整理了一下放在了我自己的博客上,希望原作者不要介意。
可自定义PropertyGrid控件的属性。也可将属性名称显示为中文。主要是由XML文件与ICustomTypeDescriptor来实现。
第一步:做一个继承ICustomTypeDescriptor接口的类 文件名称:CustomProperty.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Xml;
using System.Windows.Forms;
namespace **
{
class CustomProperty : ICustomTypeDescriptor
{
//当前选择对象
private object mCurrentSelectObject;
private Dictionary<string, string> mObjectAttribs = new Dictionary<string, string>();
public CustomProperty(object pSelectObject, XmlNodeList pObjectPropertys)
{
mCurrentSelectObject = pSelectObject;
XmlNode tmpXNode;
IEnumerator tmpIe = pObjectPropertys.GetEnumerator();
while (tmpIe.MoveNext())
{
tmpXNode = tmpIe.Current as XmlNode;
mObjectAttribs.Add(tmpXNode.Attributes["Name"].Value, tmpXNode.Attributes["Caption"].Value);
}
}
#region ICustomTypeDescriptor Members
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(mCurrentSelectObject);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(mCurrentSelectObject);
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(mCurrentSelectObject);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(mCurrentSelectObject);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(mCurrentSelectObject);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(mCurrentSelectObject);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(mCurrentSelectObject, editorBaseType);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(mCurrentSelectObject, attributes);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(mCurrentSelectObject);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
List<CustomPropertyDescriptor> tmpPDCLst = new List<CustomPropertyDescriptor>();
PropertyDescriptorCollection tmpPDC = TypeDescriptor.GetProperties(mCurrentSelectObject, attributes);
IEnumerator tmpIe = tmpPDC.GetEnumerator();
CustomPropertyDescriptor tmpCPD;
PropertyDescriptor tmpPD;
while (tmpIe.MoveNext())
{
tmpPD = tmpIe.Current as PropertyDescriptor;
if (mObjectAttribs.ContainsKey(tmpPD.Name))
{
tmpCPD = new CustomPropertyDescriptor(mCurrentSelectObject, tmpPD);
tmpCPD.SetDisplayName(mObjectAttribs[tmpPD.Name]);
tmpCPD.SetCategory(tmpPD.Category + "中文");
tmpPDCLst.Add(tmpCPD);
}
}
return new PropertyDescriptorCollection(tmpPDCLst.ToArray());
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(mCurrentSelectObject);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return mCurrentSelectObject;
}
#endregion
class CustomPropertyDescriptor : PropertyDescriptor
{
private PropertyDescriptor mProp;
private object mComponent;
public CustomPropertyDescriptor(object pComponent, PropertyDescriptor pPD)
: base(pPD)
{
mCategory = base.Category;
mDisplayName = base.DisplayName;
mProp = pPD;
mComponent = pComponent;
}
private string mCategory;
public override string Category
{
get { return mCategory; }
}
private string mDisplayName ;
public override string DisplayName
{
get { return mDisplayName; }
}
public void SetDisplayName(string pDispalyName)
{
mDisplayName = pDispalyName;
}
public void SetCategory(string pCategory)
{
mCategory = pCategory;
}
public override bool CanResetValue(object component)
{
return mProp.CanResetValue(component);
}
public override Type ComponentType
{
get { return mProp.ComponentType; }
}
public override object GetValue(object component)
{
return mProp.GetValue(component);
}
public override bool IsReadOnly
{
get { return mProp.IsReadOnly; }
}
public override Type PropertyType
{
get { return mProp.PropertyType; }
}
public override void ResetValue(object component) { mProp.ResetValue(component); }
public override void SetValue(object component, object value) { mProp.SetValue(component, value); }
public override bool ShouldSerializeValue(object component)
{
return mProp.ShouldSerializeValue(component);
}
}
#region ICustomTypeDescriptor 成员
AttributeCollection ICustomTypeDescriptor.GetAttributes()
{
throw new Exception("The method or operation is not implemented.");
}
string ICustomTypeDescriptor.GetClassName()
{
throw new Exception("The method or operation is not implemented.");
}
string ICustomTypeDescriptor.GetComponentName()
{
throw new Exception("The method or operation is not implemented.");
}
TypeConverter ICustomTypeDescriptor.GetConverter()
{
throw new Exception("The method or operation is not implemented.");
}
EventDescriptor ICustomTypeDescriptor.GetDefaultEvent()
{
throw new Exception("The method or operation is not implemented.");
}
PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty()
{
throw new Exception("The method or operation is not implemented.");
}
object ICustomTypeDescriptor.GetEditor(Type editorBaseType)
{
throw new Exception("The method or operation is not implemented.");
}
EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes)
{
throw new Exception("The method or operation is not implemented.");
}
EventDescriptorCollection ICustomTypeDescriptor.GetEvents()
{
throw new Exception("The method or operation is not implemented.");
}
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
{
throw new Exception("The method or operation is not implemented.");
}
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
{
throw new Exception("The method or operation is not implemented.");
}
object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd)
{
throw new Exception("The method or operation is not implemented.");
}
#endregion
}
}
第二步:XML文件的处理 做一个XML文件名为CustomProperty.xml
<?xml version="1.0" encoding="gb2312" ?>
<Components>
<Component Name="TextBox" Namespace="System.Windows.Forms" Asm="System.dll">
<Propertys>
<Property Name="BackColor" Caption="背影色" Group=""/>
<Property Name="BorderStyle" Caption="边框样式" Group=""/>
<Property Name="Font" Caption="字体" Group=""/>
<Property Name="ForeColor" Caption="字色" Group=""/>
<Property Name="Text" Caption="内容" Group=""/>
<Property Name="ScrollBars" Caption="滚动条" Group=""/>
<Property Name="TextAlign" Caption="文本对齐" Group=""/>
<Property Name="Multline" Caption="多行" Group=""/>
<Property Name="PasswordChar" Caption="密码文本" Group=""/>
<Property Name="Size" Caption="大小" Group=""/>
<Property Name="Location" Caption="位置" Group=""/>
</Propertys>
<DataBinding>
</DataBinding>
</Component>
<Component Name="Label" Namespace="System.Windows.Forms" Asm="System.dll">
<Propertys>
<Property Name="BackColor" Caption="背影色" Group=""/>
<Property Name="BorderStyle" Caption="边框样式" Group=""/>
<Property Name="Font" Caption="字体" Group=""/>
<Property Name="ForeColor" Caption="字色" Group=""/>
<Property Name="Image" Caption="图片" Group=""/>
<Property Name="ImageAlign" Caption="图片对齐" Group=""/>
<Property Name="Text" Caption="文字" Group=""/>
<Property Name="TextAlign" Caption="文本对齐" Group=""/>
<Property Name="Size" Caption="大小" Group=""/>
<Property Name="Location" Caption="位置" Group=""/>
</Propertys>
<DataBinding>
</DataBinding>
</Component>
<Component Name="Button" Namespace="System.Windows.Forms" Asm="System.dll">
<Propertys>
<Property Name="BackColor" Caption="背影色" Group=""/>
<Property Name="BorderStyle" Caption="边框样式" Group=""/>
<Property Name="Font" Caption="字体" Group=""/>
<Property Name="ForeColor" Caption="字色" Group=""/>
<Property Name="FlatStyle" Caption="样式" Group=""/>
<Property Name="Text" Caption="文本" Group=""/>
<Property Name="Size" Caption="大小" Group=""/>
<Property Name="Location" Caption="位置" Group=""/>
</Propertys>
<DataBinding>
</DataBinding>
</Component>
</Components>
第三步:winfrom中,单击"Button"、"Label"、"TextBox" 均可显示各自不同的属性页,且为中文
XmlDocument mXDoc = new XmlDocument();
public Form1()
{
mXDoc.Load(Application.StartupPath + "\\Components.xml");
}
private void textBox1_MouseDown(object sender, MouseEventArgs e)
{
ShowCustProperty(sender, "TextBox");
}
private void label1_MouseDown(object sender, MouseEventArgs e)
{
ShowCustProperty(sender, "Label");
}
private void ShowCustProperty(object sender, string str)
{
XmlNode tmpXNode = mXDoc.SelectSingleNode("Components/Component[@Name='" + str + "']");
XmlNodeList tmpXPropLst = tmpXNode.SelectNodes("Propertys/Property");
CustomProperty cp = new CustomProperty(sender, tmpXPropLst);
propertyGrid1.SelectedObject = cp;
}
自定义PropertyGrid控件【转】的更多相关文章
- C# PropertyGrid控件应用心得
何处使用 PropertyGrid 控件 在应用程序中的很多地方,您都可以使用户与 PropertyGrid 进行交互,从而获得更丰富的编辑体验.例如,某个应用程序包含多个用户可以设置的“设置”或选项 ...
- C# PropertyGrid控件应用心得 【转】
源文 : http://blog.csdn.net/luyifeiniu/article/details/5426960 c#stringattributesobjectmicrosoftclass ...
- PropertyGrid控件由浅入深(二):基础用法
目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要 ...
- PropertyGrid控件由浅入深(一):文章大纲
Winform中PropertyGrid控件是一个非常好用的对象属性编辑工具,对于Key-Value形式的数据的处理也是非常的好用. 因为Property控件设计良好,在很小的空间内可以展示很多的内容 ...
- C# 如何定义让PropertyGrid控件显示[...]按钮,并且点击后以下拉框形式显示自定义控件编辑属性值
关于PropertyGrid控件的详细用法请参考文献: 1.C# PropertyGrid控件应用心得 2.C#自定义PropertyGrid属性 首先定义一个要在下拉框显示的控件: using Sy ...
- propertyGrid控件 z
1.如果属性是enum类型,那么自然就是下拉的. 2.如果是你自定义的下拉数据,那么需要用到转换属性标签TypeConverter 参见: http://blog.csdn.net/luyifeini ...
- 安卓自定义组合控件--toolbar
最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式. 使用的工具为android stud ...
- Android自定义控件之自定义组合控件
前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...
- asp.net webform 自定义分页控件
做web开发一直用到分页控件,自己也动手实现了个,使用用户自定义控件. 翻页后数据加载使用委托,将具体实现放在在使用分页控件的页面进行注册. 有图有真相,给个直观的认识: 自定义分页控件前台代码: & ...
随机推荐
- jenkins 之 iOS 打包及上传至蒲公英
准备条件 iMAC(要 Mac OS 系统,安卓 和 苹果 可以在同一台电脑上打包) xcode 最新版,要已安装对应的开发证书(生成一个 Ad-Hoc 类型的包就有了) brew(当前管理员账户安装 ...
- nuc 第二届山西省大学生程序设计大赛 魔力手环
problem 很妙啊--发现状态转移矩阵每一行都可以由上一行平移得到,每次只算第一行然后平移,\(O(n^3)\) 就变成了 \(O(n^2)\). #include <iostream> ...
- 在Asp.net MVC中应该怎样使用Spring.Net
简单工厂 专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口.简单工厂模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常根据一 ...
- js原型链继承的傻瓜式详解
本文争取用最简单的语言来讲解原型链继承的OOP原理 0.如果对原型继承还没有大致了解,完全一头雾水,请先阅读 <JavaScript高级程序设计>第六章最后部分的寄生组合式继承 或者_廖雪 ...
- Linux命令之必须掌握的十条命令
Linux现如今已经成为了软件行业最流行的操作系统,掌握Linux就成为了每一个开发者必备的专业技能. 为了方便大家学习,大学君在此为大家整理了在使用Linux时必须掌握的十条命令,希望大家能熟练掌握 ...
- 【bzoj2085】[Poi2010]Hamsters Hash+倍增Floyd
题目描述 Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多少个名字,请你求出最 ...
- kb-07线段树-06离散化(与第四题类似)
/* zoj1610 这题是离散化,区间特殊查询的,和之前的第4 题是异曲同工的 */ #include<iostream> #include<cstdio> #include ...
- ajax对象的获取及其常用属性
ajax对象的获取及其常用属性 (1)什么是ajax asynchronous javascript and xml(异步的javascript和xml). 是一种用来改善用户体验的技术,其实质是利用 ...
- [SCOI2016] 背单词 (Trie 树,贪心)
题目链接 大致题意 给你 \(n\) 个字符串, 要求你给出最小的代价. 对于每个字符串: 1.如果它的后缀在它之后,那么代价为 \(n^2\). 2.如果一个字符串没有后缀,那么代价为 \(x\), ...
- 洛谷P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers
题目描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少.在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人.然而,在任何一群朋友中 ...