2010-01-20 4 views
3

같은 인터페이스를 구현하는 다른 개체의 목록 : 사용자 및 클라이언트가 모두 구현 내가 목록 상자 데이터 소스 설정 형태로 IMember옵니다, 내가 두 개체가

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

인터페이스 :

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

을 그리고 wierd things happen;) 프로그램을 실행하면 사용자의 유형 인 첫 번째 객체가 올바르게 표시되고 (Adrian Serafin) 연락처 유형이 다음과 같이 표시됩니다.

MyProject.Client#20 
MyProject.Client#40 

으로 ToString()이 호출되었습니다.

ListBox의 데이터 소스와 동일한 인터페이스를 구현하는 다른 객체 목록을 사용할 수 없거나 여기에서 실수를 한 적이 있습니까?

+0

'연락처'란 무엇입니까? '고객'을 의미합니까? 간단한 질문 : 'Client.Name'이 올바르게 구현 되었습니까? – Kobi

+0

예, 저는 고객을 의미했습니다. 나는 그렇다고 믿는다. 클라이언트 클래스에서 ToString() 메서드를 재정의하면 this.Name listBox가 올바르게 표시됩니다. – Adrian

+0

WinForms, WebForms 또는 WPF ??? – Mikhail

답변

1

List<IMember>이고 ArrayList이 아닌가요? 이것은 object 공용 인덱서 (public SomeType this[int] {get;set;})의 존재가 이 큰 차이이되므로 큰 차이를 만듭니다. 미세 다음 작품 : 회원 목록이 나열하지만 NHibernate.Collection.Generic되지 아래 IList의이어야하고, 그래서 내가 AR을 사용하고

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

:

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

맞았습니다 : myListBox.DataSource = membersList.ToList()를 설정하면 컨트롤이 올바르게 표시됩니다. – Adrian

0

회원은 클래스 이벤트의 재산입니다 .PersistentGenericBag [Interfaces.IMember]. 이게 효과가 있니?

+0

질문을 편집하는 것이 더 좋으며 대답에 정보를 추가하지 않는 것이 좋습니다. –

+0

오케이, 죄송합니다. 다음에 할 일을하고 싶습니다. 몇 가지 코드를 넣고 싶습니다. 의견에 대답이 없으므로 처음 추측 할 때 답을 추가하는 것이 었습니다. – Adrian