Я использую класс, указанный ниже, чтобы создать UserControl, обертывающий ComboBox, который может принимать список и возвращать объект типа T при изменении внутреннего выбора 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
}
}
}
EDIT : исправлена проблема с нарушением кода. Оказалось, что и мое пространство имен, и форма были названы UserComboTest, поэтому, когда он сериализовал полное имя типа (UserComboTest.UserDropDownList), он предположил, что это член или класс в форме, а не пространство имен. Другими словами, он думал, что ищет UserComboTest.UserComboTest.UserDropDownList, который не существует. Переименование формы в UserComboTest.UserComboTestForm решило эту половину проблемы.
Все еще остается тот факт, что дизайнер не показывает событие SelectedItemChanged, и если я устанавливаю его вручную, оно удаляется, поэтому я должен либо установить его вне InitializeComponent, либо выяснить, как его получить сериализованная.