Readonly PropertyGrid

时间:2010-02-23 00:16:05

标签: c# propertygrid readonly icustomtypedescriptor

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

似乎没有一种简单的方法可以将属性网格设置为只读模式。如果我禁用PropertyGrid,这也会阻止用户滚动列表。所以我认为最好的方法是在运行时将ReadOnlyAttributes添加到属性中。还有其他方法吗?

4 个答案:

答案 0 :(得分:7)

我找到了一个非常快速的解决方案,对于那些不关心属性网格灰化的人来说。

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

答案 1 :(得分:2)

由于您正在实施ICustomTypeDescriptor,因此无需添加任何属性;您只需覆盖IsReadOnly上的PropertyDescriptor即可。我认为编写一个模仿(通过ICustomTypeDescriptorTypeConverter)包装类型但总是返回只读PropertyDesciptor个实例的中间类型应该非常简单?如果你想要一个例子,请告诉我(虽然它不是琐碎的)。

您可能还想检查like this是否提供了构建它的内容。

答案 2 :(得分:0)

我的建议是编写一个继承自propertygrid控件的自定义控件,并在该自定义控件中,使用readonly的布尔值,然后覆盖一些内容并检查,if(readonly)然后取消操作

答案 3 :(得分:0)

我遇到了这个。我想要一个只读但不会变灰的控件。

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

#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