【Visual Studio风格开发系列 - PropertyGrid控件】深度解析 TypeConverter & TypeConverterAttribute

C# PropertyGrid控件应用心得 最近项目中做一模块时偶发奇想,希望使用propertygrid的控件实现类似visual studio的属性样式,于是拿来一用,发现还真不是自己想象的那么简单,如果要实现一个比较好的展示,还真的需要不少技巧,通过自己的实践和网络的力量,“逢山开道,遇水搭桥”,总算是摸出一些门道,不敢私藏,拿出来与大家分享,呵呵。 先来转一个基础的,源自msdn http://www.microsoft 阅读详情

前言
    我们在开发复杂控件的时候不可避免的碰到类型转换TypeConverter,微软给我们提供了很多转换类如ArrayConverter,BaseNumberConverter,BooleanConverter(MSDN上更多:ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref3/html/N_System_ComponentModel.htm)等直接或间接的继承了TypeConverter类。我们在类型转换的时候经常用到这些类。然而我们如何编写自定义的TypeConverter类呢,又怎么样在复杂控件中使用呢。

TypeConverter Class
    TypeConverter类就是将一种类型(object,可以说是任何类型)转换到另一种类型(一般为string),或者将另一种类型转换回来。所有继承TypeConverter类型的都必须实现4个方法:(这里以另一种类型string为例)
     CanConverterTo 有两个重载方法,
             TypeConverter.CanConvertTo (Type)
             TypeConverter.CanConvertTo (ITypeDescriptorContext, Type)
       都有一个Type参数(要转换成什么类型),例如我们设计的要转换成string,在方法体里面判断这个参数的Type如果是string,则返回true,否则返回           false
     ConverterTo 也有两重载,
             TypeConverter.ConvertTo (Object, Type)
             TypeConverter.ConvertTo (ITypeDescriptorContext, CultureInfo, Object, Type)
       都有Object和Type参数,将Object转成Type类型的Object,返回Type类型的Object。
  下面类似的两个方法,不过方向相反,是从其他类型装换回来。
     CanConverterFrom 重载,
             TypeConverter.CanConvertFrom (Type)
             TypeConverter.CanConvertFrom (ITypeDescriptorContext, Type)
       在方法体里面判断参数Type是不是能转换回来的类型,例如string类型,如果是返回true,否则返回false。
     ConverterFrom 重载,
            TypeConverter.ConvertFrom (Object)
            TypeConverter.ConvertFrom (ITypeDescriptorContext, CultureInfo, Object)
       在方法体里面判断参数Object的类型是不是能转换回来的类型,例如string类型,如果是返回转换回来的类型。
      
    举例说明,以GPS经纬度位置为例,经纬度位置GPSLocation包括复杂属性经度Longitude和纬度Latitude。现我们根据其一属性Longitude类写个LongtitudeTypeConverter类。
    首先我们得有个Longtitude类吧。

 

有了个这个类,我们怎样将其转换到string类或其他类呢(这里假设string类)例如“24W3'4”形式,也许你会说重写ToString()方法不就行了,似乎可行,但如果转换成其他类呢,又从其他类转换回来呢,怎么办。还有在复杂控件中Designer设计中又该怎么办。(在复杂控件的应用稍后介绍)
    自然,这样我们是不是要写个转换类比较好呢,这个类必须直接或这间接继承TypeConverter类。

然后重载实现上面说的四个方法,现在我要Longitude类转换到string类型

有了这个转换类LongitudeTypeConverter,该怎么使用呢。其实很简单就是使用我们上面实现的四个方法,

输出结果是
10E11'12''
10
East
11
12
从结果中我们可以看到实现了我们预期的效果。
这些在一般代码里面可以用到,但从转换的结果中我们可以联想,web页面设计的两种模式(设计模式,源代码模式),在源代码模式我们显示的是string,但在设计模式我们显示控件的外观,这里就关系到TypeConverter类了,当然还有TypeConverterAtrribute。
下面就要说下这个TypeConverterAtrribute了。

TypeConverterAttribute Class
    TypeConverterAttribute 其实就是一个继承Attribute的类,使用[TypeConverter(typeof(MyClassConverter))]标签施加到程序实体上。根据TypeConverterAttritue的定义知道这个属性Attribute可以施加到所有实体上。

