C# PropertyGrid使用案例详解
作者:朱迎春 发布时间:2022-03-18 20:51:51
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; }
来源:https://www.cnblogs.com/zhuyingchun/p/8474406.html
猜你喜欢
- Spring Boot可以和大部分流行的测试框架协同工作:通过Spring JUnit创建单元测试;生成测试数据初始化数据库用于测试;Spr
- 写在前面从Java 1.0开始,引入java.io包;到Java 1.4再扩展了java.nio包;再到java 1.7又添加了新的流类,使
- 这篇文章主要介绍了Spring如何使用注解的方式创建bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 动态SQL简介动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQ
- SpringBoot对actuator进行关闭management: endpoint: health
- SpringCloudStream配置以下配置摘自《SpringCloud微服务实战》,配置主要包括两大部分:Stream配置(基础配置、通
- java8 Stream list to Map key 重复 value合并到Collectio关于把list转换成key value的m
- 前言前面介绍了APP顶部导航栏AppBar,今天来介绍下Flutter实现APP底部导航栏。我们以仿写微信的底部导航栏来举例说明。要实现类似
- 什么是粘包/拆包 一般所谓的TCP粘包是在一次接收数据不能完全地体现
- 一、Java把这些不同来源和目标的数据都统一抽象为数据流。Java语言的输入输出功能是十分强大而灵活的。在Java类库中,IO部分的内容是很
- 一、日志的分类1、名字分类log4j :log for java (因为for和4读音差不多,所以交log4j)logBack 日志说明注意
- 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)——MyBatis的基础知识。MybatisFirst中存在大
- 通过 SpringBoot 实现了表单下的文件上传,前后端分离情况下的文件上传。本案例不连接数据库,只做基本的文件上传操作。在 Spring
- 使用了 String 类的 indexOf() 方法在字符串中查找子字符串出现的位置,如过存在返回字符串出现的位置(第一位为0),如果不存在
- 茫茫人海千千万万,感谢这一秒你看到这里。希望我的能对你的有所帮助!共勉!愿你在未来的日子,保持热爱,奔赴山海!Java基础知识(多态)多态因
- 1 StringString:字符串常量,字符串长度不可变。2 StringBufferStringBuffer:字符串变量(Synchro
- 1.分页类package org.zh.basic;/** * 页面类 * * @author keven&
- 本教程将介绍如何在 Spring Boot 应用程序中使用 Kafka。Kafka 是一个分布式的发布-订阅消息系统,它可以处理大量数据并提
- 添加群机器人可以查看这篇文章:添加机器人到钉钉群 使用命令行工具curl快速验证自定义机器人是否可以正常工作。可以使用如下命令,把对应的链接
- 1. 什么是λ表达式λ表达式本质上是一个匿名方法。让我们来看下面这个例子: public int add(int x, int