ListBox, список различных объектов, реализующих один и тот же интерфейс - PullRequest
3 голосов
/ 20 января 2010

У меня есть два объекта: Пользователь и Клиент, оба реализуют интерфейс IMember

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

В форме я устанавливаю источник данных ListBox:

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

И происходят странные вещи;) КогдаЯ запускаю программу первый объект, который является типом пользователя, отображается правильно (Адриан Серафин) и другие объекты, которые являются типом контакта, отображаются так:

MyProject.Client#20
MyProject.Client#40

как для отображения был вызов ToString () наих.

Я не могу использовать список различных объектов, реализующих тот же интерфейс, что и источник данных в ListBox, или я здесь допустил ошибку?

Ответы [ 2 ]

1 голос
/ 20 января 2010

Вы уверены, это List<IMember>, а не ArrayList?Это имеет большое значение, поскольку существование не object открытого индексатора (public SomeType this[int] {get;set;}) дает большое различиеСледующее работает отлично:

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
                }
            }
        });

    }
}
0 голосов
/ 20 января 2010

Члены являются собственностью класса 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; }
         }
    }

Я использую AR, поэтому список участников должен быть IList, а под ним не List, а NHibernate.Collection.Generic.PersistentGenericBag [Interfaces.IMember]. Это имеет значение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...