2012-02-15 2 views
1

일부 데이터를 편집해야하는 응용 프로그램이 있으며 PropertyGrid 구조가 시각적으로 내 요구에 가장 적합한 것입니다. 그러나 PropertyGrid는 객체의 public 속성을 사용하여 객체를 그리드에 표시합니다. (속성이있는 추가 옵션). 그러나 편집해야하는 키 - 값 쌍 목록이 동적이기 때문에 이러한 개체가 없습니다.개체없이 PropertyGrid를 사용할 수 있습니까?

이상적인 솔루션은 다음과 같이 될 것이다 :

public class GridParam 
{ 
    // ... several constructors here, one for each type 
    // ... or a single one but with generic class, does not matter 

    public String Name { get; set; } 
    public Object Value { get; set; } 
    public Type ItemType { get; set; } 
} 

GridParam stringParam = new GridParam("Address", "2534 Barkeley Av."); 
GridParam numberParam = new GridParam("Year", 2012); 

NewKindOfPropertyGrid grid = new NewKindOfPropertyGrid(); 
grid.AddParam(stringParam); 
grid.AddParam(numberParam); 

다음과 같습니다 속성 그리드 생성하는 것입니다 위의 코드 : enter image description here

는 PropertyGrid가 또는 기타와 가능한이 같은 뭔가를 기존 컨트롤 (적어도 PG와 비슷합니다)? 구문은 필자가 작성한 것과 유사 할 필요는 없지만 클래스를 정의하지 않고도 동적 일 수있는 그런 속성 모음을 받아 들일 수 있어야합니다.

+0

참조 http://stackoverflow.com/questions/313822/how-to-modify-propertygrid-at-runtime-add-remove-property-and-dynamic-types-enu –

답변

2

여기에는 두 가지 옵션이 있습니다.

첫 번째 (더 단순한 IMO)는 GridParam 인스턴스의 IEnumerable<T>을 사용하는 클래스에 ICustomTypeDescriptor interface을 구현하는 것입니다.

PropertyGrid class은 실제로 리플렉션을 사용하지 않습니다. ; 대신, TypeDescriptor class을 사용하여 개체의 인스턴스에 대한 메타 데이터를 가져옵니다. 기본적으로 리플렉션을 사용합니다.

그러나 ICustomTypeDescriptor을 구현하면 PropertyGrid은 구현시 TypeDescriptor에서 얻을 수있는 모든 정보를 가져옵니다. 당신이 원하는 것을 먹여 주기만하면됩니다.

이 경우 GetProperties 구현은 GridParam 인스턴스 각각에 대해 PropertyDescriptor으로 채워진 PropertyDescriptorCollection을 반환해야합니다.

다른 옵션은 동적으로 형식을 만들고 바인딩합니다 (PropertyGridobject을 바인딩하기 때문에). 물론, ICustomTypeDescriptor 구현이 수행하는 것의 대부분을 어느 정도 복제하고 있기 때문에 이전 버전과 함께하는 것이 더 나을 것입니다.