2010-05-03 3 views
5

[편집] 분명히하기 위해 리플렉션을 통해 양식 목록을 얻는 방법을 알고 있습니다. 나는 디자인 타임 속성 그리드에 더 관심이있다.Visual Studio 디자인 타임 속성 - 양식 목록 드롭 다운

Form 형식의 공용 속성을 가진 사용자 정의 컨트롤이 있습니다.
디자인 타임에 드롭 다운에서 양식을 선택할 수 있기를 원합니다.
집합 네임 스페이스에서 양식 드롭 다운 목록을 채우려합니다. UI.Foo.Forms

Control의 공용 속성이있는 것처럼 작동합니다. 디자인 타임에 속성은 폼의 모든 컨트롤이있는 드롭 다운 목록을 자동으로 채 웁니다. 네임 스페이스의 모든 양식을 채워 넣기만하면됩니다.

어떻게해야합니까? 내가 혼란이 없도록 내가 충분히 명확 해 졌으면 좋겠다. 가능하다면 몇 가지 코드 예제를 찾고 있습니다. 나는 다른 마감일을 지킬 때 이것에 너무 많은 시간을 할애하지 않아도되도록 노력하고 있습니다.

미리 도움을 주셔서 감사합니다.

답변

7

쉽게 반사를 통해 클래스를 얻을 수 있습니다 :

var formNames = this.GetType().Assembly.GetTypes().Where(x => x.Namespace == "UI.Foo.Forms").Select(x => x.Name); 

당신이 양식과 같은 어셈블리 코드에서이 전화하는거야 가정하면, 당신은에있는 모든 유형의 이름을 얻을 것이다 "UI.Foo.Forms"네임 스페이스. 그런 다음 드롭 다운에이를 제시하고, 결국 반사를 통해 사용자에 의해 선택 중 인스턴스화 할 수 있습니다 한 번 더 :

Activator.CreateInstance(this.GetType("UI.Form.Forms.FormClassName")); 

[편집] 디자인 타임 물건에 대한 코드를 추가 :

당신의 통제에서 당신 다음과 같이 Form 속성을 만들 수 있습니다.

정의해야하는 편집기 유형을 참조하는 것은 다음과 같습니다. 코드는 아주 자명하며, 최소한의 조정만으로 원하는 것을 정확히 생성 할 수 있습니다.

public class TestDesignProperty : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.DropDown; 
    } 

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     var edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); 

     ListBox lb = new ListBox(); 
     foreach(var type in this.GetType().Assembly.GetTypes()) 
     { 
      lb.Items.Add(type); 
     } 

     if (value != null) 
     { 
      lb.SelectedItem = value; 
     } 

     edSvc.DropDownControl(lb); 

     value = (Type)lb.SelectedItem; 

     return value; 
    } 
} 
+0

나는 형식의 목록을 얻는 방법을 알고 있었지만, 공공 장소를 디자인 할 때 디자인 격자에서 채워지는 방법을 정확히 모릅니다. –

+0

디자인 타임 요구 사항을 해결하기 위해 필자의 대답이 업데이트되었습니다. – CMerat

+1

감사합니다. 메라트, 나는 받아들이 기 위해 또 다른 14 시간을 기다려야한다. (칠면조 사냥을하기 때문에 며칠이 걸릴 수도있다. :) 그러나 완벽하게 일했다. –

2

항목을 클릭하여 선택됩니다 때 드롭 다운이 종료하지 않기 때문에이 유용 할 수있다 :

이벤트 핸들러 함수를 목록 상자의 클릭 이벤트 핸들러를 할당하고 추가

public class TestDesignProperty : UITypeEditor 
{ 

    // ... 

    IWindowsFormsEditorService editorService; 

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
     { 
      // ... 
      editorService = edSvc ; // so can be referenced in the click event handler 

      ListBox lb = new ListBox(); 
      lb.Click += new EventHandler(lb_Click); 
      // ... 
     } 



    void lb_Click(object sender, EventArgs e) 
    { 
     editorService.CloseDropDown(); 
    } 

}