抽象类中定义的非抽象事件不会在Designer中显示派生类

时间:2009-05-21 16:24:01

标签: c# winforms generics user-controls abstract

我正在使用下面列出的类创建一个UserControl,它包含一个可以接受List< T>的ComboBox。并在更改内部ComboBox的选择时返回类型为T的对象。

代码中的一切都运行正常,正如我所期望的那样,但是当使用我的控件时,我无法再使用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)时,它假定它是表单下的成员或类,而不是命名空间。换句话说,它认为它正在寻找不存在的UserComboTest.UserComboTest.UserDropDownList。将表单重命名为UserComboTest.UserComboTestForm解决了问题的一半。

仍然存在设计师没有显示SelectedItemChanged事件的事实,如果我手动设置它,它会被删除,所以我要么必须在InitializeComponent之外设置它,要么弄清楚如何让它成为序列

1 个答案:

答案 0 :(得分:2)

通常,winforms设计者对抽象基类反应很差。您应该将抽象方法转换为空虚方法,并使该类非抽象。