运行效果:

解决方案:

MainForm.cs

 public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
CProvincialCapital proCap = new CProvincialCapital("南京市", 10000000);
CProvince pro = new CProvince("江苏省", proCap, 8);
CCountry cou = new CCountry("中国", pro); propertyGrid1.SelectedObject = cou;
}
}
CCountry.cs

public class CCountry
{
public CCountry(string name, CProvince pro)
{
_Province = pro;
_Name = name;
} private string _Name;
[DisplayName("名称")]
public string Name
{
get { return _Name; }
set { _Name = value; }
} private CProvince _Province;
[DisplayName("省份")]
public CProvince Province
{
get { return _Province; }
set { _Province = value; }
}
}

  

CProvince.cs

    [TypeConverter(typeof(ConverterPro))]
public class CProvince
{
public CProvince(string name, CProvincialCapital provincialCapital, int district)
{
_Name = name;
_ProvincialCapital = provincialCapital;
_District = district;
} private string _Name;
[DisplayName("名称")]
public string Name
{
get { return _Name; }
set { _Name = value; }
} private CProvincialCapital _ProvincialCapital;
[DisplayName("省会")]
public CProvincialCapital ProvincialCapital
{
get { return _ProvincialCapital; }
set { _ProvincialCapital = value; }
} private int _District;
[DisplayName("地区数量")]
public int District
{
get { return _District; }
set { _District = value; }
}
}

  

CProvincialCapital.cs

    [TypeConverter(typeof(ConverterProCap))]
public class CProvincialCapital
{
public CProvincialCapital(string name, int population)
{
_Name = name;
_Population = population;
} private string _Name;
[DisplayName("名称")]
public string Name
{
get { return _Name; }
set { _Name = value; }
} private int _Population;
[DisplayName("人口数量")]
public int Population
{
get { return _Population; }
set { _Population = value; }
}
}

  

ConverterPro.cs

public class ConverterPro : ExpandableObjectConverter
{
/// <summary>
/// 返回该转换器是否可以使用指定的上下文将该对象转换为指定的类型
/// </summary>
/// <param name="context"></param>
/// <param name="destinationType"></param>
/// <returns></returns>
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(CProvince))
{
return true;
} return base.CanConvertTo(context, destinationType);
} /// <summary>
/// 返回该转换器是否可以使用指定的上下文将给定类型的对象转换为此转换器的类型
/// </summary>
/// <param name="context">提供有关组件的上下文,如其容器和属性描述符</param>
/// <param name="sourceType"></param>
/// <returns></returns>
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
} return base.CanConvertFrom(context, sourceType);
} /// <summary>
/// 使用指定的上下文和区域性信息将给定的值对象转换为指定的类型
/// </summary>
/// <param name="context"></param>
/// <param name="culture"></param>
/// <param name="value"></param>
/// <param name="destinationType"></param>
/// <returns></returns>
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture,
object value, Type destinationType)
{
if (destinationType == typeof(string) &&
value is CProvince)
{
CProvince pro = (CProvince)value; return pro.Name + "," + pro.District + "," + pro.ProvincialCapital.Name +
"," + pro.ProvincialCapital.Population.ToString();
} return base.ConvertTo(context, culture, value, destinationType);
} public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
string s = (string)value;
string[] ss = s.Split(','); CProvincialCapital proCap = new CProvincialCapital(ss[1].ToString(), int.Parse(ss[2]));
CProvince pro = new CProvince(ss[0].ToString(), proCap, int.Parse(ss[3]));
return pro;
} return base.ConvertFrom(context, culture, value);
}
}

  

ConverterProCap.cs

    public class ConverterProCap : ExpandableObjectConverter
{
/// <summary>
/// 返回该转换器是否可以使用指定的上下文将该对象转换为指定的类型
/// </summary>
/// <param name="context"></param>
/// <param name="destinationType"></param>
/// <returns></returns>
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(CProvincialCapital))
{
return true;
} return base.CanConvertTo(context, destinationType);
} /// <summary>
/// 返回该转换器是否可以使用指定的上下文将给定类型的对象转换为此转换器的类型
/// </summary>
/// <param name="context">提供有关组件的上下文,如其容器和属性描述符</param>
/// <param name="sourceType"></param>
/// <returns></returns>
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
} return base.CanConvertFrom(context, sourceType);
} /// <summary>
/// 使用指定的上下文和区域性信息将给定的值对象转换为指定的类型
/// </summary>
/// <param name="context"></param>
/// <param name="culture"></param>
/// <param name="value"></param>
/// <param name="destinationType"></param>
/// <returns></returns>
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture,
object value, Type destinationType)
{
if (destinationType == typeof(string) &&
value is CProvincialCapital)
{
CProvincialCapital cou = (CProvincialCapital)value;
string name = cou.Name;
int population = cou.Population; return name.ToString() + "," + population.ToString();
} return base.ConvertTo(context, culture, value, destinationType);
} public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
string s = (string)value;
string[] ss = s.Split(','); CProvincialCapital cou = new CProvincialCapital(ss[0].ToString(), int.Parse(ss[1]));
return cou;
} return base.ConvertFrom(context, culture, value);
}
}

  

