C# PropertyGrid使用案例详解

1. 只有public的property能显示出来,可以通过BrowsableAttribute来控制是否显示,通过CategoryAttribute设置分类,通过DescriptionAttribute设置描述,Attribute可以加在Class上,也可以加在属性上,属性上的Attribute优先级更高;

2. enum会自动使用列表框表示;

3. 自带输入有效性检查,如int类型输入double数值,会弹出提示对话框;

4. 基本类型Array:增加删除只能通过弹出的集合编辑器,修改可以直接展开,值为null时,可以通过集合编辑器创建;

5. 基本类型List:增删改都只能通过集合编辑器,值为null时,能打开集合编辑器,但不能保存结果,所以必须初始化;

6. ReadOnlyAttribute设置为true时,显示为灰色;对List无效,可以打开集合编辑器,在集合编辑器内可以进行增删改;应用于Array时,不能打开集合编辑器,即不能增删,但可以通过展开的方式修改Array元素;

7. 对象:值显示Object.ToString();Class上加了[TypeConverter(typeof(ExpandableObjectConverter))]之后(也可以加在属性上),才能展开编辑,否则显示为灰色只读;不初始化什么也干不了;

8. 基类类型派生类对象:与普通对象没有区别,[TypeConverter(typeof(ExpandableObjectConverter))]加在基类上即可;

9. 对象Array:增加删除只能通过弹出的集合编辑器,修改可以直接展开,值为null时,可以通过集合编辑器创建;

10. 对象List:增加删除修改只能通过弹出的集合编辑器,值为null时,能打开集合编辑器,但不能保存结果,所以必须初始化;

11. Hashtable和Dictionary能打开集合编辑器,但不能编辑;

12. 通过MyDoubleConverter实现Double类型只显示小数点后两位:

public class MyDoubleConverter : DoubleConverter
    {
        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(string))
            {
                return string.Format("{0:0.00}", value);
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }

13. 通过TypeConverter实现用字符串表示对象

[TypeConverter(typeof(StudentConverter))]
    public class Student
    {
        public Student(string name, int age)
        {
            Name = name;
            Age = age;
        }
        public string Name { get; set; }
        public int Age { get; set; }

        public static Student FromString(string s)
        {
            string name = "Default";
            int age = 0;
            string[] splits = s.Split(',');
            if (splits.Length == 2)
            {
                name = splits[0];
                int.TryParse(splits[1], out age);
            }
            return new Student(name, age);
        }

        public override string ToString()
        {
            return string.Format("{0},{1}", Name, Age);
        }
    }

    public class StudentConverter : TypeConverter
    {
        public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(string))
            {
                return true;
            }
            return base.CanConvertFrom(context, sourceType);
        }
        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
        {
            Student result = null;
            if ((value as string) != null)
            {
                result = Student.FromString(value as string);
            }
            return result;
        }
        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(string))
            {
                return true;
            }
            return base.CanConvertTo(context, destinationType);
        }
        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(string))
            {
                return value.ToString();
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }

14. 使用UITypeEditor实现文件或目录选择

// 需要在项目里添加引用:程序集|框架|System.Design
        [Editor(typeof(FileNameEditor), typeof(UITypeEditor))]
        public string FileName { get; set; }

        [Editor(typeof(FolderNameEditor), typeof(UITypeEditor))]
        public string FolderName { get; set; }

15. 使用自定义的下拉式编辑界面

public class MyAddress
    {
        public string Province { get; set; }
        public string City { get; set; }
        public override string ToString()
        {
            return string.Format("{0}-{1}", Province, City);
        }
    }

    public class MyAddressEditor : UITypeEditor
    {
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.DropDown;
        }

        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            IWindowsFormsEditorService service = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
            if (service != null)
            {
                service.DropDownControl(new MyEditorControl(value as MyAddress));
            }
            return value;
        }
    }

    // 实现两个ComboBox用来编辑MyAddress的属性
    public partial class MyEditorControl : UserControl
    {
        private MyAddress _address;
        public MyEditorControl(MyAddress address)
        {
            InitializeComponent();
            _address = address;
            comboBoxProvince.Text = _address.Province;
            comboBoxCity.Text = _address.City;
        }

        private void comboBoxProvince_SelectedIndexChanged(object sender, EventArgs e)
        {
            _address.Province = comboBoxProvince.Text;
        }

        private void comboBoxCity_SelectedIndexChanged(object sender, EventArgs e)
        {
            _address.City = comboBoxCity.Text;
        }
    }

    // MyAddress属性声明
    [Editor(typeof(MyAddressEditor), typeof(UITypeEditor))]
    public MyAddress Address { get; set; }

