Неабстрактное событие, определенное в абстрактном классе, не будет отображаться в Designer для производных классов - PullRequest
1 голос
/ 21 мая 2009

Я использую класс, указанный ниже, чтобы создать 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, либо выяснить, как его получить сериализованная.

1 Ответ

2 голосов
/ 21 мая 2009

Обычно дизайнер winforms плохо реагирует на абстрактные базовые классы. Вы должны превратить абстрактные методы в пустые виртуальные методы и сделать класс неабстрактным.

...