2009-05-21 2 views
1

아래 나열된 클래스를 사용하여 <T> 목록을 허용하고 T 유형의 객체를 반환 할 수있는 ComboBox를 래핑하는 UserControl을 만듭니다. 내부 ComboBox의 선택이 변경되면추상 클래스에서 정의 된 추상화되지 않은 이벤트는 파생 클래스 용으로 표시되지 않습니다.

모든 것이 코드에서 올바르게 작동하지만 예상대로 정확하게 작동하지만 SelectedItemChanged 이벤트가 내 컨트롤을 사용할 때 더 이상 Designer에 표시되지 않습니다. 추상 기본 클래스가 추상이 아닌 경우에는 정상적으로 작동하지만 5 개의 본질적으로 중복 된 컨트롤을 하나로 압축하려고합니다.

중요하지 않은 부품을 잘라 냈습니다.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace UserComboTest 
{ 
    public abstract partial class DropDownList<T> : UserControl where T : class 
    { 
     protected abstract int FindIndex(T item); 
     public abstract void Populate(List<T> items, T defaultItem); 

     [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), Browsable(true)] 
     public event EventHandler<SelectedItemEventArgs> SelectedItemChanged; 

     private void comboBox_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (null != SelectedItemChanged) 
      { 
       SelectedItemChanged(this, new SelectedItemEventArgs(Selected)); 
      } 
     } 

     public class SelectedItemEventArgs : EventArgs 
     { 
      public SelectedItemEventArgs(T selectedItem) 
      { 
       Selected = selectedItem; 
      } 

      public T Selected { get; private set; } 
     } 
    } 

    public class UserDropDownList : DropDownList<User> 
    { 
     protected override int FindIndex(User user) 
     { 
      // find index for item 
     } 

     public override void Populate(List<User> users, User defaultUser) 
     { 
      // populate the list 
     } 
    } 
} 

편집은 : 코드를 깨는 문제가 해결되었습니다. 내 네임 스페이스와 폼 모두 UserComboTest로 지정되었으므로 정규화 된 타입 이름 (UserComboTest.UserDropDownList)을 serialize 할 때 네임 스페이스가 아닌 폼 아래의 멤버 또는 클래스라고 가정합니다. 즉, 존재하지 않는 UserComboTest.UserComboTest.UserDropDownList를 찾고 있다고 생각했습니다. UserComboTest.UserComboTestForm으로 폼의 이름을 변경하면 문제의 절반이 해결되었습니다.

디자이너가 SelectedItemChanged 이벤트를 표시하지 않는다는 사실은 여전히 ​​남아 있습니다. 수동으로 설정하면 제거되어 InitializeComponent 외부에서 설정하거나 가져 오는 방법을 찾아야합니다. 직렬화된다.

답변

2

일반적으로 winforms 디자이너는 추상 기본 클래스에 심하게 반응합니다. 추상 메소드를 빈 가상 메소드로 변환하고 클래스를 비 추상화해야합니다.

+1

답변을보기 위해 새로 고침되었습니다. 내 것을 삭제했습니다. 기본 클래스의 사용을 제한하기 위해 보호되거나 내부적 인 생성자가 필요하다고 생각할 수 있습니다. 또, 빈 가상 클래스 내에 NotImplementedException 또는 NotSupportedException를 throw합니다. –

+0

디자이너는 나에게 인수가없는 공개 생성자가 없다는 사실을 알기 전에 생각했습니다. 불행히도 클래스를 비 추상적으로 만드는 동안 두 메서드를 가상으로 만드는 것은 디자이너에서 이벤트를 표시하지 못하게하고 함수가 구현되었는지 확인하기 위해 컴파일 타임 검사를 잃게됩니다. –