这篇随笔其实是从别人博客上载录的。感觉很有价值,整理了一下放在了我自己的博客上,希望原作者不要介意。

可自定义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控件【转】的更多相关文章

  1. C# PropertyGrid控件应用心得

    何处使用 PropertyGrid 控件 在应用程序中的很多地方,您都可以使用户与 PropertyGrid 进行交互,从而获得更丰富的编辑体验.例如,某个应用程序包含多个用户可以设置的“设置”或选项 ...

  2. C# PropertyGrid控件应用心得 【转】

    源文 : http://blog.csdn.net/luyifeiniu/article/details/5426960 c#stringattributesobjectmicrosoftclass ...

  3. PropertyGrid控件由浅入深(二):基础用法

    目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要 ...

  4. PropertyGrid控件由浅入深(一):文章大纲

    Winform中PropertyGrid控件是一个非常好用的对象属性编辑工具,对于Key-Value形式的数据的处理也是非常的好用. 因为Property控件设计良好,在很小的空间内可以展示很多的内容 ...

  5. C# 如何定义让PropertyGrid控件显示[...]按钮,并且点击后以下拉框形式显示自定义控件编辑属性值

    关于PropertyGrid控件的详细用法请参考文献: 1.C# PropertyGrid控件应用心得 2.C#自定义PropertyGrid属性 首先定义一个要在下拉框显示的控件: using Sy ...

  6. propertyGrid控件 z

    1.如果属性是enum类型,那么自然就是下拉的. 2.如果是你自定义的下拉数据,那么需要用到转换属性标签TypeConverter 参见: http://blog.csdn.net/luyifeini ...

  7. 安卓自定义组合控件--toolbar

    最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式. 使用的工具为android stud ...

  8. Android自定义控件之自定义组合控件

    前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...

  9. asp.net webform 自定义分页控件

    做web开发一直用到分页控件,自己也动手实现了个,使用用户自定义控件. 翻页后数据加载使用委托,将具体实现放在在使用分页控件的页面进行注册. 有图有真相,给个直观的认识: 自定义分页控件前台代码: & ...

随机推荐

  1. 解决使用intellij idea开发MAVEN项目在target目录下不存在mapper.xml文件

    原 解决使用intellij idea开发MAVEN项目在target目录下不存在mapper.xml文件 原文章链接:https://blog.csdn.net/beauxie/article/de ...

  2. java内存模型学习

    根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 虚拟机的内存模型分为两部分:一部分是线程共享的,包括 Java 堆和方法区:另一部分是线程私有的,包括虚拟 ...

  3. Python学习-day9 线程

    这节内容主要是关于线程的学习 首先要了解的什么是进程,什么是线程 进程与线程 什么是进程(process)? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称 ...

  4. Python序列化、date、random、os模块

    知识点一:序列化与反序列化(json和pickple) 01 什么是序列化/反序列化    序列化就是将内存中的数据结构转换成一种中间格式存储到硬盘或者基于网络传输    发序列化就是硬盘中或者网络中 ...

  5. Spring 4.3.11.RELEASE文档阅读(一):overview

    一.宏观概述中的体会和发现 Spring是组件式的框架,它允许我们只使用其一小部分.Spring所做的工作,就是不断的简化我们的操作.比如它的IOC容器,当我们自己应用设计模式,比如说:建造者.工厂. ...

  6. google浏览器audits

    功能翻译 audits,审计 Audits help you identify and fix common problems that affect your site'sperformance,a ...

  7. 九度oj 题目1357:疯狂地Jobdu序列

    题目描述: 阳仔作为OJ的数据管理员,每一周的题目录入都让其很抓狂,因为题目不是他出的,他控制不了出题的速度……在等题目的时候,阳仔又不敢出去打篮球,所以只能在纸上乱涂乱写,这天,阳仔在纸上写下了这样 ...

  8. iOS使用cookie

    // // ViewController.m // cookie // // Created by 谭启宏 on 16/3/4. // Copyright © 2016年 tqh. All right ...

  9. 【Luogu】P3355骑士共存问题(最小割)

    题目链接 像题面那样把棋盘染成红黄点.发现骑士迈一步能到达的点的颜色一定是跟他所在的格子的颜色不同的.于是(woc哪来的于是?这个性质有这么明显吗?)从源点向所有红点连边,从所有黄点向汇点连边,红点向 ...

  10. JS实现并集,交集和差集

    var set1 = new Set([1,2,3]);var set2 = new Set([2,3,4]); 并集let union = new Set([...set1, ...set2]); ...