2008-08-25 1 views
2

특정 유형의 컨트롤을 추가 속성으로 확장하는 Extender (IExtenderProvider)가 있습니다. 이러한 속성 중 하나에 대해서는 이 UITypeEditor로 작성되었습니다. 지금까지 모든 것이 잘 작동합니다.UITypeEditor 및 IExtenderProvider

익스텐더에는 두 가지 속성이 있습니다. 은 UITypeEditor에 대한 일종의 기본값으로 사용하려고합니다. 내가 뭘하고 싶지 (확장 컨트롤이 아닌) 익스텐더 자체의 속성을 설정할 수 있습니다. 그리고 확장 컨트롤 의 추가 속성 중 하나에 대해 UITypeEditor를 열면 UITypeEditor의 값을 Extender의 속성 값인 으로 변경하십시오.

간단한 예 : ExtenderProvider에는 DefaultExtendedValue 속성이 있습니다. 양식에서이 속성의 값을 "My Value"로 설정했습니다. 확장 된 컨트롤에는 공급자를 통해 UITypeEditor가있는 ExtendedValue 속성이 있습니다. ExtendedValue 속성의 편집기를 열면 기본 (초기) 값을 "내 값"으로 설정해야합니다.

이 가장 좋은 곳이 바로 IWindowsFormsEditorService.DropDownControl 또는 .ShowDialog를 호출하기 전에, UITypeEditor.EditValue 것 할 것을 날 것으로 보인다.

유일하게 문제는 EditValue에서 Extender 공급자 자체를 보류로 가져올 수 없거나 해당 속성의 값을 읽고 UITypeEditor에 설정한다는 것입니다. 컨텍스트는 확장 된 컨트롤을 제공하지만,이 경우에는 전혀 유용하지 않습니다.

내가 시도하는 것을 달성 할 수있는 방법이 있습니까? 어떤 도움을 주셔서 감사합니다!

감사 톰


@samjudson : 그것은 나쁜 생각이 아니다,하지만 불행히도 그것은 아주 저를 거기하지 않습니다. Extender 공급자의 각 인스턴스에 대해이 기본값을 개별적으로 설정할 수 있어야합니다. 하나의 폼에 다른 컨트롤의 그룹에 대해 서로 다른 값을 가진 여러 값이있을 수 있습니다.

답변

0

DefaultValue를 ExtenderProvider의 정적 속성으로 추가하는 것을 고려한 적이 있습니까? 그렇다면 인스턴스를 필요로하지 않고 액세스 할 수 있습니까? 공급자?

2

직접 속성을 읽을 수 있습니까?

DefaultValueAttribute att = context. 
    PropertyDescriptor.Attributes. 
    OfType<DefaultValueAttribute>(). 
    FirstOrDefault(); 
object myDefault = null; 
if (att != null) 
    myDefault = att.Value; 

내가 코드를 단순화하기 위해 Linq를 사용했습니다,하지만 당신은 내가이 발견 한

1

안녕 닷넷 다시 비슷한 일을 할 수있는 : 기본적으로 http://social.msdn.microsoft.com/forums/en-US/winformsdesigner/thread/07299eb0-3e21-42a3-b36b-12e37282af83/

:

var Ctl = context.Instance as Control; 

Type t = Type.GetType("System.ComponentModel.ExtendedPropertyDescriptor"); 
LocalizationProvider myProvider = GetValueOnPrivateMember(t, context.PropertyDescriptor, "provider") as MyOwnExtenderProvider; 

마술처럼 myProvider는 내 IExtenderProvider 컨트롤을 가지고 있습니다!

GetValueOnPrivateMember 이런 식으로 구현해야

:

static object GetValueOnPrivateMember(Type type, object dataobject, string fieldname) 
     { 
      BindingFlags getFieldBindingFlags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField; 
      return type.InvokeMember(fieldname, 
       getFieldBindingFlags, 
       null, 
       dataobject, 
       null); 
     } 
관련 문제