2009-05-21 25 views
1

List <T>を受け入れることができ、タイプTのオブジェクトを返すコンボボックスをラップする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の外に設定するか、シリアライズする。

答えて

2

一般に、winformsデザイナーは抽象基本クラスに悪影響を与えます。抽象メソッドを空の仮想メソッドに変換し、そのクラスを非抽象クラスにする必要があります。

+1

あなたの答えを確認するために更新されました。私は私を削除しました。基本クラスの使用を制限するための保護されたコンストラクタまたは内部のコンストラクタを持つことが意図されている場合は、それを言いたいことがあります。また、空の仮想オブジェクトにNotImplementedExceptionまたはNotSupportedExceptionをスローします。 –

+0

私はそれについて考えていました。なぜなら、デザイナーは議論の余地のない公共のコンストラクタを持っていないということについて前に私に唇を与えてくれたからです。残念ながら、クラスを非抽象クラスにしながら2つのメソッドを仮想化すると、デザイナーにイベントが表示されず、関数が実装されていることを確認するためにコンパイル時のチェックが失われます。 –

関連する問題