如果你对Attribute不太了解可以先看看dudu的阐释,或者看看http://www.codeproject.com/KB/cs/attributes.aspx。
Attribute是一种新的申明方式,它可以在是设计时和运行时作用于它附加的Program Entities上。
上篇我们定义了class Longitude 和 class LongitudeTypeConverter,然后我们做了个Test,实现了转换的目的。
但要在设计时或在运行时起作用,就是说在这两种情况LongitudeTypeConverter“自动的”帮助Longitude 实例于其他实例转换,需要TypeConverterAttribute的帮忙。
在coding中我们很惊奇的发现,只用在Longitude类上附加TypeConverterAttribute标签,这两者就能关联起来。为什么呢?

那是因为如果一个类附件了Attribute,那么这个类就可以通过反射方法得到这个类属性,还可以通过TypeDescriptor.GetConverter静态方法获得这个类相关转换类的实例。这样就轻松的关联起来了。比如Test

上面是在运行时,如果Longitude类的方法或字段也附加了相应的ConverterAttribute,我们也可以通过反射的方法得到附加ConverterAttribute的方法或字段。例如:

如果你想test上面的代码,需要自己完成CustomTypeConverterAttribute。

在设计时的应用,例如在复杂控件中的一个属性为一个类,我们需要在property browser中以string的形式输入值来初始化或构造这个属性property,我们需要在这个属性property上附件属性DesignerSerializationVisibility标签。例如:

上面还有PersistenceMode属性标签,其表示代码在asp.net页面显示(也可以说是持久)的方式,有几种详见http://www.cnblogs.com/thinhunan/archive/2006/12/10/588341.html

这样就可以达到效果如下([PersistenceMode(PersistenceMode.Attribute)])

([PersistenceMode(PersistenceMode.InnerProperty)])

参考
http://www.codeproject.com/KB/webforms/TypeConverters.aspx
http://www.codeproject.com/KB/cs/attributes.aspx
dudu:Attribute系列 http://www.cnblogs.com/ericwen/favorite/115549.html

不对之处请批评指正。

【测试代码下载(请点击)】


