【Winform窗体控件开发】之五 实现类型转换器TypeConverterAttribute

Codesys软运动控制进阶:用SMC_FreeEncoder为ECAT轴搭建一个“虚拟手轮”调试工具 本文详细介绍了如何利用Codesys的SMC_FreeEncoder功能为ECAT轴搭建虚拟手轮调试工具,解决自动化设备开发中的硬件依赖问题。通过软件模拟手轮脉冲信号,实现无硬件依赖的运动控制逻辑验证,显著提升调试效率。适用于汇川AM400等PLC平台,特别适合机械安装滞后或伺服驱动器故障时的调试场景。 阅读详情

转自:http://www.cnblogs.com/bobbychencj/archive/2010/12/08/1900252.html


        这次我们讲一下关于TypeConverterAttribute属性的使用。

使用场景

  前几将我们了解了如何定义窗体控件的公共属性并在设计时指定属性的值,但是我们使用的都是简单的类型(如:Int32),如果我们的控件需要绑定一个我们自定义的类,并在设计时中指定该类的值我们就需要用到TypeConverterAttribute这个属性了。

实现方法

  我们知道,在设计时中我们为窗体控件指定一个值的时候都是以String型变量来显示出来的(例如:我们在第三讲时,为窗体控件属性Age赋值时,虽然我们定义的是一个Int32型的变量,但是我们可以在Designer的Attribute中为Age输入一个String类型的值)。其实,这是因为系统已经为我们实现了一个由 Int32<——>String类型的转换器(Int32Converter)。

  一般情况下,.Net Framework的FCL(Framework Class Library)中已经为内建类型提供了基本的转换器(举个例子:Int32类型对应的转换器是System.ComponentModel.Int32Converter,Enum对应是System.ComponentModel.EnumConverter)。

  若是自定义类型需要实现设计时支持时,我们需要自定义实现类型转换器——实现自定义转换器需要继承自TypeConverter并override相应方法(后面的代码会具体实现)。

实例一【在窗体控件中实现enum预定义列表】

  我们需要在一个控件上实现一个枚举的公共属性,并在设计时中能够使用下拉列表指定枚举的值。

自定义控件代码:

/*
实现在属性浏览器中提供标准值下拉列表的简单类型转换器
 
    1.定义一个从 TypeConverter 派生的类。

    2.重写 GetStandardValuesSupported 方法并返回 true。

    3.重写 GetStandardValues 方法并返回包含属性类型标准值的 TypeConverter.StandardValuesCollection。属性的标准值必须与属性自身的类型一致。

    4.重写 CanConvertFrom 方法并为类型字符串的 sourceType 参数值返回 true。

    5.重写 ConvertFrom 方法并基于 value 参数返回相应的属性值。

    6.将指示类型转换器类型的 TypeConverterAttribute 应用于要为其提供一组标准值的类型。
 */

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace WinFormControlLibrary
{
    public partial class FourthControl自定义控件属性实现类型转换器之标准值下拉列表的类型转换器一 : Control
    {
        private MoneyType _moneyType;

        [Browsable(true)]
        public MoneyType MoneyType
        {
            get { return _moneyType; }
            set { _moneyType = value; }
        }

        public FourthControl自定义控件属性实现类型转换器之标准值下拉列表的类型转换器一()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);

            #region 重绘控件
           
            Graphics g = pe.Graphics;

            #region 边框
            //
            // 设定大小区域
            //
            Size size = new Size(Size.Width - 1, Size.Height - 1);
            //
            // 设定Control 的大小
            //
            Rectangle rectagle = new Rectangle(Point.Empty, size);

            // 绘制控件边框
            g.DrawRectangle(Pens.Black, rectagle);
            #endregion 

            #region 文本内容
            g.DrawString(
                "自定义控件属性实现类型转换器之标准值下拉列表的类型转换器一", 
                Font, 
                Brushes.Black, 
                new PointF(1, 1)
                );
            #endregion

            #endregion
        }
    }

    #region Int32、String、枚举类型和其他类型具有默认的类型转换器。
    /// <summary>
    /// 因此,不用为基本类型实现TypeConverter转换器
    /// </summary>

    [TypeConverter(typeof(EnumConverter))] // 为对象指出使用转换器
    public enum MoneyType
    {
        人民币,
        美元,
        日元,
        法郎,
        英镑
    }

    #endregion
}

效果:

image

