【转】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控件中的多级显示,布布扣,bubuko.com

时间: 2024-10-13 22:24:08

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

C# 自定义属性在propertyGrid控件中显示

在上篇文章(地址:C# 设计时动态改变实体在PropertyGrid中显示出来的属性)中可以看到: 自定义属性的显示是有问题的,那么如何修改呢? 代码如下: public class PropertyDisplayConverterr<T> : ExpandableObjectConverter where T : IDisplay { public override bool CanConvertTo(ITypeDescriptorContext context, System.Type d

C#在listview控件中显示数据库数据

一.了解listview控件的属性 view:设置为details columns:设置列 items:设置行 1.将listview的view设置为details 2.设置列属性 点击添加,添加一列 设置一列的Text属性,这就是列名 添加三列 3.编辑items属性,添加一行数据 编辑Text属性,添加一行的第一个数据 编辑subitems属性,添加一行中的其他数据 添加两个数据 填写结果 二.在listview中显示数据库数据 //在listview中显示数据库数据 private voi

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

最近在做Android的项目,其中部分涉及到图像处理的内容.这里先讲述如何调用Camera应用程序进行拍照,并截图和保存显示在ImageView控件中以及遇到的困难和解决方法. PS:作者购买了本<Android第一行代码 著:郭霖>,参照里面的内容完成(推荐该书,前面的布局及应用非常不错).网上这类资料非常多,作者仅仅分享给初学者同时在线记录些内容,希望对大家有所帮助. 首先,设置activity_main.xml为LinearLayout布局且 android:orientation=&q

Winform状态栏控件中Label靠右显示的方法

设计器: 代码: 在Form_Load事件中添加 : statusStripMain.LayoutStyle= ToolStripLayoutStyle.HorizontalStackWithOverflow; lbl单位.Alignment = ToolStripItemAlignment.Right; lblCompany.Alignment = ToolStripItemAlignment.Right; lbl联系电话.Alignment = ToolStripItemAlignment.

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

关于PropertyGrid控件的详细用法请参考文献: 1.C# PropertyGrid控件应用心得 2.C#自定义PropertyGrid属性 首先定义一个要在下拉框显示的控件: using System; using System.Windows.Forms; namespace Simon.WinForms.Examples.PropertyGrid { public class EditorControl : UserControl { public EditorControl() {

vc 在edit控件中动态插入数据滚动显示

内存从网上论坛摘抄整理 思路:给控件设置多行属性,设置垂直滚动条,Auto Vscroll设置为true,放入文本后把插入点设置到末尾 pEdit->LineScroll(pEdit->GetLineCount()); 滚动条滚动到最下端 int len  = pEdit->GetWindowTextLength(); pEdit->SetSel(len,-1,true); //定位光标到内容末尾pEdit->ReplaceSel("12121212");

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

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

用按钮打开对话框选取图片按大小显示在控件中

[cpp] view plaincopy 打开按钮相应消息 [cpp] view plaincopy void CLoadBmpDlg::OnBtnOpenBmp() { // TODO: Add your control notification handler code here ////选取图片文件 [cpp] view plaincopy CFileDialog file_open_dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,"BMP Files(*.bmp)

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

OpenCV 2.2 以及后面的版本取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序员无法调用里面的显示函数来将图片显示到 MFC 的 Picture Control 控件中.为此,网上很多人表示只要将那两个文件人为的提取出来然后放到工程里面就解决问题了,也提供了两个文件的下载,但是这麻烦不说,还会导致一些奇奇怪怪的报错(至少本人是这样的,很崩溃!).所以在了解了一些gdi绘图之后结合网上的代码写了如下的函数,只需调用就可以将OpenCV的图片显示在上面