C# PropertyGrid

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# PropertyGrid相关的知识,希望对你有一定的参考价值。

C# PropertyGrid 绑定的对象中,有一 bool 属性,第一次点击属性箭头选择“True”还是“False”没问题,可不知道为什么,第二次点击就毫无反应了,下拉列表不打开了。

找了很久不知道什么问题。
PS PropertyGrid 所属的窗口是作为另一个窗口的子窗口打开的。
如果将PropertyGrid 所属的窗口作为主窗口打开,则没问题。

真是神奇
问题找到了。

参考技术A 问题找到了,就把这个提问处理掉吧。 参考技术B 关注

C#:更新时 PropertyGrid 不调用属性`Get`方法

【中文标题】C#:更新时 PropertyGrid 不调用属性`Get`方法【英文标题】:C#: Property `Get` method not being called by PropertyGrid when updated 【发布时间】:2018-02-15 13:26:14 【问题描述】:

我已经被这个问题困住了一段时间,我似乎无法弄清楚我在哪里出错了。我有一个类UnitInfo 有几个属性,用于在winform 中填充PropertyGrid。属性:

public class UnitInfo 
    public byte[] data  get; set;  = new byte[5];
    public int serialNumber
    
        get
        
            return (int)data[0] & 0b0111_1111;
        
        set
        
            data[0] = (byte)(((int)data[0] & 0b1000_0000) | (int)value);
        
        .
        .
        .
    

其余属性类似。当我在PropertyGrid 中更新除data 之外的任何属性时,对data 的更改会立即显示。例如,如果我通过在PropertyGrid 中手动输入一个值来更改序列号,那么data 将相应地更新。然而,反之亦然。如果我修改PropertyGrid 中的data 以更改serialNumber 的值,那么data 将更新但serialNumber 不会。

通过阅读文档,我对PropertyGrid 的理解可能是错误的,但是当更改一个属性时,不应该调用所有属性的Get 方法吗?当任何属性修改 data 时似乎会发生这种情况。

为什么修改data后属性不更新?

【问题讨论】:

这个问题非常不清楚。请编辑您的问题,将类的名称和字节数组属性更改为不同的名称,以便我们弄清楚您在说什么。 @MarkBenningfield 对此感到抱歉,我修改了名称以使其(希望)更清晰。 你永远不会更新data。永远不会调用数据的 set 方法。您只是更改该字节数组的状态,属性永远不会改变,它始终保持相同的 5 个字节(只是具有不同的值)。 【参考方案1】:

您应该使用RefreshPropertiesAttribute 装饰属性以通知 PropertyGrid 它应该处理更新对象。

[RefreshProperties(RefreshProperties.All)]
public byte[] data  get; set;  = new byte[5];

对要响应在 PropertyGrid 控件中进行编辑的类上的每个属性执行此操作。请注意,特别是对于这个属性,您必须分配一个 new 字节数组,而不仅仅是修改现有数组的值。

【讨论】:

这很好用!但是,它需要我单击 PropertyGrid 中的属性才能刷新它们。有没有办法告诉 PropertyGrid 在修改 data 时刷新所有属性?我已将 RefreshProperties 属性放在类中的所有属性上 尝试RefreshProperties.Repaint 而不是.All 我尝试使用Repaint,但行为仍然相同。不过,它肯定工作得很好。谢谢! yourPropertyGrid.Refresh() 有什么问题?看我的回答。【参考方案2】:

据我所知,如果您以编程方式更改依赖属性,PropertyGrid 不会完全更新。在我的一个项目中,出于这个原因,我在程序更改后调用 PropertyGrid.Refresh()。但是我无法通过引用 MSDN 来证明这一点。

因此,如果您在数据设置器中知道 serialNumber 依赖于数据(PropertyGrid 现在肯定不依赖于数据),那么在 data.set 中调用 PropertyGrid.Refresh()(这需要您显式地写出设置器)。

不过,也许事件也有不同的方式。

编辑:另见此问题(和答案):PropertyGrid doesn't notice properties changed in code?

【讨论】:

以上是关于C# PropertyGrid的主要内容,如果未能解决你的问题,请参考以下文章

C#进阶C# 泛型

C#进阶C# 匿名方法

C#进阶C# 多线程

C# 教程

[C#教程01]C# 简介

用 C# 编写 C# 编译器,先有鸡还是先有蛋?