仔细观察代码你会发现,实现这个效果我们并没有增加新的额外代码(只是在MoneyType对象上增加了[TypeConverter(typeof(EnumConverter))]属性),这就是我们上面说的enum类型使用了.Net Framework 自己定义的转换器EnumConverter

实例二【实现自定义类型的预定义标准值列表】
/*
实现在属性浏览器中提供标准值下拉列表的简单类型转换器
    1.定义一个从 TypeConverter 派生的类。

    2.重写 GetStandardValuesSupported 方法并返回 true。

    3.重写 GetStandardValues 方法并返回包含属性类型标准值的 TypeConverter..::.StandardValuesCollection。属性的标准值必须与属性自身的类型一致。

    4.重写 CanConvertFrom 方法并为类型字符串的 sourceType 参数值返回 true。

    5.重写 ConvertFrom 方法并基于 value 参数返回相应的属性值。

    6.将指示类型转换器类型的 TypeConverterAttribute 应用于要为其提供一组标准值的类型。
 */
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Collections;
using System.Globalization;

namespace WinFormControlLibrary
{
    public partial class FourthControl自定义控件属性实现类型转换器之标准值下拉列表的类型转换器二 : Control
    {
        private int _friendsNum = 0;
        
        [TypeConverter(typeof(StandardValuesIntConverter))]
        public int FriendsNum
        {
            get
            {
                return this._friendsNum;
            }
            set
            {
                if (value.GetType() == typeof(int))
                    this._friendsNum = value;
            }
        }

        public FourthControl自定义控件属性实现类型转换器之标准值下拉列表的类型转换器二()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);

            #region 重绘控件

            Graphics g = pe.Graphics;

            #region 边框
            //
            // 设定大小区域
            //
            Size size = new Size(Size.Width - 1, Size.Height - 1);
            //
            // 设定Control 的大小
            //
            Rectangle rectagle = new Rectangle(Point.Empty, size);

            // 绘制控件边框
            g.DrawRectangle(Pens.Black, rectagle);
            #endregion

            #region 文本内容
            g.DrawString(
                "自定义控件属性实现类型转换器之标准值下拉列表的类型转换器二",
                Font,
                Brushes.Black,
                new PointF(1, 1)
                );
            #endregion

            #endregion
        }
    }

    public class StandardValuesIntConverter : TypeConverter
    {
        private ArrayList arrValues;

        public StandardValuesIntConverter()
        {
            // Initializes the standard values list with defaults.
            arrValues = new ArrayList(new int[] { 1, 2, 3, 4, 5 });
        }

        // 是否支持标准值
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        // 获取标准值集合
        public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            StandardValuesCollection svc = new StandardValuesCollection(arrValues);
            return svc;
        }

        // 是否可以转换
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(string))
            {
                return true;
            }
            else
            {
                return base.CanConvertFrom(context, sourceType);
            }
        }

        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
        {
            if (value.GetType() == typeof(string))
            {
                // 转换到整型
                int newVal = int.Parse((string)value);

                if (!arrValues.Contains(newVal))
                {
                    arrValues.Add(newVal);
                    arrValues.Sort();
                }
                return newVal;
            }
            else
            {
                return base.ConvertFrom(context, culture, value);
            }
        }
    }
}

image

与enum类型不同,在这个窗体控件中我们使用了ArrayList对象保存我们预定义好的值,但是系统没有提供我们ArrayList对应的转换器,因此我们实现了一个自定义对象类型转换器StandardValuesIntConverter用来在设计时和代码之间进行对应。

注意:

  在实例一和实例二我们声明的类型转化器位置不一样,实例一中是在自定义类上声明的,实例二中是在窗体控件的属性(自定义类)上声明的,但是效果一样。

【实例三】实例二中已经讲到如何对自定义类型的对象实现类型转换器,接下来我们再看一个实例,该实例与实例二比较相似,但是我们定义了一个Money的自定义类型用于窗体控件的属性,我们希望在设计时的ccMoney属性中输入一个特定格式的字符串(例如:123,456)来定义Money实例的值,123对应Min属性,456对应Max属性。

具体操作如下

money类型定义如下:

/// <summary>
/// 自定义对象
/// </summary>
public class Money
{
    private Int32 _min;
    private Int32 _max;

    [Browsable(true)]
    public Int32 Min
    {
        get { return _min; }
        set { _min = value; }
    }

    [Browsable(true)]
    public Int32 Max
    {
        get { return _max; }
        set { _max = value; }
    }

    public Money()
    {
    }

