1

以下にリストされているクラスを使用して、List<T> を受け入れ、内部 ComboBox の選択が変更されたときに T 型のオブジェクトを返すことができる ComboBox をラップする UserControl を作成しています。

期待どおりにすべてがコードで正常に動作しますが、コントロールを使用しているときに SelectedItemChanged イベントをデザイナーに表示できません。抽象基本クラスが非抽象の場合は正常に機能しましたが、本質的に重複する 5 つのコントロールを 1 つに凝縮しようとしています。

重要でない部分は切り取られています。

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 の外部で設定するか、シリアル化する方法を見つける必要があります。

4

1 に答える 1

2

一般に、winformsデザイナーは、抽象基本クラスに対してひどく反応します。抽象メソッドを空の仮想メソッドに変えて、クラスを非抽象にする必要があります。

于 2009-05-21T17:04:03.973 に答える