属性具有相同DisplayName时的PropertyGrid选择错误?

时间:2014-08-12 00:05:01

标签: c# winforms propertygrid

我有一个PropertyGrid,其所选对象包含[DisplayName]个“速度”的多个属性,所有属性都在不同的类别中(代码中的不动产名称当然都是唯一的)。我注意到如果我(例如)选择了速度#3并且调用了PropertyGrid.Refresh(),则选择将自动移至速度#1。更重要的是,Speed#3的值有时也会显示在Speed#1旁边。一旦我点击网格并更改选择,情况就会自动解决,但显然不是所希望的行为。

我目前正在通过向\t添加不同数量的DisplayName个字符来解决这个问题,以使它们都是唯一的。这是一个可接受的解决方法,因为实际上没有呈现制表符,但我当然不希望这样做。

是否有规则要求所有DisplayName必须唯一,或者这是PropertyGrid中的错误?


更新:由于有人要求提供代码示例,请在PropertyGrid中粘贴其中一个,然后每隔两秒左右从一个计时器上调用Refresh()

class Demo
{
    [Category("Cat1")]
    [DisplayName("Speed")]
    public int Speed1 { get; set; }

    [Category("Cat2")]
    [DisplayName("Speed")]
    public int Speed2 { get; set; }

    [Category("Cat3")]
    [DisplayName("Speed")]
    public int Speed3 { get; set; }
}

1 个答案:

答案 0 :(得分:2)

我不认为这是一个错误,它可能是一个功能(有副作用:-)。您可以在Microsoft站点上检查属性网格源。 GridEntry.cs代码中的相关部分如下所示:

public override bool Equals(object obj) {
  if (NonParentEquals(obj)) {
    return((GridEntry)obj).ParentGridEntry == this.ParentGridEntry;
  }
  return false;
}

internal virtual bool NonParentEquals(object obj) {
  if (obj == this) return true;
  if (obj == null) return false;
  if (!(obj is GridEntry)) return false;
  GridEntry pe = (GridEntry)obj;

  return pe.PropertyLabel.Equals(this.PropertyLabel) &&
    pe.PropertyType.Equals(this.PropertyType) && pe.PropertyDepth == this.PropertyDepth;
}

如您所见,它是使用的PropertyLabel。如果您更多地遵循代码,标签最终将使用属性的DisplayName(如果未定义DisplayName属性,则使用名称)。