    public Money(Int32 min, Int32 max)
    {
        _min = min;
        _max = max;
    }
}

该对象类中有两个属性,我们需要在设计时中能够对窗体控件中的这两个属性进行设置。

实现方法如下

窗体控件代码:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel.Design.Serialization;
using System.Reflection;

namespace WinFormControlLibrary
{
    public partial class FourthControl自定义控件属性实现类型转换器之自定义类型 : Control
    {
        private String _ccMoney;

        [Browsable(true)]
        public String ccMoney
        {
            get 
            {
                return _ccMoney;
            }
            set
            {
                _ccMoney = value;
            }
        }

        public FourthControl自定义控件属性实现类型转换器之自定义类型()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);

            #region 重绘控件

            Graphics g = pe.Graphics;

            #region 边框
            //
            // 设定大小区域
            //
            Size size = new Size(Size.Width - 1, Size.Height - 1);
            //
            // 设定Control 的大小
            //
            Rectangle rectagle = new Rectangle(Point.Empty, size);

            // 绘制控件边框
            g.DrawRectangle(Pens.Black, rectagle);
            #endregion

            #region 文本内容
            g.DrawString("自定义控件属性实现类型转换器之自定义类型", Font, Brushes.Black, new PointF(1, 1));
            #endregion

            #endregion
        }
    }
 
    #region 自定义类型 和 自定义类型转换器

    /// <summary>
    /// 自定义对象
    /// </summary>
    [TypeConverter(typeof(MoneyConverter))] // 为对象指出使用自定义转换器
    public class Money
    {
        private Int32 _min;
        private Int32 _max;

        [Browsable(true)]
        public Int32 Min
        {
            get { return _min; }
            set { _min = value; }
        }

        [Browsable(true)]
        public Int32 Max
        {
            get { return _max; }
            set { _max = value; }
        }

        public Money()
        {
        }

        public Money(Int32 min, Int32 max)
        {
            _min = min;
            _max = max;
        }
    }

    /// <summary>
    /// Money对象的转换器
    /// </summary>
    public class MoneyConverter : TypeConverter
    {
        /// <summary>
        /// 是否可从指定类型转换到本类型(Money)
        /// </summary>
        /// <param name="context">提供组件的上下文信息,例如 组件的容器和属性描述</param>
        /// <param name="sourceType">指定对象的类型</param>
        /// <returns>能够转换返回ture 否则返回false</returns>
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(String))
            {
                return true;
            }
            return base.CanConvertFrom(context, sourceType);
        }

        /// <summary>
        /// 从指定类型转换到本类型(Money)
        /// </summary>
        /// <param name="context">提供组件的上下文信息,例如 组件的容器和属性描述</param>
        /// <param name="culture">本地化对象</param>
        /// <param name="value">欲转换对象</param>
        /// <returns>返回转换对象</returns>
        public override object ConvertFrom(
            ITypeDescriptorContext context,
            System.Globalization.CultureInfo culture,
            object value
            )
        {
            if (value is String)
            {
                String[] strArray = ((String)value).Split(',');

                // 数组的长度为2时
                if (strArray.GetLength(0) != 2)
                {
                    throw new ArgumentException("Invalid paremeter format");
                }
                Money money = new Money();
                money.Min = Convert.ToInt32(strArray[0]);
                money.Max = Convert.ToInt32(strArray[1]);
                return money;
            }
            return base.ConvertFrom(context, culture, value);
        }

        /// <summary>
        /// 是否可以转换到指定类型
        /// </summary>
        /// <param name="context">提供组件的上下文信息,例如 组件的容器和属性描述</param>
        /// <param name="destinationType">指定装换对象的类型</param>
        /// <returns>能够转换返回ture 否则返回false</returns>
        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(String))
            {
                return true;
            }
            if (destinationType == typeof(InstanceDescriptor))
            {
                return true;
            }
            return base.CanConvertTo(context, destinationType);
        }

        /// <summary>
        /// 转换到指定类型
        /// </summary>
        /// <param name="context">提供组件的上下文信息,例如 组件的容器和属性描述</param>
        /// <param name="culture">本地化对象</param>
        /// <param name="value">待转换对象</param>
        /// <param name="destinationType">指定装换对象的类型</param>
        /// <returns>返回指定类型对象的实例</returns>
        public override object ConvertTo(
            ITypeDescriptorContext context,
            System.Globalization.CultureInfo culture,
            object value,
            Type destinationType
            )
        {
            String result = "";
            if (destinationType == typeof(String))
            {
                Money money = (Money)value;
                result = String.Format("{0},{1}", money.Min, money.Max);
                return result;
            }

            // 如果对象类型为InstanceDescriptor
            if (destinationType == typeof(InstanceDescriptor))
            {
                #region 使用反射构造指定类型对象的实例

                Money money = (Money)value;

                //
                // 获取构造函数信息的对象
                //
                ConstructorInfo ci = typeof(Money).GetConstructor(new Type[] { typeof(Int32), typeof(Int32) });

                //
                // 返回可序列化的对象【TypeDescriptor 的若干方法使用 InstanceDescriptor 来表示或实例化对象】
                //
                return new InstanceDescriptor(ci, new object[] { money.Min, money.Max });

                #endregion
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }
    #endregion
}

