运行效果:

解决方案:

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. 阿里云服务器上通过Docker部署redmine

    背景:在日常工作的过程中会遇到各种各样的问题,每个问题来了之后需要花时间解决.这里就面临两个问题. 1:问题责任不明确,有时候会遇到数据库或者物理服务器的问题,这时候就需要把相应问题指派给相应的人,传 ...

  2. GIT入门文档

    集中式(SVN): 集中式版本控制系统,版本库是集中存放在中央服务器的,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器. 集中式版本控制系 ...

  3. Java:自动设置环境变量(转载)

    引用: https://blog.csdn.net/qq_22498277/article/details/72149038 脚本下载地址:http://files.cnblogs.com/floww ...

  4. ASP.NET MVC5入门2之Ajax实现数据查询

    开发环境:VS2013 数据库:SQL Server2008R2 架构:ASP.NET MVC5 开发语言:C# 代码下载链接:http://download.csdn.net/detail/u010 ...

  5. oracle里面用sql做报表并带小计合计常用到的函数

    1-- DECODE函数是Oracle PL/SQL是功能强大的函数之一,假设我们想给职员加工资,其标准是:工资在8000元以下的将加20%:工资在8000元以上的加15%,通常的做法是,先选出记录 ...

  6. windows连接服务端的域名正常,linux却不通,(针对于负载均衡后端节点设置)

    1.初步判断不是网络上的,因为windows主机访问正常, 2.修改客户端linux主机 net.ipv4.tcp_tw_recycle=0,测试是否正常,(服务器当连接数达到一定量之后,会执行rec ...

  7. 大数据mapreduce二分法ip定位之Python实现

    ip定位数据大约12M,采用-chacheFile 分发 文件来源https://pan.baidu.com/s/1J0pwTafHgt4T0k3vV_gC-A 格式大致格式如下: 0.0.0.0 0 ...

  8. WebSocket异步通讯,实时返回数据

    第一种方式 // 服务端: //var listener = new HttpListener(); // listener.Prefixes.Add("http://*:8080/&quo ...

  9. 解决Navicat连接MySQL总是报错1251的方法

    今天下了个 MySQL8.0,发现Navicat连接不上,总是报错1251: 原因是MySQL8.0版本的加密方式和MySQL5.0的不一样,连接会报错. 试了很多种方法,终于找到一种可以实现的: 更 ...

  10. svn上check下来的项目,用idea打开,菜单栏没有svn工具解决办法

    1.用idea打开你的项目(idea已经配置过小乌龟了) 2.菜单栏点击VCS,Enable Version Control Integration... 3.选择Subversion 4.这时候,菜 ...