2010-02-23 8 views
4

사용자가 내 개체의 인스턴스를보고 가끔 편집 할 수 있도록 작성중인 응용 프로그램에서 PropertyGrid를 사용하고 있습니다. 때로는 사용자가 속성 표를 통해 파일을 변경할 수있는 읽기/쓰기 모드로 파일을 열 수 있습니다. 다른 경우에는 파일이 읽기 전용 모드로 열려있을 수 있으며 PropetyGrid를 통해 개체를 변경할 수 없어야합니다. 내 수업에는 ICustomTypeDescriptor를 구현하여 반환되는 동적 속성도 있습니다. 그래서 저는 PropertyGrid 컨트롤의 내장 된 유연성을 실제로 활용하기를 원합니다.Readonly PropertyGrid

속성 그리드를 읽기 전용 모드로 설정하는 쉬운 방법이없는 것처럼 보입니다. PropertyGrid를 비활성화하면 사용자가 목록을 스크롤하지 못하게됩니다. 그래서 가장 좋은 방법은 런타임에 속성에 ReadOnlyAttributes를 추가하는 것입니다. 다른 방법이 있습니까?

+0

당신 말이 맞아요. 유일한 방법은 사용자 지정 TypeDescriptor에 의해 게시 된 각 속성에 ReadOnly 특성을 추가하는 것입니다. MSPG를 사용하면 여전히 스크롤 할 수 있고 "속성 선택 가능"인 비활성화 된 PropertyGrid를 얻는 유연한 솔루션이 없습니다. –

답변

2

ICustomTypeDescriptor을 구현 중이므로 특성을 추가 할 필요가 없습니다. PropertyDescriptor에서 IsReadOnly을 무시할 수 있습니다. wrapped 형식을 모방 한 (ICustomTypeDescriptorTypeConverter) 중개자 유형을 작성하는 것은 꽤 간단해야한다고 생각하지만 항상 읽기 전용 PropertyDesciptor 인스턴스를 반환합니까? 예를 들어 원한다면 알려 주시기 바랍니다 (은 아님)..

like this에 제공되는 기능이 있는지 여부를 확인할 수도 있습니다.

+0

그래,이게 내가 생각하고 있었지만 더 쉬운 방법 이었으면 좋겠다. 진짜 문제는 때때로 나의 수업은 읽기 전용이고 그렇지 않은 다른 시간들입니다. 별도의 읽기 전용 래퍼 유형을 만드는 대신 ICustomTypeDescriptor.GetProperties()가 편집 가능한 속성 또는 읽기 전용 속성을 반환해야하는지 확인하는 기본 형식에 부울 속성을 추가하는 방법은 무엇입니까? –

0

내 조언은 속성 그리드 컨트롤과 그 사용자 정의 컨트롤에서 상속받은 사용자 정의 컨트롤을 작성하고, 읽기 전용의 부울 값을 가지며, 몇 가지 사항을 덮어 쓰고 확인 (읽기 전용) 후 작업 취소

0

나는 이것에 부딪쳤다. 읽기 전용 이었지만 회색으로 표시되지 않은 컨트롤이 필요했습니다.

속성 그리드 컨트롤에서 상속 만들고 자신의 내가 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 
+0

IMessageFilter 인터페이스가 구현되어야한다고 언급하는 것을 잊었습니다. 어쨌든이 솔루션은 사용자가 보관 용 계정을 클릭하거나 두 번 클릭하여 해당 값을 변경하는 것을 방지하지 않으므로 작동하지 않습니다. – NinjaCross

6

를 오버라이드 (override) 할 수있는 다음 코드를 추가하여 전용 버전을 읽을 수 회색으로 변했다.

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

더 나은 : http://www.csharp-examples.net/readonly-propertygrid – cic

관련 문제