注意在ConvertForm方法中我们将设计时属性中输入的字符串解析为Money对象。

效果图:

image

在设计时给属性赋值的时只需输入 格式为"min,max"格式的字符串就可以对Money对象的ccMoney窗体属性赋值了。

在【实例三中】有没有发现一个问题,我对ccMoney的设置是默认规定了一个字符串格式("min,max" ),这无论是对于使用该控件的人和程序开发人员来说都是不好的设计方法。对于Money这种复杂的对象属性来说最好自己定义一个UIEditer来为单独的子属性提供编辑功能。

好了说了这么多,类型转换器的内容基本上就这点东西了。下次我们说说如何为属性的子属性提供编辑功能。:)


【Bug已解决】Claude Code Auto-update failed 自动更新失败的解决方案 方案适用场景推荐指数清理残留重新安装已经损坏,需要快速恢复可用⭐⭐⭐⭐⭐修复目录权限权限不足导致更新反复失败⭐⭐⭐⭐⭐关闭自动更新网络/安全软件环境不稳定⭐⭐⭐切换原生安装方式想从根源规避 npm 更新问题⭐⭐⭐⭐自检修复脚本团队/服务器环境需要自动化恢复⭐⭐⭐报错的本质是自动更新过程中的文件替换操作因权限不足或被中断而处于不完整状态,而不是 Claude Code 本身的功能缺陷。遇到问题先清理残留文件再重新安装,不要在损坏状态上反复尝试修复; 阅读详情

相关推荐

异次元发卡最新漏洞0day(XSS组合拳)

异次元商店头像上传处存在存储型XSS注入(user、admin均存在)。其中,user处有过滤,admin无。 将恶意脚本插入后,管理员访问用户管理页面即可执行恶意脚本。 恶意脚本执行后,会新增一个管理员用户,进而获得权限。鉴于漏洞还没有泛滥,而且很多站都有漏洞。EXP暂时不公开。需要学习可以加入知识星球

白昼小丑的博客 4587

.NET组件编程(5) TypeConverterAttribute,类型转换

上一篇文章是03-08写的,距离今天已经有十多天了没有写了,主要是最近太忙了,而且在工作上遇到了一些难点,所以没有时间放在blog上,实在是对不住大家。 今天的这篇文章,我主要是带来PropertyAttribute里的TypeConverterAttribute的讲解,首先在这里讲讲TypeConverterAttribute的作用是什么:当Compone...

ajw1282的博客 518

上海交大计算机保研面试 2026:3类专项计划与10个联培方向深度解析

本文深度解析2026年上海交通大学计算机保研面试的3类专项计划与10个联培方向,包括区块链技术、智能计算系统和网络安全专项,以及蚂蚁科技、苏州智研院等联培基地。文章详细介绍了各专项的核心课程、硬件资源和就业去向,为计算机专业学生提供全面的申请策略和职业发展建议。

weixin_31528001的博客 395

深度解析 TypeConverter & TypeConverterAttribute (二)

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

weixin_30322405的博客 364

从零开始:在Windows WSL中搭建Openfoam7+blastfoam2.0.0开发环境(避坑大全)

本文详细指导在Windows WSL中搭建OpenFOAM 7与BlastFOAM 2.0.0开发环境,重点解析了安装过程中的常见“坑点”,如编译模式不匹配导致的符号错误,并提供了从系统准备、软件部署到环境验证的完整解决方案,帮助开发者高效构建CFD与爆炸模拟开发平台。

stem5的博客 526

驱动兼容_FANUC 驱动器兼容问题探讨