(转于:http://blog.youkuaiyun.com/luyifeiniu/archive/2009/12/30/5107832.aspx)

 

 

c#中PropertyGrid控件联合TypeConverter进行数据转换 c#中Property控件和TypeConverter类的使用 阅读详情

相关推荐

充分利用 .NET 框架的 PropertyGrid 控件

 充分利用 .NET 框架的 PropertyGrid 控件Mark RideoutMicrosoft Corporation摘要:本文旨在帮助您了解 Microsoft .NET 框架中的 PropertyGrid 控件,以及如何针对您的应用程序自定义该控件。 适用于:   Microsoft® .NET® 框架   Microsoft® Visual Studi

南京程序员俱乐部 1508

【Visual Studio风格开发系列 - WinForm】WinForm 控件开发基础

<br />    对于C# WinForm控件开发,MSDN上提供了很多使用的方法,那么这里就向你介绍对于C# WinForm控件开发的基本了解内容,C#开发WinForm控件的类型以及各自的特点。<br /> <br />C# WinForm控件开发的伊始:<br />    其实C#开发WinForm控件并不是很复杂,.NET为我们提供了丰富的底层支持。如果你有MFC或者API图形界面的开发经验,那么学会WinForm控件可能只需要很短的时间就够了。<br />    自己开发的WinForm控件通常

wonsoft的专栏 4213

PropertyGrid自定义UITypeEditor实战:从属性编辑器到踩坑指南

在图形化配置界面开发中,属性编辑器扮演着连接数据模型与用户交互的关键角色。基于反射机制,PropertyGrid能自动识别基础类型,但面对自定义复合类型时却显得无能为力。UITypeEditor作为扩展点,通过GetEditStyle、EditValue、PaintValue等核心方法,为开发者提供了完全可控的编辑体验。理解IWindowsFormsEditorService与ITypeDescriptorContext的协作原理,能够帮助开发者快速构建下拉面板或模态弹窗,实现坐标点、区间、枚举等复杂参数的

weixin_30342363的博客 224

界面控件DevExpress WinForm——轻松构建类Visual Studio UI(三)

本文主要介绍如何使用界面控件DevExpress WinForms控件构建类似Visual Studio用户界面的应用程序,欢迎下载新版组件体验!

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 1242

ZLMediaKit源码分析(二)推流创建

ZLMediaKit推流结构体创建是在RtspSession::onRecv()之后。如何触发onRecv()请参考上一篇文章这里不在赘述。

cliffordl的专栏 5070

Python实战:基于PyG和Stable-Baselines3复现柔性车间调度算法(附数据集)

本文提供了一份基于图神经网络与深度强化学习的柔性车间调度实战指南。通过PyTorch Geometric构建异构图表示车间状态,并利用Stable-Baselines3中的PPO算法训练调度智能体,详细介绍了从环境建模、网络设计到训练评估的完整代码实现,帮助开发者构建可复用的工业级智能调度系统。

ansible6ops的博客 607

在winform项目中用PropertyGrid显示、编辑集合的属性

在winform项目中用PropertyGrid显示、编辑集合的属性1 添加员工类2 添加员工类集合3 添加员工集合编辑器类4 添加公司类5 在PropertyGrid中显示对象属性6 获取编辑后的属性7 效果(1)公司对象属性(2)员工集合(3)获取修改后的对象属性 在winform开发中,利用PropertyGrid控件来显示、编辑对象的属性是非常方便的。 本文以一个公司类为例来介绍在Visual Studio(C#)中用PropertyGrid显示和编辑集合的属性,其中,公司对象中包含员工对象的集

木木大哥的专栏 9947

VS2022离线环境下的NuGet包管理:从本地源到依赖项全解析

本文详细解析了在VS2022离线环境下如何高效管理NuGet包,包括搭建本地NuGet源的两种方案(本地文件夹源和私有NuGet服务器)、获取离线包的三大渠道以及依赖项处理的实战技巧。通过自动化脚本和依赖树分析工具,帮助开发者解决离线环境中的依赖项黑洞问题,提升开发效率。

5f4d3s2a1q的博客 1060

C#自定义PropertyGrid属性

最近用到了PropertyGrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。 PropertyGrid控件就是Visual Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。 一.如何显示属性 1)普通显示 在PropertyGrid中显示

lxping1012的专栏 2万+

手把手教你用X-AnyLabeling实现医学图像标注:从SAM模型选择到多边形优化全流程

本文详细介绍了如何使用X-AnyLabeling平台结合Med-SAM等专业模型实现医学图像的高效标注。从环境配置、模型部署到实战工作流,涵盖智能辅助标注、低对比度解决方案及团队协作方案,帮助医疗从业者大幅提升标注效率与质量。特别适合处理CT/MRI等医学影像的复杂标注需求。

weixin_29251131的博客 456

vivado Block Design 设计 .tcl 文件使用,导出,修改,添加方式

在vivado中生成 Block Design可以导出tcl文件进行保存(体积小),或者在别的版本vivado中打开(版本互通),这是一个非常好的功能。另外GitHub中很多项目都是采用这种方式上传的,学会如何使用可以快速修改历程项目。

2203_75345038的博客 2493

C#下PropertyGrid使用

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Ref

Stay hungry,stay foolish 1439

YOLOv8轻量化模型瘦身术:深度解析与实战LAMP剪枝 YOLOv8(2021)

YOLOv8模型LAMP剪枝技术解析与实战 本文深入探讨了LAMP剪枝技术在YOLOv8目标检测模型中的应用。针对深度学习模型部署面临的资源限制问题,LAMP剪枝通过最小化L2失真和层自适应稀疏度分配,实现了高效模型压缩。相比传统幅度剪枝的&quot;一刀切&quot;方法,LAMP创新性地将剪枝建模为优化问题,定义LAMP分数来衡量权重重要性,自动确定各层最佳剪枝率。文章从理论基础出发,详细解析了LAMP的核心数学公式和算法流程,并提供了完整的YOLOv8移植实战指南,包括代码结构、剪枝步骤和微调策略。通

FJN110的博客 2422

C# 控件基础2——属性配置控件PropertyGrid使用详解,PropertyGrid自定义下拉框TypeConverter,PropertyGrid自定义弹窗UITypeEditor,特性

属性配置控件PropertyGrid使用详解,PropertyGrid自定义下拉框TypeConverter,PropertyGrid自定义弹窗UITypeEditor,特性

a1062484747的博客 1万+

基于uniapp开发PDA扫码枪APP:实现RFID批量扫描读取功能

基于uniapp的PDA扫码枪APP开发实战,实现高效RFID读取功能,uniapp整合PDA硬件的实践分享,基于uniapp的PDA端RFID批量扫描方案开发

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

python全栈入门到实战【基础篇 02】环境搭建:Python解释器与PyCharm、VSCode编辑器安装配置详解

本文详解Python环境搭建步骤。首先安装解释器(运行代码核心),需从官网下载,选3.8及以上版本(勿选2.x)。Windows安装必勾“Add Python.exe to PATH”,验证用`python --version`;Mac选universal2安装包,验证用`python3 --version`。 编辑器二选一:PyCharm社区版(免费,新手推荐),安装后需配置解释器路径;VSCode轻量,需装Python插件并选择解释器。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 5万+

PropertyGrid控件的使用4

目标PropertyGrid 基本的用法是绑定一个固定的类,显示这个类的属性和值。但是有些情况,你需要用到 PropertyGrid 去绑定一个属性/值的集合,但是这个属性/值的集合并不适合写成一个固定的类。比如你想用 PropertyGrid 绑定XML 里的数据。或者数据库的某个表。假设你有 1000 个XML 文件,每个 XML 所取到的属性集合各不一样,你不可能为每个XML

anders lu 的专栏 4883

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm控件开发和美化(1)——控件效果介绍

一直对.NET控件的美化比较感趣,自己也很喜欢开发一些控件,到目前为止也算是有了一些收获。 首先声明我学到的很多东西都来自网上,写这篇文章的目的只是对我以前的学习做一个总结和回顾,为下一步将这些东西做成一个真正的皮肤控件做准备。很多东西当初也记不得是在什么地方看到的, 如果没有注明出处的还请作者见谅。 在看过这篇系列文章后,如果您有什么好的意见和建议,请给我留言。 ...

weixin_30755393的博客 462

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

PropertyGrid控件由浅入深(一)

http://i2.feixin.10086.cn/pages/78831/1343441380 http://i2.feixin.10086.cn/pages/78831/1343440538 http://i2.feixin.10086.cn/pages/78831/1343439618 http://i2.feixin.10086.cn/pages/78831/1343455691

399

PropertyGrid控件由浅入深(二):基础用法

目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要素: 属性名称 属性的名称、标题。 属性编辑器(属性值) 这里显示的是属性的当前值,显示的一般为文字,也可以以图标的形式。编辑器会自动根据数据的类型定义一个验证器,比如属性类型为int类型,你是无法输入字符内容的。另外,一般属性的编辑是直接在属性值这栏直接输入,但是复杂的属性,一般都会提供一

mickey1554的博客 2509

另一种方法创建EasyUI中的PropertyGrid

现在有需求新建一个EasyUI中的PropertyGrid控件,在网上找了半天,都是用json传值的,官网上的例子如下: $('#tt').propertygrid({ width:300, height:'auto', url:'propertygrid_data.json', showGroup:true, scrollbarSize:0 }); ...

298

C#中的PropertyGrid控件在WinForm调试中的妙用

PropertyGrid,提供用于浏览对象属性的用户界面。在WinForm设计界面,点击某一个控件,选择“属性”页,可以看到控件的各个属性与对应的值,而用于展示这些信息的,就是PropertyGrid控件。 我们在进行WinForm程序设计与调试的时候,当需要修改控件的属性,如文本颜色、背景颜色、文本内容时,我们只能停止调试,重新设置属性再调试;有时候还要获取控件无法直接显示的属性,如...

abc2221的博客 387

c# propertyGrid下拉选项

实现下面效果的propertygrid属性下拉选择 具体代码如下 //form窗口类 public partial class Form1 : Form { public Form1() { InitializeComponent(); properties ps = new properti...

banyuejun8353的博客 1482

Code Project精彩系列(转)

Applications Crafting a C# forms Editor From scratch http://www.codeproject.com/csharp/SharpFormEditorDemo.asp 建立一个类似C#的环境, 实现控件拖拉,属性 Packet Capture and Analayzer 网络封包截获 http://www.codeproject.c...

weixin_30341735的博客 9627

winform控件PropertyGrid的应用(使运行中的程序能像vistual studio那样设置控件属性)

像有些卡业务流程或者调用第三方的接口的业务逻辑,某些机器因某种原因需要临时关闭该功能,就可以使用该控件实现个性化控制了,我上一家公司是用一个表来存储这种个性化设置参数,这样就要向数据库中查询一次,有点浪费性能了。好了,下面就和我一起体验一下该控件吧,当然网上也有很多博客教程了,本文就简单意思一下就行,核心就是设置PropertyGrid控件的SelectedObject属性为对应的Control控件。代码中添加了自定义属性NewProp,属性上的标记信息用于程序在运行时显示的属性信息。好了,本文到此结束。

zxy13826134783的博客 1956

C#中使用Property Grid 控件 学习笔记(一)

1.将Property Grid 控件添加到工具箱中 由于默认情况下Property Grid 控件没有显示在工具箱中所以需要手动添加。 图1 将Property Grid添加到工具箱(在工具箱上右键选择添加/移除项) 图2 在自定义工具箱对话框中选中PropertyGrid控件 2.编写自定义类,并跟PropertyGrid控件进行绑定 using System;using System.C

我走我的路 1万+
上一篇: C#中使用MD5加密的方法
下一篇: 【Visual Studio风格开发系列 - 可视化界面设计】Create And Host Custom Designers With The .NET Framework 2.0 (英文原文)
wonsoft
博客等级 码龄23年 228粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值