当前位置: 首页 > news >正文

C# Winform之propertyGrid控件使用详解和分组设置

PropertyGrid 控件在 WinForms 中是一个非常有用的工具,它允许用户查看和编辑一个对象的属性。这个控件非常适合用于配置对话框或任何需要动态显示对象属性的地方。下面我会详细介绍 PropertyGrid 的使用方法和如何对属性进行分组。

使用详解

1. 添加 PropertyGrid 控件

在 Visual Studio 的工具箱中找到 PropertyGrid 控件并拖放到你的窗体上。

2. 绑定对象到 PropertyGrid

要使 PropertyGrid 显示对象的属性,你需要将一个对象实例绑定到 PropertyGrid 上。这可以通过设置 PropertyGrid.SelectedObject 属性来完成:

Csharp
1this.propertyGrid1.SelectedObject = myObject;

其中 myObject 是你想显示其属性的对象。

3. 自定义属性显示

你可以使用属性装饰器(Attributes)来改变属性在 PropertyGrid 中的显示方式。例如:

Csharp
1public class MyClass
2{
3    [DisplayName("Display Name")]
4    [Description("This is the description of the property.")]
5    [Category("My Category")]
6    [TypeConverter(typeof(MyConverter))]
7    [Editor(typeof(MyEditor), typeof(UITypeEditor))]
8    [Browsable(true)]
9    [EditorBrowsable(EditorBrowsableState.Always)]
10    [RefreshProperties(RefreshProperties.All)]
11    public string MyProperty { get; set; }
12}
  • [DisplayName] 设置属性在 PropertyGrid 中显示的名字。
  • [Description] 提供属性的描述,当鼠标悬停在属性上时会显示。
  • [Category] 将属性归类,便于在 PropertyGrid 中进行分组。
  • [TypeConverter] 指定类型转换器,以改变属性的编辑方式。
  • [Editor] 指定属性的编辑器。
  • [Browsable] 控制属性是否在 PropertyGrid 中可见。
  • [EditorBrowsable] 控制属性是否在设计时可见。
  • [RefreshProperties] 控制何时刷新属性网格。
4. 分组设置

使用 [Category] 属性装饰器可以将属性分组。例如:

 

Csharp

1[Category("Appearance")]
2public Color BackgroundColor { get; set; }
3
4[Category("Behavior")]
5public bool IsEnabled { get; set; }

PropertyGrid 中,属性将根据 [Category] 装饰器自动分组到不同的类别下。

高级用法

  • 属性过滤:你可以通过 PropertyGrid.PropertySort 属性来改变属性的排序方式,或者使用事件处理来过滤属性。
  • 属性编辑:你可以创建自定义编辑器和类型转换器来更精细地控制属性的编辑界面。

示例代码

 

Csharp

1public partial class MainForm : Form
2{
3    private MyClass myObject;
4
5    public MainForm()
6    {
7        InitializeComponent();
8        myObject = new MyClass();
9        propertyGrid1.SelectedObject = myObject;
10    }
11}
12
13public class MyClass
14{
15    [Category("Appearance")]
16    [DisplayName("Back Color")]
17    [Description("The background color of the control.")]
18    public Color BackColor { get; set; }
19
20    [Category("Behavior")]
21    [DisplayName("Is Enabled")]
22    [Description("Whether the control is enabled.")]
23    public bool IsEnabled { get; set; }
24}

5. 高级自定义

PropertyGrid 支持高级自定义,比如使用自定义的编辑器和类型转换器。例如,你可以使用 [TypeConverter][Editor] 装饰器来指定属性的编辑器类型和转换器。

 

Csharp

1[TypeConverter(typeof(ColorConverter))]
2public Color CustomColor { get; set; }
3
4[Editor(typeof(FontEditor), typeof(UITypeEditor))]
5public Font CustomFont { get; set; }

6. 动态修改属性可见性

你还可以在运行时动态地控制属性的可见性,通过监听 PropertyGridPropertyValueChanged 事件,根据当前状态决定哪些属性应该显示或隐藏。

 

Csharp

1private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
2{
3    if (e.ChangedItem.Label == "IsEnabled")
4    {
5        var isEnabled = (bool)e.NewValue;
6        foreach (var item in propertyGrid1.Properties)
7        {
8            if (item.Label != "IsEnabled")
9                item.IsBrowsable = isEnabled;
10        }
11    }
12}

以上代码创建了一个简单的 MainForm,并在其中使用了 PropertyGrid 控件,展示了如何绑定一个对象并使用装饰器来定制属性的显示。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 这个软件可无限制免费领取金币,领取后即可自由实现AI文生图,AI Chat及其AI文生PPT等AI功能
  • 一文带你掌握SpringMVC扩展点RequestBodyAdvice和ResponseBodyAdvice如何使用及实现原理
  • 【基础算法总结】链表
  • 力扣 202快乐数
  • Ollama + Openwebui 本地部署大型模型与交互式可视化聊天
  • 电气设计规范
  • 力扣面试经典150题
  • 借助软件资产管理系统,优化Solidworks软件许可证管理
  • ArduPilot开源飞控之AP_Mount_Backend_Serial
  • 谈一谈徒劳的坐地收益的副业问题
  • HTTP 请求走私漏洞详解
  • windows环境下基于3DSlicer 源代码编译搭建工程开发环境详细操作过程和中间关键错误解决方法说明
  • 软链接node_modules
  • 谷粒商城学习笔记-23-分布式组件-SpringCloud Alibaba-Nacos配置中心-简单示例
  • JavaFx+MySql学生管理系统
  • flutter的key在widget list的作用以及必要性
  • Linux各目录及每个目录的详细介绍
  • mysql innodb 索引使用指南
  • mysql中InnoDB引擎中页的概念
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Service Worker
  • spring boot下thymeleaf全局静态变量配置
  • Terraform入门 - 1. 安装Terraform
  • 汉诺塔算法
  • 那些年我们用过的显示性能指标
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • puppet连载22:define用法
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #define与typedef区别
  • (007)XHTML文档之标题——h1~h6
  • (3)选择元素——(17)练习(Exercises)
  • (办公)springboot配置aop处理请求.
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • ****三次握手和四次挥手
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .cfg\.dat\.mak(持续补充)
  • .net 7和core版 SignalR
  • .Net 8.0 新的变化
  • .net 获取某一天 在当月是 第几周 函数
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [000-01-022].第03节:RabbitMQ环境搭建