近10年来,FANUC伺服驱动器随着系统的升级而升级,不同的系统,可以兼容很多种类的驱动器,作者做了一些常见经验总结如下表:电源模块伺服放大器主轴放大器bi一体18i/OIB/OIC6110-Hxxx6114-Hxxx6111-Hxxx6134-Hxxx31iA/OID6140-Hxxx6117-Hxxx6141-Hxxx6164-Hxxx31IB/35IB/OIF/OI MATE D(5包)62...

weixin_34420941的博客 1751

组件编程(5) TypeConverterAttribute,类型转换

提供区域信息,如语言、时间格式、货币格式等

biyusr的专栏 663

静止无功补偿SVG的基本控制原理

上图是自励单变量控制框图,基本控制方式为,采集计算得到负载无功电流和SVG输出的无功电流的差值,经过PI调节作为功率角δ和固定的调制深度λ和调制波,经过PWM调制形成开关信号驱动SVG的功率电路。该控制方式使保持调制深度λ(即SVG电压的幅度)不变,通过调整δ来调整直流电压和无功,跟踪输出无功功率,直流电压就会大幅度随动,无功相应速度较慢。SVG通常有他励方式和自励方式,他励方式需要提供外部的直流电源,自励方式通过电网输出有功功率至SVG建立SVG的直流电压。δ为Us和Uc之间的相角差。

weixin_42668920的博客 1987

[转]深度解析 TypeConverter & TypeConverterAttribute

原文地址:http://www.cnblogs.com/ericwen/archive/2007/12/11/TypeConverter.html 前言    我们在开发复杂控件的时候不可避免的碰到类型转换TypeConverter,微软给我们提供了很多转换类如ArrayConverter,BaseNumberConverter,BooleanConverter(MSDN上更多:ms-help:...

weixin_34097242的博客 437

Hermes 教程 03:Skills 系统

摘要:Hermes Skills是一种自我改进机制,可将解决问题的经验保存为可复用技能文档。v0.13.0版本遵循agentskills.io开放标准,与Claude Skills互通。技能创建流程包括发现问题、创建技能文件、加载使用和优化更新四个阶段。系统提供技能检索和自维护机制(Curator),支持技能媒体路由和多种管理命令。内置技能涵盖开发调试、创意头脑风暴等场景,通过积累技能使Hermes更适应用户需求。

程序猿_三产 725

Ollama DNS 重新绑定攻击 (CVE-2024-28224)

一旦 DNS 重新绑定攻击成功,攻击者就可以对这些 API 进行排序,以读取 Ollama 运行的进程可访问的任意文件数据,并将这些数据泄露到攻击者控制的系统中。完成对“创建模型” API 请求的调用后,Ollama 将收集组成新创建的用户模型的许多工件,包括大型语言模型数据、许可证数据等,以及我们要提取的文件,所有这些都可以通过其 SHA256 内容进行寻址。这是我们要窃取的文件,在我们的示例中,是可通过运行 Ollama 的主机上的路径名访问的现有文本文件。值得注意的是,该模型配置为通过参数中的。

技术超强的网络安全平台 1648

【WinForm窗体控件开发】之三 窗体控件设计时属性Attribute

转自:http://www.cnblogs.com/bobbychencj/archive/2010/11/30/1892105.html 今天我们主要来介绍一下控件的Attribute属性, 下表列出了常用于属性 (Property) 和事件的属性 (Attribute)。 属性 (Attribute) 应用于 说明 Bro

threadroc的专栏 503

YOLOv11目标检测模型性能评价指标详解,涉及混淆矩阵、F1-Score、IoU、mAP、参数量、计算量等,一文打尽所有评价指标

本文主要讲解的是计算机视觉网络模型的性能评价指标,这是每一篇论文中都需要展示的内容。熟悉每一个评价指标也能够帮助我们在训练和改进模型过程中,更好的观察模型的变化效果。

Limiiiing的博客 8410

2021-03-22

C#的attribute与属性窗的关系 attribute特性 特性,即attribute,是一种特殊的类,他们都继承自名为attribute的一个类; C#中有许多预派生定义好的attribute类,我们可以直接拿来用,它们有丰富的功能,应用于不同场景; 我们也可以自定义一个attribute类,只要在定义时指定继承自attribute就可以了; attribute与property attribute可以用来修饰method方法、property属性等,来达到某些特定的目的; 可见,attribute相

biu_biu_biu_biu_的博客 200

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

WPF_初步认识TypeConverter

