原来公司的一段代码,现在给朋友写的软件里也用上了,看样用处挺多,所以保存一下。

自定义属性类:

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing.Design;
using System.Windows.Forms.Design;
using System.Windows.Forms; namespace MaoYoo.ChinaMobile.Core.PropertyGridUI
{
public class PropertyGridFileSelector:UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
} public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value)
{ IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); if (edSvc != null)
{ // 可以打开任何特定的对话框
OpenFileDialog dialog = new OpenFileDialog
{
AddExtension = false,
Title = "打开文件",
Filter = "*.xls|*.xls|*.xlsx|*.xlsx"
};
if (dialog.ShowDialog().Equals(DialogResult.OK))
{
return dialog.FileName;
}
}
return value;
}
}
}

文件选择定义:

        [Category("文件")]
[DisplayName("数据文件")]
[Description("用户数据列表文件路径")]
[ReadOnlyAttribute(false), Browsable(true)]
[Editor(typeof(PropertyGridFileSelector), typeof(UITypeEditor))]
public string File
{
get;
set;
}

操作属性的值:

using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Reflection;
using System.Windows.Forms; namespace MaoYoo.ChinaMobile.Core
{ public class PropertyGridHelper
{
/// <summary>
/// 设置指定PropertyGrid中已设置了SelectObject对象的属性控件中指定某个自定义特性的值
/// </summary>
/// <typeparam name="T">要设置的属性类型</typeparam>
/// <param name="grid">PropertyGrid对象</param>
/// <param name="name">要设置的属性的名称</param>
/// <param name="field">要设置的自定义特性名称</param>
/// <param name="value">要设置的自定义特性的值</param>
public static void SetPropertyValue<T>(PropertyGrid grid, string name, string field, object value)
{
if (grid.SelectedObject == null)
throw new ArgumentException(string.Format("指定的PropertyGrid对象不包含{0}对象", "SelectObject")); AttributeCollection attrs = TypeDescriptor.GetProperties(grid.SelectedObject)[name].Attributes; FieldInfo fld = typeof(T).GetField(field, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.CreateInstance); if (fld != null) fld.SetValue(attrs[typeof(T)], value); grid.Refresh();
}
/// <summary>
/// 设置指对象指定自定义特性或其相关特性的值
/// </summary>
/// <typeparam name="T">要设置的属性类型</typeparam>
/// <param name="graph">要设置的对象</param>
/// <param name="name">要设置的属性的名称</param>
/// <param name="field">要设置的自定义特性名称</param>
/// <param name="value">要设置的自定义特性的值</param>
public static void SetPropertyValue<T>(object graph, string name, string field, object value)
{
if (graph == null)
throw new ArgumentException(string.Format("指定的对象{0}不能为空", graph)); AttributeCollection attrs = TypeDescriptor.GetProperties(graph)[name].Attributes; FieldInfo fld = typeof(T).GetField(field, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.CreateInstance); fld.SetValue(attrs[typeof(T)], value);
}
}
}

设置某个属性的自定义特性:

        [Category("余额")]
[Description("是否启用余额")]
[DisplayName("余额匹配")]
[ReadOnlyAttribute(false), Browsable(true)]
public bool Enabled
{
get { return mEnabledBalance; }
set
{
PropertyGridHelper.SetPropertyValue<ReadOnlyAttribute>(this, "Balance", "isReadOnly", !value);
mEnabledBalance = value; }
} private bool mEnabledBalance = true;