效果如图:

16. 实现弹出式编辑对话框,只要将UserControl改成Form,EditStyle改成Modal,service.DropDownControl改成service.ShowDialog

public partial class MyEditorForm : Form
    {
        private MyAddress _address;
        public MyEditorForm(MyAddress address)
        {
            InitializeComponent();
            _address = address;
            comboBoxProvince.Text = _address.Province;
            comboBoxCity.Text = _address.City;
        }

        private void comboBoxProvince_SelectedIndexChanged(object sender, EventArgs e)
        {
            _address.Province = comboBoxProvince.Text;
        }

        private void comboBoxCity_SelectedIndexChanged(object sender, EventArgs e)
        {
            _address.City = comboBoxCity.Text;
        }
    }

    public class MyAddressEditor : UITypeEditor
    {
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.Modal;
        }

        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            IWindowsFormsEditorService service = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
            if (service != null)
            {
                service.ShowDialog(new MyEditorForm(value as MyAddress));
            }
            return value;
        }
    }

17. 密码表示:[PasswordPropertyText(true)]

18. 动态显示/隐藏属性

class MyData
    {
        public static void SetPropertyAttribute(object obj, string propertyName, Type attrType, string attrField, object value)
        {
            PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
            Attribute attr = props[propertyName].Attributes[attrType];
            FieldInfo field = attrType.GetField(attrField, BindingFlags.Instance | BindingFlags.NonPublic);
            field.SetValue(attr, value);
        }

        private bool _ShowPassword = false;
        public bool ShowPassword
        {
            get { return _ShowPassword; }
            set
            {
                _ShowPassword = value;
                SetPropertyAttribute(this, "Password", typeof(BrowsableAttribute), "browsable", _ShowPassword);
            }
        }

        [PasswordPropertyText(true)]
        [Browsable(true)]
        public string Password { get; set; }
    }

    public partial class MainFrm : Form
    {
        // 不添加PropertyValueChanged事件,不能实现动态显示/隐藏
        private void myData_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
        {
            this.myData.SelectedObject = this.myData.SelectedObject;
        }
    }

19. 提供下拉选项的string

public class ListStringConverter : StringConverter
    {
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            return new StandardValuesCollection(new string[] { "A", "B" });
        }

        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        {
            return false;
        }
    }

    [TypeConverter(typeof(ListStringConverter))]
    public string Name { get; set; }

