首页 > 编程语言 >C# 如何在 PropertyGrid 中,对同一double的成员显示出不同的长度的内容?

C# 如何在 PropertyGrid 中,对同一double的成员显示出不同的长度的内容?

时间:2024-12-03 11:43:11浏览次数:9  
标签:C# double PrecisonAttribute value typeof context PropertyGrid public

这段时间搞东西,接触到这个,整了好几天。终于 Stackoverflow 上找到一个与我思路上一样的答案。之前用了好多遍 百度 AI 的方法都牛头不对马嘴。

看来 自己对 这一套 C# 的中的反射机制中的内容还不是太熟悉。所以摸了好久。

主要思路是这样的:

PropertyGrid 可以把一个对象中 public 成员 都显示到界面上去,供使用者修改,如下:

这个对象的类是这样的:

1 public class testObject
2 {
3     [TypeConverter(typeof(CustomDoubleConverter)), PrecisonAttribute(3), Category("all"), Description("this is a double 1")]
4     public double MyDouble1 { get; set; }
5 
6     [TypeConverter(typeof(CustomDoubleConverter)), PrecisonAttribute(2), Category("all"), Description("this is a double 2")]
7     public double MyDouble2 { get; set; }
8 }

在主程序里是这样把这个 对象 与 PropertyGrid 关联起来的:

public Form1()
{
   testObject to = new testObject();
InitializeComponent(); to.MyDouble1 = 1.2222f; to.MyDouble2 = 2.1f; propertyGrid1.SelectedObject = to; }

显示出来是这样的:

可以看到,通过指定不同值的 PrecisonAttribute,让两个都是 double 的值,在 PropertyGrid 里显示出不同长度的小数点后长度值。

上面 testObject 里,两个 double 成员,都指定了 自定义的 typeConverter 的类 CustomDoubleConverter,如下:

public class CustomDoubleConverter : DoubleConverter
{
    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(string) && value is double doubleValue)
        {
            int d = 0;

            if ( context != null )
            {
                AttributeCollection ac = context.PropertyDescriptor.Attributes;

                PrecisonAttribute pa = (PrecisonAttribute)ac[typeof(PrecisonAttribute)];
                if (pa != null)
                    d = pa.Precison;
            }

            return doubleValue.ToString("N" + d, culture);
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
}
public class PrecisonAttribute : Attribute
{
    // The constructor is called when the attribute is set.
    public PrecisonAttribute(int value)
    {
        _precison = value;
    }

    // Keep a variable internally ...
    protected int _precison;

    // .. and show a copy to the outside world.
    public int Precison
    {
        get { return _precison; }
        set { _precison = value; }
    }
}

以上这段代码里:

AttributeCollection ac = context.PropertyDescriptor.Attributes;

PrecisonAttribute pa = (PrecisonAttribute)ac[typeof(PrecisonAttribute)];

这两句就是本文精华。之前整了好久,都找不到如何在这里获得传入的其它元数据的。主要还是自己对 TypeConverter 结构 以及 反射机制不是很熟悉。所以也没仔细去看 context 这个参数。现在想想应该还是蛮合理的:上下文。

标签:C#,double,PrecisonAttribute,value,typeof,context,PropertyGrid,public
From: https://www.cnblogs.com/pencilstart/p/18583765

相关文章

  • 多系统集成分析——ERP与OA、PLM、MES、CRM、WMS、SRM、HR
    “集成审批抓OA、集成设计抓PLM、集成生产抓MES、集成销售抓CRM、集成仓储抓WMS、集成采购抓SRM、集成人力抓HR。” 一、ERP与OA系统的集成1、业务的审批流集成:在ERP系统中发起的销售、采购等审批流程可统一集成到OA系统中进行,审批结果再反馈回ERP系统。2、基础数据同步集......
  • 使用 Go 语言与 OpenCV 进行物体检测
    GoCV是一个Go语言绑定的OpenCV库,我们可以用它来处理图像、视频并进行物体检测。通过GoCV,我们能够加载预训练的YOLO模型,并在实时视频流中进行物体检测。环境准备安装GoCV库首先,我们需要安装GoCV。GoCV是Go语言的OpenCV绑定,可以通过以下命令安装:bash安装GoC......
  • html静态网站基于HTML+CSS+JavaScript上海美食介绍网站网页设计与实现共计5个页面
    ......
  • DevEco Studio 实战第一节:字符串拼接与组件构建
    DevEcoStudio实战第一节:字符串拼接与组件构建引言在现代软件开发中,TypeScript提供了强类型的优势,而DevEcoStudio作为华为推出的开发集成环境,提供了便捷的代码管理和版本控制功能。本文将通过一个简单的示例,介绍如何在TypeScript和DevEcoStudio中进行字符串拼接......
  • 2024/12/2【链表】LeetCode 142 环形链表 II 【X】
    题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/description/题解链接:https://www.programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC没做出来......
  • 微软CICD有眼有手就可以部署
    微软的CICD1.完成CICD的组件叫做AzureDevops官方的链接:https://dev.azure.com/AzureDevops我们用的是微软的-云平台不需要部署到本地部署到云上就可以了第二种方式CICD大多数企业不是微软系的常用这个AzureDevopsjinkes本期用的是第一种,微软的(1)第一步创建新的......
  • HTML+CSS+JavaScript网页设计与制作实例 -Apple商城网页(6个页面)
    一、网站描述基于HTML、CSS和JavaScript等技术的综合应用,实现对Apple商城的仿写。该网站包含八个静态页面,分别是落地页、首页、简介、新闻、产品中心等。二、网页作品技术   HTML:用于构建网页的结构和内容,通过标签和属性来定义页面的各个部分。   CSS:用于美化......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript美食网站
    HTML+CSS+JS【美食网站】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • 最新毕设-Python-食堂就餐系统设计-82280(免费领项目)可做计算机毕业设计JAVA、PHP、爬
    摘要本论文主要论述了如何基于Python开发一个食堂就餐系统,本系统将严格按照软件开发流程进行各个阶段的工作,面向对象编程思想进行项目开发。在引言中,作者将论述食堂就餐系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。食堂就餐......
  • 启动应用程序出现uwfcfgmgmt.dll找不到问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个uwfcfgmgmt.dll文件(挑选合适的版本文件)把......