【转】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:作者购买 ...
随机推荐
- ansible笔记(11):初识ansible playbook(二)
ansible笔记():初识ansible playbook(二) 有前文作为基础,如下示例是非常容易理解的: --- - hosts: test211 remote_user: root tasks ...
- MySQL的information_schema
在一次清空一张比较大的表时(在清空前占用400多兆),发现该表中记录为0条但是空间并没有被释放,采用下面方式可查看占用情况 -- 查询各个数据库占用磁盘的情况 ,),' MB') as data_si ...
- 转载:UML学习(四)-----状态图(silent)
原文:http://www.cnblogs.com/silent2012/archive/2011/11/01/2178278.html 状态图主要用于描述对象具有的各种状态.状态之间的转换过程以及触 ...
- codecs and formats of digital media
A codec is a device or software that is used to compress or decompress a digital media file, such as ...
- Android App签名打包
Andriod应用程序如果要在手机或模拟器上安装,必须要有签名! 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序 ...
- Laravel 5.2服务----用户验证Auth相关问题
关于laravel的auth()用户认证这一块,面前我也是,有用到,有碰到什么问题我就记录下来. 手动认证用户 <?php namespace App\Http\Controllers; use ...
- Ex 2_27 矩阵A的平方是A自乘后的乘积,即AA..._第三次作业
- tcpdump详解
tcpdump -i eth1 'host 121.14.84.221 and greater 76' -Ap -v -s10000 抓取 eth1 和 121.14.84.221 上的所有长度大于7 ...
- Python-mysql 权限 pymysql 注入共计
1.mysql用户管理 *** 数据安全非常重要 不可能随便分配root账户 应该按照不同开发岗位分配不同的账户和权限 mysql中 将于用户相关的数据放在mysql库 user - > db ...
- 2)django-请求生命周期
1)下图是django请求生命周期 2)详细例子