PropertyGrid实现文件选择项的更多相关文章

  1. iOS开发——UI篇&下拉弹出列表选择项效果

    下拉弹出列表选择项效果 右边菜单中的按键,点击弹出一个列表可选择,选择其中一个,响应相应的事件并把文字显示在右边的菜单上:弹出下拉效果使用LMDropdownView插件,可以用POD进行加载pod  ...

  2. CentOS6.9-zabbix3.2启动失败原因及页面没有mysql选择项

     环境内核信息: [root@zabbix- ~]# uname -a Linux lodboyedu- -.el6.x86_64 # SMP Tue Mar :: UTC x86_64 x86_64 ...

  3. 使ListView控件中的选择项高亮显示

    实现效果: 知识运用: ListView控件的SelectedItems属性 //获取在ListView控件中被选中数据项的集合 public ListView.SelectedListViewIte ...

  4. 重读APUE(3)-dup与文件表项

    下图为调用dup之后的文件指针状态,包含如下信息: 1. dup选择了一个最小的未使用的描述符3: 2. dup(1)之后,描述符1和描述符3指向同一个文件表项: 3. dup(1)的返回值即为复制得 ...

  5. 文件描述符、文件表项指针、inode节点的关系

    内核使用3种数据结构表示打开的文件,他们之间的关系决定了在文件共享方面一个进程对另一个进程的影响. (1) 每个进程在进程表中都有一个纪录项,纪录项中包含一张打开文件描述符表,每个文件描述符各占一项, ...

  6. cordova加载层、进度条、文件选择插件

    在做cordova项目的时候,感觉应用的响应速度跟原生应用比相差甚远,一个主要问题就是如加载层.进度条等弹出对话框的效率不行.毕竟项目中的这些弹框都是用dom拼成的,dom的渲染效率和原生控件比起来慢 ...

  7. js点击某个图标或按钮弹出文件选择框

    <HTML> <head> <script type="text/javascript" src="script/jquery-1.6.2. ...

  8. Java文件选择对话框(文件选择器JFileChooser)的使用:以一个文件加密器为例

    文件加密器,操作过程肯定涉及到文件选择器的使用,所以这里以文件加密器为例.下例为我自己写的一个文件加密器,没什么特别的加密算法,只为演示文件选择器JFileChooser的使用. 加密器界面如图: 项 ...

  9. Java——文件选择框:JFileChooser

    import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import j ...

  10. Js获取下拉框当前选择项的文本和值

    现在有一个Id为AreaId的下拉框,要获取它当前选择项的文本和值有以下方法: <span class="red">* </span> 地       区: ...

随机推荐

  1. WinForm中的MVC模式--MVP模式

    本文主要介绍MVC模式在WINFORM中的实现,其实砖家们都称它为MVP模式,小弟E文不太好,真的是记不住那个P怎么拼写的.. MVC模式主要解决的问题就是将表示层和业务层进行分离,在以往做WINFO ...

  2. JS和PHP中能转为布尔false的值的对比

    实际开发中经常会使用到JS和PHP中的变量转布尔值进行条件判断,下面对两种语言中转布尔类型结果为false的值进行对比,加深记忆和方便引用. 除了下表列出项,其它的值均转成真值true . 转布尔值后 ...

  3. mysql 中 insert 大量数据 避免时间戳相同 !!

    时间函数 now() current_timestamp() 和 sysdate() CURRENT_TIMESTAMP and CURRENT_TIMESTAMP() are synonyms fo ...

  4. 解决ssh $host jps bash: jps: command not found 问题

    问题描述 使用 ssh $host jps 命令报错,连本机也会有这样的情况,但是分开使用并没有问题,即ssh $host下执行jps命令并不会报错. 原因 因为ssh远程连接到服务器的环境变量中不包 ...

  5. DRF_序列化and反序列化之高级

    1. source用法 序列化器内的使用 book_name = serializers.CharField(max_length=8, min_length=3,source='name')这个用来 ...

  6. Less-4 报错注入

    补坑:报错注入 当我们 union 无法注入的时候,可以使用报错注入,这里我们有三种报错注入,xpth语法错误和count()+rand()+floor()+group by重复组建错误 extrac ...

  7. Resistance distance 图上2个节点的等效电阻求解算法

    目录 如何计算正方体网络中(乃至更一般的图)2个节点间的等效电阻? 公式的正确性很容易得到验证 如何计算Weighted matrix的Resistance matrix 我验证了特例,是对的,但是对 ...

  8. Linux RedHat 利用 ISO镜像文件制作本地 yum源

    RedHat 利用ISO镜像文件制作本地yum源 [1]创建iso存放目录和挂载目录 1 [root@desktop ~]# cd /mnt/ 2 [root@desktop mnt]# mkdir ...

  9. MySQL高可用架构-MMM、MHA、MGR、分库分表

    总结 MMM是是Perl语言开发的用于管理MySQL主主同步架构的工具包.主要作用:管理MySQL的主主复制拓扑,在主服务器失效时,进行主备切换和故障转移. MMM缺点:故障切换可能会丢事务(主备使用 ...

  10. Serial port

    前言 ​ 使用qt开发一款简易串口助手. ​ 目标: 1. 实现正常串口通信. 2. 能够传输AT指令.(需要注意回车符) github仓库地址:shadow-wd/Serial-port-assis ...