2017-04-03 2 views
2

Bei Verwendung von dataView.RowFilter erhalte ich immer das gefilterte Ergebnis einschließlich des letzten Elements des Datensatzes.DataView-Zeilenfilter enthält immer den letzten Satz

ich einen Test-Datensatz haben:

private TestClass[] items = 
{ 
    new TestClass{name = "Hans", age = 10 }, 
    new TestClass{name = "Bert", age = 5 }, 
    new TestClass{name = "Gerda", age = 41 }, 
    new TestClass{name = "Dolf", age = 73 }, 
    new TestClass{name = "Ludo", age = 35 }, 
}; 

Erstellen der Dataview:

DataTable dataTable = new DataTable(); 
dataTable.Columns.Add("Name", typeof(string)); 
dataTable.Columns.Add("Age", typeof(int)); 
dataTable.Columns.Add("TestItem", typeof(TestClass)); 
DataView dataView = new DataView(dataTable); 

foreach(var item in items) 
{ 
    dataView.AddNew(item.name, item.age, item); 
} 

den Filter und Datenquelle einstellen:

dataView.RowFilter = "[Name] = 'Hans'"; 
comboBox1.DisplayMember = "Name"; 
comboBox1.ValueMember = "TestItem"; 
comboBox1.DataSource = dataView; 

Dies sollte nur Hans als Ergebnis zurück, sondern für mir das gibt die Ergebnisse: Hans und Ludo.

Wenn ich auf 'Ludo' filtere, ergibt es nur 'Ludo'. Warum gibt es immer das letzte Element zurück und wie kann ich sicherstellen, dass es nur das gefilterte Set zurückgibt?

-edit

public static class DataViewExtensions 
{ 
    public static DataRowView AddNew(this DataView dataView, params object[] parameters) 
    { 
     DataRowView dataRowView = dataView.AddNew(); 

     int index = 0; 
     foreach (var parameter in parameters) 
     { 
      dataRowView[index++] = parameter; 
     } 

     return dataRowView; 
    } 
} 
+0

ich Ihren Code zu testen, und ich habe nicht eine Überlastung für 'DatView.AddNew (arg1, arg2, arg3)', nur [DatView.AddNew()] (https://msdn.microsoft .com/de-de/library/system.data.dataview.addnew (v = vs.110) .aspx). Haben Sie diese Methode in einem anderen Namespace überschrieben? – djv

+0

Wenn Sie die Datentabelle anstelle von dataView ausfüllen und dann die Datenansicht aus der gefüllten DataTable erstellen, funktioniert sie. – Chevalric

+0

@djv Ja, tut mir leid, dass es eine Funktion ist, die ich benutze, um nicht jede Spalte selbst zuweisen zu müssen. Stattdessen habe ich eine Erweiterung erstellt, die die Parameter überspringt, um die Werte zuzuordnen. – Chevalric

Antwort

0

Es ist eine Ausnahme, die anderen scheinen zu bekommen

Datatable muss vor der Verwendung von Dataview

(Ich schlage vor, Sie in ein, dass setzen eingestellt werden Suchmaschine)

Obwohl Sie die Ausnahme nicht erhalten, y Sie sollten dieser Reihenfolge folgen.

Glücklicherweise kann das Einrichten der DataTable vor der DataView mit weniger Code und keine Erweiterungsmethode erfolgen.

TestClass[] items = 
{ 
    new TestClass{name = "Hans", age = 10 }, 
    new TestClass{name = "Bert", age = 5 }, 
    new TestClass{name = "Gerda", age = 41 }, 
    new TestClass{name = "Dolf", age = 73 }, 
    new TestClass{name = "Ludo", age = 35 }, 
}; 

DataTable dataTable = new DataTable(); 
dataTable.Columns.Add("Name", typeof(string)); 
dataTable.Columns.Add("Age", typeof(int)); 
dataTable.Columns.Add("TestItem", typeof(TestClass)); 

// set up the DataTable first 
foreach (var item in items) 
{ 
    dataTable.Rows.Add(item.name, item.age, item); 
} 

// then use the DataView 
DataView dataView = new DataView(dataTable); 

dataView.RowFilter = "[Name] = 'Hans'"; 

comboBox1.DisplayMember = "Name"; 
comboBox1.ValueMember = "TestItem"; 
comboBox1.DataSource = dataView; 
+0

Vielen Dank für Ihre klare Erklärung und Forschung. Das macht die Dinge klar. – Chevalric

Verwandte Themen