C# PropertyGrid控件和下拉列表

C# PropertyGrid控件和下拉列表,c#,winforms,C#,Winforms,我想创建一个下拉列表作为属性的编辑器;如果我只有字符串作为下拉列表的条目,这将很好(使用StringConverter)。但是,当我尝试使用对象列表而不是字符串时,这是行不通的(请注意,它如何适用于普通的组合框!) 这是我的密码: public static List<Bar> barlist; public Form1() { InitializeComponent(); barlist = new List<Bar&g

我想创建一个下拉列表作为属性的编辑器;如果我只有字符串作为下拉列表的条目,这将很好(使用StringConverter)。但是,当我尝试使用对象列表而不是字符串时,这是行不通的(请注意,它如何适用于普通的组合框!) 这是我的密码:

    public static List<Bar> barlist;
    public Form1()
    {
        InitializeComponent();
        barlist = new List<Bar>();
        for (int i = 1; i < 10; i++)
        {
            Bar bar = new Bar();
            bar.barvalue = "BarObject " + i;
            barlist.Add(bar);
            comboBox1.Items.Add(bar);
        }
        Foo foo = new Foo();
        foo.bar = new Bar();
        propertyGrid1.SelectedObject = foo;
    }

    public class Foo
    {
        Bar mybar;

        [TypeConverter(typeof(BarConverter))]
        public Bar bar
        {
            get { return mybar; }
            set { mybar = value; }
        }
    }

    public class Bar
    {
        public String barvalue;
        public override String ToString()
        {
            return barvalue;
        }
    }


    class BarConverter : TypeConverter
    {
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            return new StandardValuesCollection(barlist);
        }
    }
我很确定我可以通过定义向后转换工具将字符串转换回Bar对象来解决这个问题。这需要不同的钥匙才能正常工作。有更好的方法吗?为什么嵌入到propertyGrid控件中的comboBox使用字符串(普通comboBox在处理此问题时没有任何问题)

除此之外,我可以通过编程更改中间分隔符的位置吗?我还没有找到这个选择


谢谢。

我在转换类中添加了
CanConvertFrom
ConvertFrom
方法:

class BarConverter : TypeConverter
{
  public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
  {
    return true;
  }

  public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
  {
    return new StandardValuesCollection(barlist);
  }

  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 is string)
    {
      foreach (Bar b in barlist)
      {
        if (b.barvalue == (string)value)
        {
          return b;
        }
      }
    }
    return base.ConvertFrom(context, culture, value);
  }
}

它只是一个条形图对象列表。没什么特别的。我应该把它也包括在我的代码中吗?只要barlist中没有重复的名称(但是这些并不是禁止的,因为两个bar对象可以是不同的,但名称相同)+1就行了。你知道即使有重复的代码,我也能让它工作吗?@CBenni我只是想让你的代码在没有错误的情况下工作。您的“字符串”必须是唯一的,因为这是您试图转换的内容。因为这是唯一的答案,它(大多数情况下)是有效的,并且很可能永远不会有任何其他答案,我将继续并接受它。
class BarConverter : TypeConverter
{
  public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
  {
    return true;
  }

  public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
  {
    return new StandardValuesCollection(barlist);
  }

  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 is string)
    {
      foreach (Bar b in barlist)
      {
        if (b.barvalue == (string)value)
        {
          return b;
        }
      }
    }
    return base.ConvertFrom(context, culture, value);
  }
}