2017-04-03 4 views
2

Lors de l'utilisation de dataView.RowFilter, j'obtiens toujours le résultat filtré, y compris le dernier élément de l'ensemble de données.DataView rowfilter inclut toujours le dernier élément de l'ensemble

J'ai un ensemble de données de test:

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

Création du 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); 
} 

réglage du filtre et source de données:

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

Cela devrait retourner seulement Hans comme résultat, mais pour moi cela donne les résultats: Hans et Ludo.

Si je filtre sur 'Ludo', il en résulte seulement 'Ludo'. Pourquoi renvoie-t-il toujours le dernier élément et comment puis-je m'assurer qu'il ne renvoie que l'ensemble filtré?

-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

Je teste votre code, et je n'ai pas une surcharge pour 'DatView.AddNew (arg1, arg2, arg3)', juste [DatView.AddNew()] (https://msdn.microsoft .com/fr-fr/library/system.data.dataview.addnew (v = vs.110) .aspx). Avez-vous remplacé cette méthode dans un espace de noms différent? – djv

+0

Lors du remplissage du datatable au lieu de dataView, puis de la création de l'aperçu de données à partir du DataTable rempli, cela fonctionne. – Chevalric

+0

@djv Oui, je suis désolé, c'est une fonction que j'utilise pour ne pas avoir à assigner chaque colonne elle-même. Au lieu de cela j'ai fait une extension qui boucle sur les paramètres pour assigner les valeurs. – Chevalric

Répondre

0

Il y a une exception que d'autres semblent avoir

DataTable doit être réglé avant d'utiliser DataView

(je vous suggère de le mettre dans un moteur de recherche)

Bien que vous n'ayez pas l'exception, y Vous devriez suivre cet ordre.

Heureusement, la configuration de DataTable avant DataView peut être effectuée avec moins de code et sans méthode d'extension.

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

Merci pour votre explication claire et vos recherches. Cela éclaircit les choses. – Chevalric