翼度科技»论坛 编程开发 .net 查看内容

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

2

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
这段时间搞东西,接触到这个,整了好几天。终于 Stackoverflow 上找到一个与我思路上一样的答案。之前用了好多遍 百度 AI 的方法都牛头不对马嘴。
看来 自己对 这一套 C# 的中的反射机制中的内容还不是太熟悉。所以摸了好久。
主要思路是这样的:
PropertyGrid 可以把一个对象中 public 成员 都显示到界面上去,供使用者修改,如下:
这个对象的类是这样的:
  1. 1 public class testObject
  2. 2 {
  3. 3     [TypeConverter(typeof(CustomDoubleConverter)), <strong>PrecisonAttribute(3)</strong>, Category("all"), Description("this is a double 1")]
  4. 4     public double MyDouble1 { get; set; }
  5. 5
  6. 6     [TypeConverter(typeof(CustomDoubleConverter)), <strong>PrecisonAttribute(2)</strong>, Category("all"), Description("this is a double 2")]
  7. 7     public double MyDouble2 { get; set; }
  8. 8 }
复制代码
在主程序里是这样把这个 对象 与 PropertyGrid 关联起来的:
  1. public Form1()
  2. {<br>   testObject to = new testObject();<br>
  3.     InitializeComponent();
  4.     to.MyDouble1 = 1.2222f;
  5.     to.MyDouble2 = 2.1f;
  6.     propertyGrid1.SelectedObject = to;
  7. }
复制代码
显示出来是这样的:

可以看到,通过指定不同值的 PrecisonAttribute,让两个都是 double 的值,在 PropertyGrid 里显示出不同长度的小数点后长度值。
上面 testObject 里,两个 double 成员,都指定了 自定义的 typeConverter 的类 CustomDoubleConverter,如下:
  1. public class CustomDoubleConverter : DoubleConverter
  2. {
  3.     public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
  4.     {
  5.         if (destinationType == typeof(string) && value is double doubleValue)
  6.         {
  7.             int d = 0;
  8.             if ( context != null )
  9.             {
  10.                 <strong>AttributeCollection ac </strong><strong>= context.PropertyDescriptor.Attributes;
  11.                 PrecisonAttribute pa = (PrecisonAttribute)ac[typeof(PrecisonAttribute)];
  12.                 </strong>if (pa != null)
  13.                     d = pa.Precison;
  14.             }
  15.             return doubleValue.ToString("N" + d, culture);
  16.         }
  17.         return base.ConvertTo(context, culture, value, destinationType);
  18.     }
  19. }
  20. public class PrecisonAttribute : Attribute
  21. {
  22.     // The constructor is called when the attribute is set.
  23.     public PrecisonAttribute(int value)
  24.     {
  25.         _precison = value;
  26.     }
  27.     // Keep a variable internally ...
  28.     protected int _precison;
  29.     // .. and show a copy to the outside world.
  30.     public int Precison
  31.     {
  32.         get { return _precison; }
  33.         set { _precison = value; }
  34.     }
  35. }
复制代码
以上这段代码里:
  1. <strong>AttributeCollection ac = context.PropertyDescriptor.Attributes;
  2. PrecisonAttribute pa = (PrecisonAttribute)ac[typeof(PrecisonAttribute)];</strong>
复制代码
这两句就是本文精华。之前整了好久,都找不到如何在这里获得传入的其它元数据的。主要还是自己对 TypeConverter 结构 以及 反射机制不是很熟悉。所以也没仔细去看 context 这个参数。现在想想应该还是蛮合理的:上下文。

来源:https://www.cnblogs.com/pencilstart/p/18583765
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具