2017-12-12 189 views
7

Mam System.Windows.Forms.Listbox i kolekcję wartości typu krotki, które utworzyłem. To znaczy the new tuple type introduced in C# 7.0. Próbuję powiązać kolekcję z Listbox i ustawić DisplayMember na jeden z elementów krotki. Oto przykład:Jak powiązać kolekcję wartości krotek C# 7.0 z System.Windows.Forms.Listbox i ustawić element wyświetlania na jeden z elementów?

var l = new List<(string name, int ID)>() 
{ 
    ("Bob", 1), 
    ("Mary", 2), 
    ("Beth", 3) 
}; 

listBox1.DataSource = l; 
listBox1.DisplayMember = "name"; 

To jednak nie działa. Ze starszym stylu Tuple<T> można podobno zrobić co opisano in this answer:

listBox1.DisplayMember = "Item1"; 
listBox1.ValueMember = "Item3"; // optional 

To nie działa. Oto, co widzę w obu przypadkach:

enter image description here

W jaki sposób można to osiągnąć?

Odpowiedz

7

Odpowiedź Ivana na pewno opisuje przypadek. Jako obejście można użyć Format wydarzenie ListBox pokazać name Sporządzony:

private void listBox1_Format(object sender, ListControlConvertEventArgs e) 
{ 
    e.Value = (((string name, int ID))e.ListItem).name; 
} 
+0

Dziękuję, to sprytne obejście. –

8

Niestety C# 7 krotki wartość nie może być używany do wiązania, ponieważ używają fields danych, podczas gdy Windows Forms standardowe dane wiążące działa tylko z właściwości.

+0

Dzięki za wyjaśnienie, Ivan. –