我有一个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; }
}
答案 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属性,则使用名称)。