到此这篇关于C# PropertyGrid使用案例详解的文章就介绍到这了,更多相关C# PropertyGrid使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# Assembly类访问程序集信息

    C#中通过Assembly类可以访问程序集信息. 1.允许访问给定程序集的元元素,包含可以加载和执行程序集的方法: 2.加载程序集:使用静态方法Assembly.Load(程序集名称)或Assembly.LoadFrom(程序集完整路径名): 3.属性: FullName:程序集显示名称: 3.方法: GetTypes():获取程序集中定义的类型. TestAssembly.cs: view plaincopy to clipboardprint? using System; using Sys

  • C# 有关Assembly.Unload详解

        CLR 产品单元经理(Unit Manager) Jason Zander 在前几天一篇文章 Why isn't there an Assembly.Unload method? 中解释了为什么 CLR 中目前没有实现类似 Win32 API 中 UnloadLibrary 函数功能的 Assembly.Unload 方法. 他认为之所以要实现 Assembly.Unload 函数,主要是为了回收空间和更新版本两类需求.前者在使用完 Assembly 后回收其占用资源,后者则卸载当前版本

  • C# Assembly.Load案例详解

     我们在使用C# 语言的Assembly.Load 来加载托管程序集并使用反射功能时,一般需要先通过Assembly.Load(), Assembly.LoadFrom() 等方法将目标托管程序集加载到当前应用程序域中,然后生成对应实例,最后再进行调用实例的属性或者方法. 一般情况下,我们调用Assembly.Load 一类方法是不会出问题的,但是对于以下几种情况Assembly.Load 方法无法处理: 程序集可能是延迟签名的. 程序集可能被CAS 策略保护. 宿主程序与目标程序集的处理器架构

  • C# web.config之<customErrors>节点说明案例详解

    <customErrors>节点用于定义一些自定义错误信息的信息.此节点有Mode和defaultRedirect两个属性,其中defaultRedirect属性是一个可选属性,表示应用程序发生错误时重定向到的默认URL,如果没有指定该属性则显示一般性错误.Mode属性是一个必选属性,它有三个可能值,它们所代表的意义分别如下: Mode 说明 On 表示在本地和远程用户都会看到自定义错误信息. Off 禁用自定义错误信息,本地和远程用户都会看到详细的错误信息. RemoteOnly 表示本地用

  • C# ThreadPool之QueueUserWorkItem使用案例详解

    先看代码: //设置可以同时处于活动状态的线程池的请求数目. bool pool = ThreadPool.SetMaxThreads(8, 8); if (pool) { ThreadPool.QueueUserWorkItem(o => this.DoSomethingLong("参数1")); ThreadPool.QueueUserWorkItem(o => this.DoSomethingLong("参数2")); ThreadPool.Que

  • C# PropertyGrid使用案例详解

    1. 只有public的property能显示出来,可以通过BrowsableAttribute来控制是否显示,通过CategoryAttribute设置分类,通过DescriptionAttribute设置描述,Attribute可以加在Class上,也可以加在属性上,属性上的Attribute优先级更高: 2. enum会自动使用列表框表示: 3. 自带输入有效性检查,如int类型输入double数值,会弹出提示对话框: 4. 基本类型Array:增加删除只能通过弹出的集合编辑器,修改可以直

  • AngularJS日程表案例详解

    功能:添加事件/完成事件/删除事件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> *{ margin: 0; padding: 0; } .note{ margin:0 auto; background: orange; color: ora

  • BootStrap的JS插件之轮播效果案例详解

    Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 案例 下面展示的就是此插件和相关组件制作的轮播案例. <div id="carousel-example-generic" class="carousel slide" data-ride="carousel"> <!-- Indicators --> <ol class

  • Vue 过渡(动画)transition组件案例详解

    Vue过度(动画),本质走的是CSS3:transtion,animation. 控制器div显示/隐藏,代码如下: <div id="box"> <input type="button" value="按钮" @click="toggle"> <div id="div1" v-show="isShow"></div> </div&g

  • vue.js+boostrap项目实践(案例详解)

    一.为什么要写这篇文章 最近忙里偷闲学了一下vue.js,同时也复习了一下boostrap,发现这两种东西如果同时运用到一起,可以发挥很强大的作用,boostrap优雅的样式和丰富的组件使得页面开发变得更美观和更容易,同时vue.js又是可以绑定model和view(这个相当于MVC中的,M和V之间的关系),使得对数据变换的操作变得更加的简易,简化了很多的逻辑代码. 二.学习这篇文章需要具备的知识 1.需要有vue.js的知识 2.需要有一定的HTML.CSS.JavaScript的基础知识 3

  • Apache 文件上传与文件下载案例详解

    写一个Apache文件上传与文件下载的案例:以供今后学习 web.xml配置如下: <span style="font-family:SimSun;font-size:14px;"><?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns=&

  • jQuery 跨域访问解决原理案例详解

    浏览器端跨域访问一直是个问题,多数研发人员对待js的态度都是好了伤疤忘了疼,所以病发的时候,时不时地都要疼上一疼.记得很久以前使用iframe 加script domain 声明.yahoo js util 的方式解决二级域名跨域访问的问题. 时间过得好快,又被拉回js战场时, 跨域问题这个伤疤又开疼了.好在,有jQuery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目,查阅了相关资料,算是解决了跨域问题...有必要记下来备忘, 跨域的安全限制都是指浏览

  • Android开发之对话框案例详解(五种对话框)

    下面通过实例代码给大家分享5种android对话框,具体内容详情如下所示: 1 弹出普通对话框 --- 系统更新 2 自定义对话框-- 用户登录 3 时间选择对话框 -- 时间对话框 4 进度条对话框 -- 信息加载.. 5 popuWindow对话框 1 弹出普通对话框 --- 系统更新  //弹出普通对话框 public void showNormalDialog(View v) { AlertDialog.Builder builder = new Builder(this); //设置D

  • MongoDB模糊查询操作案例详解(类关系型数据库的 like 和 not like)

    1.作用与语法描述 作用: 正则表达式是使用指定字符串来描述.匹配一系列符合某个句法规则的字符串.许多程序设计语言都支持利用正则表达式进行字符串操作.MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式. 语法一 { <field>: { $regex: /pattern/, $options: '<options>' } } { <field>: { $regex: 'pattern', $options: '<options>' } }

  • spring boot 结合jsp案例详解

    这篇文章主要介绍了spring boot 结合jsp案例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- jstl是⼀

随机推荐