2016-03-22 8 views
0

Hier ist die Sache, die ich manuell einige DataRow zu this.listBox1.Items hinzufügen und in WinForms Designer die DisplayMember zu Spaltennamen, aber alles, was ich später angezeigt wird, ist eine Liste des Namens des Typs (System.Data ...).Warum funktioniert DisplayMember nicht mit manuell hinzugefügtem DataRow in ListBox?

Wie löst man dieses Problem?

Code:

list1.ForEach(x => this.listBox1.Items.Add(x)); //x is DataRow from a filled DataTable 
+0

Können Sie Code-Snippet freigeben? – Munawar

+0

Nicht viel Code ist sehr einfach. Ich habe meine Frage bearbeitet –

Antwort

4

Die DisplayMember und ValueMember sind nur anwendbar, wenn Sie Daten verwenden Bindung (ListBox.DataSource). Sie arbeiten entweder mit realen Eigenschaften, die durch Reflektion abgerufen werden können, oder über das .NET-Komponentenmodell und die Schnittstelle ICustomTypeDescriptor.

Wenn Sie eine DataTable direkt binden, die GetEnumerator Methode und die IList Implementierung kehrt immer DataRowView Instanzen statt DataRow s. DataRowView implementiert die ICustomTypeDescriptor, wo die DisplayName einen Spaltennamen beziehen kann.

Wenn Sie also eine benutzerdefinierte gefilterte Liste hinzufügen möchten, empfehle ich Ihnen, eine aus beliebiger Quelle zu erstellen. Zum Beispiel:

listBox1.DisplayMember = "Name"; 
listBox1.ValueMember = "Value"; 

var list = Enumerable.Range(1, 10).Select(i => new {Name = i.ToString(), Value = i}).ToList(); 
listBox1.DataSource = list; 

Wenn Name Eigenschaft vorhanden ist, werden Sie seinen Wert sehen; Andernfalls sehen Sie die ToString der Elemente.

Wenn Sie jedoch die Elemente programmgesteuert hinzufügen (ListBox.Items), werden diese Eigenschaften ignoriert und immer die ToString der Elemente verwendet.

+0

Ich bin nicht verbindlich die Datentabelle direkt. Ich füge jede DataRow manuell in die ListBox ein. DataTable wird von einem Adapter gefüllt, bevor ich alle DataRows in die ListBox einfüge. Ich möchte mit DataRow arbeiten und nicht mit einem anonymen Typ –

+0

Warum binden Sie dann nicht einfach die 'DataTable' an? Oder wenn Sie die Elemente manuell hinzufügen, warum bestehen Sie auf der 'DataRow'-Liste statt einer String-Liste oder einer benutzerdefinierten Typenliste mit sinnvollen' ToString'-Methode? 'DisplayMember' ist nur für die Datenbindung anwendbar. – taffer

+0

Ich muss manuell hinzufügen. Das ist genau wie es ist –

2

Geben Sie die Spaltennamen, die Sie Ihr Listenfeld hinzufügen mögen:

list1.ForEach(x => this.listBox1.Items.Add(x["column_name"])); 
+1

list1.ForEach (x => this.listBox1.Items.Add (x ["GroupName"])); funktioniert, aber das ausgewählte Element ist später dann eine einfache Zeichenfolge und ich brauche die komplette Zeile, um mit anderen Spalten wie Gruppen-ID zu arbeiten. –

+0

Müssen Sie die Zeilen zeilenweise hinzufügen? Ich denke, die Listbox zu binden wäre klarer und einfacher zu handhaben. – Roman

+0

muss ich. Es ist genau so wie es ist. –

Verwandte Themen