2010-11-10 8 views
7

Ich muss eine List<MyClass> myList an eine DataGridView binden. Und holen Sie sich die Ergebnistabelle mit zwei Spalten ID und Name.Bindungsliste von Klassen in DataGridView

-Code-Schnipsel:

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

Ist es möglich?

+0

Sie nur gefragt, um die genaue Frage. Löschen Sie diesen. Und bearbeiten Sie die vorherige bei Bedarf. Edit: Ich sehe, du hast die vorherige gelöscht. Das ist nicht der richtige Weg, da jeder, der versucht hat, dir zu helfen, die Antworten jetzt weg sind. – leppie

+0

Sorry .. vorherige Frage war nicht korrekt .. – Yuriy

+0

Ja, ich habe einen Downvote ohne Grund und Sie löschte die Frage. –

Antwort

17

Wie wäre es mit einem anonymen Typ Bindung:

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

Wollen Sie die Daten im Datagridview updaten?

+1

WOW, sehr elegante Lösung! Vielen Dank! – Yuriy

+0

ja wird aktualisiert. Was sollen wir machen ? (für weitere Hinweise auf andere Benutzer.) –

0

Nein, Sie können dies nicht aus der Verpackung heraus tun. Sie müssen eine benutzerdefinierte Bindungsquelle (höchstwahrscheinlich mit spezieller Logik für Ihren speziellen Zweck) schreiben, um das "Bohren" tiefer als nur eine Ebene von Eigenschaften zu ermöglichen.

2

, das zu tun, ohne das Modell zu ändern außerordentlich heikel ist (aber möglich), erfordern ICustomTypeDescriptor oder TypeDescriptionProvider und eine benutzerdefinierte PropertyDescriptor. Um ehrlich zu sein: es lohnt sich nicht.

Fügen Sie einfach Pass-thru-Eigenschaften:

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

Ja, diese Lösung findet statt :) – Yuriy

+0

Hmmm, ich habe nie darüber nachgedacht, dies direkt über den TypeDescriptor zu tun, es könnte ein wenig einfacher gewesen sein als die BindingSource Route, die ich gemacht habe :) – leppie

+0

@leppie - es ist immer noch ziemlich fortgeschrittenes Zeug, obwohl –

1

Es ist mit LINQ einfach, wie Sie hier eine einfache Implementierung von etwas in This answer

sehen kann ich Datagridview befestigen benötigt.

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