简体   繁体   English

ListBox,实现相同接口的不同对象的列表

[英]ListBox, list of different objects implementing the same interface

I have two objects: User and Client, both implements interface IMember 我有两个对象:User和Client,都实现了接口IMember

interface IMember
{
     int Id { get; set; }
     string Name { get; set; }
}

In a form I set ListBox data source: 在表单中我设置了ListBox数据源:

myListBox.DisplayMember = "Name";
myListBox.ValueMember = "Id";
myListBox.DataSource = membersList; // List<IMember>

And wierd things happen ;) When I run program the first object, whichis type of User, displays correctly (Adrian Serafin) and other objects, wich are type of Contact are displayed like this: 并且发生了奇怪的事情;)当我运行程序时,第一个对象(正是这种类型的用户)正确显示(Adrian Serafin)和其他对象,其类型的联系人显示如下:

MyProject.Client#20
MyProject.Client#40

as for display was ToString() call on them. 至于显示是对它们的ToString()调用。

I can't using list of different objects implementing the same interface as datasource in ListBox or I made some mistake here? 我不能使用ListBox中实现相同接口的不同对象列表作为数据源,或者我在这里犯了一些错误?

Are you sure it is List<IMember> , and not ArrayList ? 确定它是List<IMember> ,而不是ArrayList吗? This makes a big difference, as the existence of a non- object public indexer ( public SomeType this[int] {get;set;} ) makes a big difference. 这有很大的不同,因为非object公共索引器( public SomeType this[int] {get;set;} )的存在会产生很大的不同。 The following works fine: 以下工作正常:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
interface IMember
{
    int Id { get; set; }
    string Name { get; set; }
}
class Foo : IMember
{
    public int Id { get; set; }
    public string Name { get; set; }
}
class Bar : IMember
{ // explicit, why not...
    int IMember.Id { get; set; }
    string IMember.Name { get; set; } 
}
static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        IMember bar = new Bar();
        bar.Id = 2;
        bar.Name = "def";
        var list = new List<IMember> {
            new Foo { Id = 1, Name = "abc"},
            bar,
        };
        Application.Run(new Form
        {
            Controls = {
                new ListBox {
                    Dock = DockStyle.Fill,
                    DisplayMember = "Name",
                    ValueMember = "Id",
                    DataSource = list
                }
            }
        });

    }
}

Members are property of class Event: 成员是班级活动的财产:

    [ActiveRecord("cpa_events")]
public class Event : ARBase<Event>
{
         private IList<Interfaces.IMember> _members = new List<Interfaces.IMember>();
         [HasManyToAny(typeof(Interfaces.IMember),"event_id","cpa_events_members",       typeof(int), "member_type", "member_id", MetaType=typeof(string))]
         [Any.MetaValue("User", typeof(User))]
         [Any.MetaValue("Client", typeof(Client))]
         public IList<Interfaces.IMember> Members
         {
            get { return _members; }
            set { _members = value; }
         }
    }

I'm using AR so members list has to be IList and underneath isn't List but NHibernate.Collection.Generic.PersistentGenericBag[Interfaces.IMember]. 我正在使用AR,所以成员列表必须是IList,而下面不是List而是NHibernate.Collection.Generic.PersistentGenericBag [Interfaces.IMember]。 Is this making a difference? 这有什么不同吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM