我正在使用下面列出的类来创建一个包装 ComboBox 的 UserControl,该 ComboBox 可以接受 List<T> 并在更改内部 ComboBox 的选择时返回 T 类型的对象。
在代码中一切正常,正如我所期望的那样,但是在使用我的控件时,我无法再让 SelectedItemChanged 事件显示在设计器中。当抽象基类是非抽象的时它工作得很好,但我试图将 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)时,它假定它是表单下的成员或类,而不是命名空间。换句话说,它认为它正在寻找不存在的 UserComboTest.UserComboTest.UserDropDownList。将表单重命名为 UserComboTest.UserComboTestForm 解决了问题的一半。
仍然存在的事实是设计器没有显示 SelectedItemChanged 事件,如果我手动设置它,它会被删除,所以我要么必须在 InitializeComponent 之外设置它,要么弄清楚如何让它被序列化。