【转】PropertyGrid控件中的多级显示
运行效果:

解决方案:

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控件中的多级显示的更多相关文章
- TabControl控件中TabPage的显示和隐藏
TabPage里面含有方法Hide和Show,但没有任何作用,实际隐藏和显示需要使用如下2个方法 方法一:此方法比较简单 TabPageServo.Parent = Nothing //隐藏 Ta ...
- PropertyGrid控件由浅入深(一):文章大纲
Winform中PropertyGrid控件是一个非常好用的对象属性编辑工具,对于Key-Value形式的数据的处理也是非常的好用. 因为Property控件设计良好,在很小的空间内可以展示很多的内容 ...
- C# 如何定义让PropertyGrid控件显示[...]按钮,并且点击后以下拉框形式显示自定义控件编辑属性值
关于PropertyGrid控件的详细用法请参考文献: 1.C# PropertyGrid控件应用心得 2.C#自定义PropertyGrid属性 首先定义一个要在下拉框显示的控件: using Sy ...
- OpenCV 2.2版本号以上显示图片到 MFC 的 Picture Control 控件中
OpenCV 2.2 以及后面的版本号取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序猿无法调用里面的显示函数来将图片显示到 MFC 的 Picture Co ...
- 如何在WindowsPhone Bing Map控件中显示必应中国中文地图、谷歌中国中文地图。
原文:如何在WindowsPhone Bing Map控件中显示必应中国中文地图.谷歌中国中文地图. 最近正好有点业余时间,所以在做做各种地图.Bing Map控件本身就能显示必应地图,但是很遗憾微软 ...
- C#在splitContainer1控件和panel控件中显示窗体
现在有两个窗体 Form1 和Form2 Form1中有控件splitContainer1 和panel .控件.我们希望Form2在splitContainer1或者panel控件中显示 1:首先看 ...
- C#在WinForm中重写ProgressBar控件(带%的显示)
废话少说,直接上码: namespace csPublish { [ToolboxItem(true)] class textProgressBar : System.Windows.Forms.Pr ...
- HTMLbutton控件中文字显示一直不居中
在写HTML时,发现HTML中button控件中文字显示一直不居中, 最后发现是在标签前出现了一个全角空格引起的. 在Emeditor中将不显示的字符(空格,全角空格,换行,制表符)设置为显示,就可以 ...
- [Android] 拍照、截图、保存并显示在ImageView控件中
近期在做Android的项目,当中部分涉及到图像处理的内容.这里先讲述怎样调用Camera应用程序进行拍照,并截图和保存显示在ImageView控件中以及遇到的困难和解决方法. PS:作者购买 ...
随机推荐
- Media Query-响应式布局
做响应式网站的时候,一定要在页面头部加入如下的声明: <meta name="viewport" content="width=device-width, init ...
- PYTHON深拷贝与浅拷贝
浅拷贝就是对引用的拷贝,深拷贝就是对对象的资源的拷贝 浅拷贝 浅拷贝仅仅复制了容器中元素的地址 赋值的原则 1.赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ). 2.修改不可 ...
- Tomcat服务的安装及配置
在进行Java Web开发时必须有Web服务器的支持,常用的Web服务器便是Tomcat,本文主要介绍Tomcat的安装和配置.客户端通过Web浏览器发送一个基于HTTP协议的请求到服务器上后,服务器 ...
- wireshark找(检测)不到(捕获)网卡的解决办法
1 前言 有时候打开wireshark,会提示找不到可用网卡,此时是因为NetGroup Packet Filter Driver 服务没有开启. 环境:笔记本 系统:Win10 网络:WIFI 2 ...
- Codeforces 848C Goodbye Souvenir [CDQ分治,二维数点]
洛谷 Codeforces 这题我写了四种做法-- 思路 不管做法怎样,思路都是一样的. 好吧,其实不一样,有细微的差别. 第一种 考虑位置\(x\)对区间\([l,r]\)有\(\pm x\)的贡献 ...
- ios 本地存储文件夹的使用注意
文件夹 tmp 属于临时文件夹,不需要自己删除,系统会在应用退出后清空 文件夹 Library 下面的子文件 Caches 也是用来存储的,,但是Library 基本上不会被清除,但是在内存不足的 ...
- C# TTS 文字和英文
using System;using System.Globalization;using System.Linq;using System.Speech.Synthesis;using System ...
- android中调用c++文件并转为so
1.新建项目,不选include support c++ 报错:Error:Failed to open zip file.Gradle's dependency cache may be corru ...
- 自己没有记住的一点小知识(ORM查询相关)
一.多对多的正反向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名& ...
- linux目录详解
网卡的配置文件目录 /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ...