【问题标题】:PropertyGrid selection bug when properties have identical DisplayName?当属性具有相同的 DisplayName 时,PropertyGrid 选择错误?
【发布时间】:2014-08-12 14:45:51
【问题描述】:

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

我目前正在通过向DisplayNames 添加不同数量的\t 字符来解决这个问题,以使它们都独一无二。这是一个可以接受的解决方法,因为实际上并没有渲染制表符,但我当然不想这样做。

是否存在所有DisplayNames 必须唯一的规则,或者这是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; }
}

【问题讨论】:

    标签: c# winforms propertygrid


    【解决方案1】:

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

    【讨论】:

    • 这似乎确实可以解释为什么会发生这种情况。但是... GridEntry 有一个可覆盖的 PropertyDescriptor 属性。如果它返回非空值,或者PropertyDescriptorGridEntry 可以覆盖NonParentEquals 以添加该检查,似乎可以在这里利用它,但谁知道呢。无论如何,它似乎确实表明存在一条不成文的(据我所知)规则,即您在网格中公开的每个属性都需要具有显示名称、类型和树深度的唯一组合。
    • 我们看到的 GridEntry 实际上是绑定到特定 PropertyDescriptor 的 PropertyDescriptorGridEntry,而且所有这些都是内部的,所以,除非有大的黑客攻击,否则没有办法改变它......
    • 对;我只是想知道为什么最初的开发人员没有做这些事情。但现在显然没有实际意义。至少我有一个解决方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多