2010-11-10 18 views
7

Muszę związać List<MyClass> myList z DataGridView. I dostać się do tabeli wyników z dwoma kolumnami ID i Name.Powiąż listę klas do DataGridView

Fragmenty kodu:

private List<MyClass> myList = new List<MyClass>(){...}; 

public void BindClass() 
{ 
    dataGridView.DataSource = myList; 
} 

public MyClass 
{ 
    public MyDataClass Data{ get; set; } 
} 

public MyDataClass 
{ 
    public string ID { get; set; } 
    public string Name { get; set; } 
} 

Czy to możliwe?

+0

Po prostu zapytałem dokładnie pytanie. Usuń ten. W razie potrzeby edytuj poprzednią. Edycja: widzę, że usunąłeś poprzedni. To nie jest poprawny sposób, ponieważ wszyscy, którzy próbowali ci pomóc, odpowiedzi już nie istnieją. – leppie

+0

Przepraszamy. Poprzednie pytanie nie było poprawne. – Yuriy

+0

Tak Otrzymałem odpowiedź bez powodu, a ty usunąłeś to pytanie. –

Odpowiedz

17

Jak o wiązanie z typ anonimowy:

public void BindClass() 
{ 
    dataGridView1.DataSource = myList.Select(myClass => new {myClass.Data.ID, myClass.Data.Name}).ToList(); 
} 

Będziesz aktualizacji danych w DataGridView?

+1

WOW, bardzo eleganckie rozwiązanie! Dzięki! – Yuriy

+0

Tak źle. co powinniśmy zrobić ? (dla dalszego odniesienia do innych użytkowników). –

0

Nie, nie można tego zrobić po wyjęciu z pudełka. Będziesz musiał napisać niestandardowe źródło bindowania (najprawdopodobniej ze specjalistyczną logiką do określonego celu), aby umożliwić "wiercenie" głębsze niż tylko 1 poziom właściwości.

2

Aby to zrobić bez zmiany modelu jest wyjątkowo trudne (ale możliwe), wymagające ICustomTypeDescriptor lub TypeDescriptionProvider i zwyczaj PropertyDescriptor. Szczerze mówiąc: nie warto.

Wystarczy dodać pass-thru właściwości:

public MyClass 
{ 
    public MyDataClass Data{get; set;} 
    [DisplayName("ID")] 
    public string DataID { 
    get {return Data.ID;} 
    set {Data.ID = value;} 
    } 
    [DisplayName("Name")] 
    public string DataName { 
    get {return Data.Name;} 
    set {Data.Name = value;} 
    } 
} 
+0

Tak, to rozwiązanie ma miejsce :) – Yuriy

+0

Hmmm, nigdy nie myślałem o zrobieniu tego bezpośrednio przez TypeDescriptor, może to być trochę łatwiejsze niż trasa BindingSource, którą wziąłem :) – leppie

+0

@leppie - to wciąż dość zaawansowane rzeczy, chociaż –

1

Łatwo z LINQ, jak można zobaczyć w This answer

Oto prosta implementacja czegoś potrzebowałem, aby dołączyć do DataGridView.

 DataGridView1.DataSource = _ 
(From i In ItemList Select i.ListID, i.FullName, i.PurchaseDesc, i.EditSequence).ToList