C# 怎样在 PropertyGrid 中,对同一double的成员表现出不同的长度的内容? ...

打印 上一主题 下一主题

主题 757|帖子 757|积分 2271

这段时间搞东西,接触到这个,整了好几天。终于 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 这个参数。现在想想应该还是蛮合理的:上下文。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表