1

我正在使用 .NET 3.5

  1. 我有一个继承自抽象类 Person 的类成员

    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. 我从 Member 对象列表中填充 2 中的绑定列表。然后我将 BindingList 绑定到 datagridview,如下所示:

    this.dgListView.DataSource = p_List;
    

datagridview 有 3 列和与成员数量一样多的行。但是,单元格没有任何数据。我认为原因是因为 Member 中的 3 个属性对父级(Person)不可用。当我创建一个“Member-Typed”BindingList m_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 类型的不同对象。这些对象中的每一个都与不同的窗口窗体相关联。因此,我想使用 p_List 以相关形式显示对象,只要对象类继承自 Person 类。我也不想维护 2 个副本(m_List 和 p_List),因为如果我对其中一个进行排序、添加、删除或过滤,我将被迫对另一个进行排序。有没有办法让 datagridview 检测到属性,BindingList<Person>从而能够像绑定到一样填充它BindingList<Member>

4

1 回答 1

0

首先,这些属性应该在Person类中定义。如果你想在Member类中覆盖它们,你必须使类中的属性为Person虚拟,然后在覆盖它们时使用 override 修饰符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 回答