아래 나열된 클래스를 사용하여 <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 외부에서 설정하거나 가져 오는 방법을 찾아야합니다. 직렬화된다.
답변을보기 위해 새로 고침되었습니다. 내 것을 삭제했습니다. 기본 클래스의 사용을 제한하기 위해 보호되거나 내부적 인 생성자가 필요하다고 생각할 수 있습니다. 또, 빈 가상 클래스 내에 NotImplementedException 또는 NotSupportedException를 throw합니다. –
디자이너는 나에게 인수가없는 공개 생성자가 없다는 사실을 알기 전에 생각했습니다. 불행히도 클래스를 비 추상적으로 만드는 동안 두 메서드를 가상으로 만드는 것은 디자이너에서 이벤트를 표시하지 못하게하고 함수가 구현되었는지 확인하기 위해 컴파일 타임 검사를 잃게됩니다. –