代码之家  ›  专栏  ›  技术社区  ›  dlf

当财产具有相同的DisplayName时,PropertyGrid选择错误?

  •  4
  • dlf  · 技术社区  · 10 年前

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

    我目前正在通过添加不同数量的 \t 字符到 DisplayName 让他们都与众不同。这是一个可以接受的解决方法,因为选项卡字符实际上没有被渲染,但我当然不想这样做。

    有没有一个规则 显示名称 s必须是唯一的,或者这是 属性表格 ?


    更新:由于有人一定会要求提供代码示例,请在 属性表格 然后打电话 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 回复  |  直到 10 年前
        1
  •  2
  •   Simon Mourier    10 年前

    我不认为这是一个bug,它可能是一个功能(有副作用:-)。您可以在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属性,则使用名称)。