【问题标题】:Non-abstract event defined in abstract class won't show in Designer for derived classes抽象类中定义的非抽象事件不会在派生类的设计器中显示
【发布时间】:2009-05-21 16:24:01
【问题描述】:

我正在使用下面列出的类来创建一个包装 ComboBox 的 UserControl,该 ComboBox 可以接受 List 并在更改内部 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 之外设置它,要么弄清楚如何让它成为序列化。

【问题讨论】:

    标签: c# winforms generics user-controls abstract


    【解决方案1】:

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

    【讨论】:

    • 刷新以查看您的答案。我已经删除了我的。如果您的意图是这样,您可能想要提及使用受保护的或内部构造函数来限制基类的使用。此外,在空虚中抛出 NotImplementedException 或 NotSupportedException。
    • 我曾考虑过这一点,因为设计师之前曾告诉我没有没有参数的公共构造函数。不幸的是,在使类非抽象的同时使这两个方法成为虚拟方法仍然不会让事件出现在设计器中,并且我失去了编译时检查以确保函数已实现。
    猜你喜欢
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2020-05-11
    • 2012-09-16
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多