WPF对象的属性通常为String类型,但并不总是。类型不符时对其进行String赋值显然是不行的,但是可以通过类型转换类将String转换为对应类型后再进行赋值。上述代码中,"LittleTom"将作为参数value被传入ConvertFrom函数,ConvertFrom函数的返回值将被赋值给Child属性。3.为被赋值类(通过TypeConverterAttribute特征类)标注特征。1.类型转换类继承TypeConverter类。2.重写ConvertFrom函数。

Mudrock__的博客 699

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

笔记:ValueSerializerAttribute` 与 `TypeConverterAttribute` 的详细区别

这两个特性都用于控制类型转换行为,但在 WPF/XAML 中有着不同的设计目的和应用场景。理解这些差异可以帮助您为不同类型的XAML序列化需求选择最合适的转换机制。

HeBianGu的博客 589

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C# 写个枚举扩展方法,字符串根据枚举描述值Description转成指定枚举对象

C# 写个枚举扩展方法,字符串根据枚举描述值Description转成指定枚举对象

一个专注于技术研究创新的程序员 284

C# Winform PropertyGrid显示中文

主要原理是在枚举上添加DescriptionAttribute属性,然后通过反射将其显示出来。方法1:继承StringConverter类。方法2:自定义界面显示。

那人那事的博客 758

使枚举类型的选项在VS的属性窗里显示为中文

我们自己做的组件,一般希望它的属性在设计时能够在属性窗里显示为中文,可以在属性上添加System.ComponentModel.DisplayNameAttribute标注达到这个目的。但是,枚举的选项如何以中文的形式显示在属性窗里呢? 假设我们有如下枚举: 1: public enum MyEnum 2: { 3: A, 4...

305

C# 编程中的“变形术”:深入理解类型转换

类型转换(Conversion)的本质是将一个数据类型的值转换为另一个类型的等效值。举个栗子🌰:假设你有一个16位的有符号整数(short类型),值为5;另一个是8位有符号整数(sbyte类型),值为10。将short赋值给sbyte时,系统会自动或强制将short的值转换为sbyte类型,确保两者兼容。关键点:转换仅改变值的表现形式(类型),而非值本身(如short变量本身的值和类型不变)。-(图示:从short到sbyte的显式转换)

钢铁男儿 444

C# 基本结构

1,在C#中,结构体和类的成员都会被默认设置为私有成员。区别在于类是引用类型,结构体是值类型。     引用类型是指,一个指向内存块的指针。 2,C#中,点、尺寸、矩形、颜色 四个数据类型都是结构体而不是类。 3,Point结构具有两个读写属性的,叫做x,y的32为整数。   Point是个结构体,但是定义的同时也必须赋值 Point pt=new Point();然后pt.x=1;pt

Finder_Way 1945

命名空间“System.Web.UI.Design”中不存在类型或命名空间名称“ControlDesigner”

命名空间“System.Web.UI.Design”中不存在类型或命名空间名称“ControlDesigner” 命名空间“System.Web.UI.Design”中不存在类型或命名空间名称“ControlDesigner” 程序集:System.Design(在system.design.dll中) 右键工程选择“添加引用”--把system.design

SunCherryDream的专栏 5274

深度解析 TypeConverter & TypeConverterAttribute (一)

前言     我们在开发复杂控件的时候不可避免的碰到类型转换TypeConverter,微软给我们提供了很多转换类如ArrayConverter,BaseNumberConverter,BooleanConverter(MSDN上更多:ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref3/html/N_Syst

兴趣是最好的老师 1181

TypeConverter

TypeConverter实现步骤可以有以下两种方式: 一:套用系统定义的TypeConverter类,对自定义属性类做转换,比如套用ExpandableObjectConverter等。 二:套用自己定义的TypeConverter类,对自定义属性类做转换.

aqimide的专栏 6229

AttributeConverter属性转换器用法

AttributeConverter javax.persistence.AttributeConverter 开发中有一个问题,有一个业务对象,它的属性是一个JSONObject对象,但是我们希望存入数据库时,存为json字符串。前端在插入和查询时,都是以对象来处理,所以希望能自动转换,即在插入数据库时,转为字符串,查询出来后转为对象。这就用到了今天要说的属性转换器。 第一步:定义一个属性转换器...

不能如期而至的专栏 8019
上一篇: 【WinForm窗体控件开发】之四 DesignerSerializationVisibilityAttribute 控件属性的串行化
下一篇: 【转帖】C#与C Windows API数据类型对应关系
「已注销」
博客等级 码龄14年 116粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值