【问题标题】:How do I format/Alter displayed value in property grid如何格式化/更改属性网格中的显示值
【发布时间】:2016-10-05 13:26:50
【问题描述】:

我正在尝试使用WinformProperty Grid,但我无法格式化显示的值(现在与wpf 联系太紧密了)

所以我想要的是,属性网格中有一个下拉列表,它有自己的UITypeEditor,这个编辑器显示的值如

1 - On
2 - Off
3 - Unknown

所以监听 propertyGrid 更改的属性是 int 并且由于某些奇怪的原因我不能将其更改为字符串,所以就像在 wpf 中一样,我可以有一个转换器之类的东西来转换 1 into 1- On1-On to 1 吗?

我怎样才能将我的财产或财产网格装饰得如此智能?

我的财产看起来像

[LocalizedCategory("Limits", typeof(Api.Properties.Resources))]
[LocalizedDisplayName("Maximum", typeof(Api.Properties.Resources))]
[LocalizedDescription("Maximum", typeof(Api.Properties.Resources))]
[Editor(typeof(TextConversionTypeEditor), typeof(UITypeEditor))]
public int CriticalMaximum
{
    get; set;
}

我可以让我的属性网格显示比 int 更多的信息吗?

【问题讨论】:

  • 如果它应该被限制在这 3 个值上,它不应该是一个枚举吗?
  • 如果是这样,生活会变得轻而易举,但没有
  • 您可以编写一个 TypeConverter 并覆盖 StandardValues 方法
  • 我可以找一个简单的例子吗?属性上的 typeConverter ?没试过

标签: c# .net winforms propertygrid typeconverter


【解决方案1】:

如果您可以使用Enum 作为属性类型,则它会在下拉列表中显示可用值,否则您可以创建TypeConverter 来为下拉列表提供值。为此,您可以使用以下任一选项:

为您的 int 属性使用枚举的 TypeConverter

如果值是有限的并且在设计时是已知的,在这种情况下,尽管属性是 int,您可以为您的属性使用 Enum 的转换器,而无需覆盖任何内容:

public class MyObject
{
    [TypeConverter(typeof(MyTypeConverter))]
    public int MyProperty { get; set; }
}
public class MyTypeConverter : EnumConverter
{
    public MyTypeConverter() : base(typeof(MyValues)) { }
}
public enum MyValues
{
    On = 1,
    Off,
    Unknown
}

创建您自己的支持标准值的 TypeConverter

如果你不能有一个枚举并且你的标准值是在运行时生成的,你可以创建这样的TypeConverter

public class MyTypeConverter : TypeConverter
{
    Dictionary<int, string> values;
    public MyTypeConverter()
    {
        values = new Dictionary<int, string> { { 1, "1 - On" }, { 2, "2 - Off" }, { 3, "3 - Unknown" } };
    }
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string)) return true;
        return base.CanConvertFrom(context, sourceType);
    }
    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        if (value != null && values.ContainsValue(value.ToString()))
            return values.Where(x => x.Value == value.ToString()).FirstOrDefault().Key;
        return base.ConvertFrom(context, culture, value);
    }
    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(string) && value != null && value.GetType() == typeof(int))
            return values[(int)value];
        return base.ConvertTo(context, culture, value, destinationType);
    }
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }
    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
        return new StandardValuesCollection(values.Keys);
    }
}

【讨论】:

  • 它不是一个固定列表,实际上是一个带有键值 int 和字符串的字典
  • 没问题,我为这种情况添加了另一个选项。
  • 在上面的例子中,你可以从任何你需要的地方加载字典。
  • 不客气。如果您对答案有任何疑问,请告诉我。
  • aaa,它成功了 :),不得不做出一些改变,但它成功了,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多