我使用的是PropertyGrid的应用程序中,我写允许用户查看,有时我对象的编辑实例。有时候用户可能不得不在读/写模式打开的文件,他们可以通过属性网格进行更改文件。在其他情况下,他们可能在只读方式打开一个文件,而不应该是能够使通过PropetyGrid对象的任何变化。我的课还具有通过实施ICustomTypeDescriptor返回动态特性。这就是为什么我真的想利用内置的一个PropertyGrid控件的灵活性。

有似乎不是设置一个属性网格到只读模式的简单方法。如果我禁用的PropertyGrid这也防止了用户滚动列表。所以我想做到这一点的最好办法是ReadOnlyAttributes添加到在运行时的性能。是否有一些其他的方式?

有帮助吗?

解决方案

由于要实现ICustomTypeDescriptor没有必要添加任何属性;你可以只覆盖在IsReadOnly PropertyDescriptor。我想它应该是写一个中介型模仿(通过ICustomTypeDescriptorTypeConverter)一个包裹类型,但总是返回只读PropertyDesciptor情况很简单?让我知道如果你想要一个例子(它不是的琐碎的虽然)。

您可能还需要检查是否东西这样优惠它还内置了。

其他提示

我已经找到了谁不关心PropertyGrid中放入系统一个非常快速的解决方案正在变灰。

TypeDescriptor.AddAttributes(myObject, new Attribute[]{new ReadOnlyAttribute(true)});
propertyGrid1.SelectedObject = myObject;

我的建议是编写自定义控制从PropertyGrid控件继承,并在该自定义控制,具有只读一个布尔值,然后覆盖某些东西,并检查,如果(只读),那么取消操作

我跑进这一个。我想这是只读而不变灰控制。

继承属性网格控制和创建自己的只读通过添加以下代码覆盖按键版本

#Region "Non-greyed read only support"

Private isReadOnly As Boolean
Public Property [ReadOnly]() As Boolean
    Get
        Return Me.isReadOnly
    End Get
    Set(ByVal value As Boolean)
        Me.isReadOnly = value
    End Set
End Property


Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
    If Me.isReadOnly Then Return True
    Return MyBase.ProcessDialogKey(keyData)
End Function

Public Function PreFilterMessage(ByRef m As Message) As Boolean
    If m.Msg = &H204 Then 'WM_RBUTTONDOWN
        If Me.isReadOnly Then Return True
    End If
    Return False
End Function
#End Region
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top