原文地址:http://www.cnblogs.com/2008freestyle/archive/2012/03/24/2415528.html

【转】PropertyGrid控件中的多级显示的更多相关文章

  1. TabControl控件中TabPage的显示和隐藏

    TabPage里面含有方法Hide和Show,但没有任何作用,实际隐藏和显示需要使用如下2个方法 方法一:此方法比较简单 TabPageServo.Parent = Nothing   //隐藏 Ta ...

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

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

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

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

  4. OpenCV 2.2版本号以上显示图片到 MFC 的 Picture Control 控件中

    OpenCV 2.2 以及后面的版本号取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序猿无法调用里面的显示函数来将图片显示到 MFC 的 Picture Co ...

  5. 如何在WindowsPhone Bing Map控件中显示必应中国中文地图、谷歌中国中文地图。

    原文:如何在WindowsPhone Bing Map控件中显示必应中国中文地图.谷歌中国中文地图. 最近正好有点业余时间,所以在做做各种地图.Bing Map控件本身就能显示必应地图,但是很遗憾微软 ...

  6. C#在splitContainer1控件和panel控件中显示窗体

    现在有两个窗体 Form1 和Form2 Form1中有控件splitContainer1 和panel .控件.我们希望Form2在splitContainer1或者panel控件中显示 1:首先看 ...

  7. C#在WinForm中重写ProgressBar控件(带%的显示)

    废话少说,直接上码: namespace csPublish { [ToolboxItem(true)] class textProgressBar : System.Windows.Forms.Pr ...

  8. HTMLbutton控件中文字显示一直不居中

    在写HTML时,发现HTML中button控件中文字显示一直不居中, 最后发现是在标签前出现了一个全角空格引起的. 在Emeditor中将不显示的字符(空格,全角空格,换行,制表符)设置为显示,就可以 ...

  9. [Android] 拍照、截图、保存并显示在ImageView控件中

    近期在做Android的项目,当中部分涉及到图像处理的内容.这里先讲述怎样调用Camera应用程序进行拍照,并截图和保存显示在ImageView控件中以及遇到的困难和解决方法.     PS:作者购买 ...

随机推荐

  1. LabVIEW版本控制(转)

    原文转自https://www.cnblogs.com/EltonLiang/p/7105034.html 在我们工作中,必然会遇到代码的多个版本问题,也必然会遇到版本控制问题.如果所在的公司具有良好 ...

  2. STM32F1-GPIO的操作

    GPIO 即通用输入输出口.凡事都要熟悉,熟能生巧.一定要掌握MDK软件的工程操作方法. 对于GPIO的操作. Project里面要有以下几个文件夹(开发之前需要包含相应的库文件,这里默认已经包含) ...

  3. python字符串str和字节数组bytes相互转化

    1 引言 后续待补充 2 代码 b = b"Hello, world!" # bytes s = "Hello, world!" # string print( ...

  4. 面向对象(metaclass继承高级用法)

    方法一:# class MyType(type):# def __init__(self,*args,**kwargs):# print('132')# super(MyType,self).__in ...

  5. 自定义redis连接池(字典操作)

    pool=redis.ConnectionPool(host='127.0.0.1', port=6379,max_connections=1000)conn=redis.Redis(connecti ...

  6. Python-Mongodb vs mysql

    mongodb https://www.cnblogs.com/kermitjam/articles/10147254.html#_label5 centos安装mongodb: https://bl ...

  7. 任意N位二进制的补码实现——队列存放

    正在学习计算机组织与结构,为了写一些底层的算术操作模拟,比如一个二进制补码数的加减乘除,发现这很麻烦,因为不管是什么语言,都只提供了8位.32.64位等部分位数的补码形式,那么怎么实现任意任意位的补码 ...

  8. centos6.5 Python.7 pip install PIL --allow-external PIL --allow-unverified PIL报错 no such option: --allow-external

    解决办法 pip install pillow 使用from PIL import Image ,正常!!

  9. kali访问宿主机Web页面解决方案

    1.首先安装好PHPDVWA测试平台,将等级设置成low,kali中自带了python2.7.为了不再宿主机中修改python3.6,所以要利用kali来模访问宿主机中的Web页面.如果不进行配置修改 ...

  10. Spring Boot的Listener机制的用法和实现原理详解

    之前在介绍了在spring-boot启动过程中调用runner的原理,今天我们介绍另外一种可以实现相似功能的机制:spring-boot的Listener机制. 通过注册Listener,可以实现对于 ...