PropertyGrid使用总结1 PropertyGrid控件说明

我们在做窗体应用程序开发中,通常需要通过以下界面,完成对象的动态修改,其简单快捷的操作方式,大大提升了我们开发效率,如图:

在当前原始控件无法满足我们的要求的时候,我们通常需要自定义控件,为了提升控件的通用性,我们也希望这个控件可以通过以上属性对话框进行动态修改。我们定义如下控件:

复制代码
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
 
namespace AlbertControlExample.Controls 
{ 
/// <summary>
/// 定义一个新控件
/// </summary>
public class AlbertControlDef : Control 
{ 
public string Header 
{ 
get; set; 
} = "标题"; 
public int Number 
{ 
get; set; 
} = 100; 
public AlbertControlDef() 
{ 
} 
protected override void OnPaint(PaintEventArgs e) 
{ 
base.OnPaint(e); 
} 
} 
} 
复制代码

将当前的对象拖到界面后,可以看到如下显示:

除了来自父类的控件之外,定义了2个额外属性,并且也定义了初始值,其实现如下,以上的显示可以通过多个标签进行配置,如下:

复制代码
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
 
namespace AlbertControlExample.Controls 
{ 
/// <summary>
/// 定义一个新控件
/// </summary>
public class AlbertControlDef : Control 
{ 
[DisplayName("头部")] 
[Description("头部显示控件")] 
[Category("特征")] 
[DefaultValue("默认值")] 
[Browsable(true)] 
public string Header 
{ 
get; set; 
} = "标题"; 
[Category("特征")] 
[Browsable(false)] 
public int Number 
{ 
get; set; 
} = 100; 
public AlbertControlDef() 
{ 
} 
protected override void OnPaint(PaintEventArgs e) 
{ 
base.OnPaint(e); 
} 
} 
}
复制代码

其主要显示特征可以定义如下:

通过以上的定义,可以实现一些显示属性的定义,还有一些特殊类型,可以通过以上进行定义,其编写如下:

复制代码
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
 
namespace AlbertControlExample.Controls 
{ 
/// <summary>
/// 定义一个新控件
/// </summary>
public class AlbertControlDef : Control 
{ 
[DisplayName("头部")] 
[Description("头部显示控件")] 
[Category("特征")] 
[DefaultValue("默认值")] 
[Browsable(true)] 
public string Header 
{ 
get; set; 
} = "标题"; 
[Category("特征")] 
[Browsable(false)] 
public int Number 
{ 
get; set; 
} = 100; 
[Category("特征")] 
public Color HeaderColor { get; set; } = Color.Coral; 
[Category("特征")] 
public Font headerFont { get; set; } = DefaultFont; 
public AlbertControlDef() 
{ 
} 
protected override void OnPaint(PaintEventArgs e) 
{ 
base.OnPaint(e); 
} 
} 
} 
复制代码

通过定义一些常用的属性之后,会发现窗体显示界面,会自动给我们添加几个关于这个属性配置的操作界面,如图

系统会自动给我们配置对应属性需要的操作界面,这个系统是如何做到的呢,我们不得提一个重要的类TypeConverter,其是把我们输入的信息,转化为指定对象。如前面Number属性,我们输入的值是字符串,其会自动调用Int32Converter实现字符串和数字之间的互相转换。我们常用的转换类有:

UInt16Converter

提供用于在 16 位无符号整数对象与其他表示形式之间实现相互转换的类型转换器。

UInt32Converter

提供用于在 32 位无符号整数对象与其他各种表示形式之间实现相互转换的类型转换器。

UInt64Converter

提供用于在 64 位无符号整数对象与其他表示形式之间实现相互转换的类型转换器

ArrayConverter

提供将 Array 对象与其他各种表示形式相互转换的类型转换器。

ColorConverter

将颜色从一种数据类型转换为另一种数据类型

FontConverter

Font 对象从一种数据类型转换成另一种数据类型。

通过以上的TypeConverter实现PropertyGrid输入的文字与对应的类型相互转换。

下一节,我们介绍TypeConverter的使用。

posted @   Min.Xiaoshuang  阅读(2186)  评论(1编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示