1

.NET3.5を使用しています

  1. 抽象クラスPersonから継承するクラスMemberがあります

    public class Member : Person
    {
        public int Number { get; set; }
        public string LastName { get; set; }
        public string OtherNames { get; set; }
    }
    
  2. 私はBindingListを次のように宣言しました:

    BindingList<Person> p_List = new BindingList<Person>();
    
  3. 次のような列を持つDataGridViewがあります。

    col1.DataPropertyName = "Number";
    col2.DataPropertyName = "LastName";
    col3.DataPropertyName = "OtherNames";
    
  4. メンバーオブジェクトのリストからバインディングリストを2に入力します。次に、次のようにBindingListをdatagridviewにバインドします。

    this.dgListView.DataSource = p_List;
    

datagridviewには、3つの列と、メンバーの数と同じ数の行があります。ただし、セルにはデータがありません。その理由は、Memberの3つのプロパティが親(Person)に利用できないためだと思います。「Member-Typed」BindingListm_Listを作成し、「Person-Typed」p_Listをループして入力すると、datagridviewは問題なく入力されます。(以下のコードを参照してください)。

        BindingList<Member> m_List = new BindingList<Member>();
        foreach (Person p in p_Plist)
        {
            Member m = (Member)p;
            m_List.Add(m);
        }
        this.dgListView.DataSource = m_List;

ただし、いくつかの理由から、これは避けたいと思います。主な理由は、p_Listが、Person型のさまざまなオブジェクトにアクセスするために使用しているクラスのプロパティであるためです。これらの各オブジェクトは、異なるウィンドウフォームに関連付けられています。したがって、オブジェクトクラスがPersonクラスを継承している限り、p_Listを使用してオブジェクトを関連する形式で表示したいと思います。また、2つのコピー(m_Listとp_List)を維持したくないのは、一方から並べ替え、追加、削除、またはフィルタリングすると、もう一方で並べ替えを強制されるためです。datagridviewにプロパティを検出させて、BindingList<Person>バインドされているかのようにデータを入力できるようにする方法はありBindingList<Member>ますか?

4

1 に答える 1

0

Personまず、これらのプロパティをクラスで定義する必要があります。クラスでそれらをオーバーライドする場合は、MemberクラスでプロパティをPerson仮想化し、次にオーバーライドするときにオーバーライド修飾子を使用する必要がありますMember

        public class Person {
            public virtual int Number { get; set; }
            public virtual string LastName { get; set; }
            public virtual string OtherNames { get; set; }
        }

        public class Member : Person {
            public override int Number { get; set; }
            public override string LastName { get; set; }
            public override string OtherNames { get; set; }
        }

Personただし、すべての派生エンティティがプロパティを共有してNumberいる場合、ポリモーフィズムは必要ありませんLastName。またOtherNames、それらの値を設定するだけで済みます。

于 2013-01-04T10:17:35.723 に答える