Comment filtrer un DataSetCet astuce permet de filtrer de deux manières différentes les tables contenues dans un DataSetDataSet DataView Filtrer Filter RowFilter SelectMathieu Kempémathieukempe@hotmail.com Dans un premier exemple on va recrée une nouvelle table qui ne contient que les données filtrées. Alors que dans le deuxième on crée uniquement une vue avec les données filtrées. Cet astuce permet de trier dans un DataSet des Tables issues d'un SGBDR ainsi que de filtrer un document XML sans utiliser XPath. Les données que nous allons utiliser sont stockées dans un document XML de cette forme: <?xml version="1.0" encoding="utf-8" ?> <contacts> <contact name="Mathieu" phone="222222222222" adress="9 rue de Gournod"> <description>The description of the contact</description> </contact> <contact name="Jean" phone="889898989898" adress="67 rue de Bruges"> <description>The description of the contact</description> </contact> <contact name="Mickey" phone="7879878789897" adress="45 rue des Souris"> <description>The description of the contact</description> </contact> <contact name="Mathieu" phone="1111111111111" adress="25 rue de Valjean"> <description>The description of the contact</description> </contact> <contact name="Mathieu" phone="444444444444" adress="37 bbg de dotnet"> <description>The description of the contact</description> </contact> </contacts> Le code: using System; using System.Data; namespace DSFilter { class Class1 { [STAThread] static void Main(string[] args) { string search="name = 'Mathieu' or name Like '%math%'"; string sort="phone DESC"; DataSet ds = new DataSet(); // on remplit le dataset avec le contenu du document XML ds.ReadXml(@"C:\Data.xml"); //en utilisant la méthode Select de la classe DataTable on récupère les lignes //répondant aux critères. DataRow[] rows = ds.Tables[0].Select(search,sort); // on crée un copie avec le meta donnée de la DataTable qui nous intéresse DataTable resultTable = ds.Tables[0].Clone(); // puis on la remplit avec le tableau de DataRow foreach(DataRow row in rows) resultTable.ImportRow(row); //voila nous avons notre nouveau DataSet avec sa DataTable filtré DisplayData(resultTable); //Dans le cas d'une dataview cela différe puisque là il s'agit uniquement de ne pas //afficher certaines lignes, on ne crée pas de nouvelle DataTable ici. DataView dv = new DataView(); dv.Table = ds.Tables[0]; //on spécifie la prorpiété RowFilter avec la valeur recherchée dv.RowFilter = search; //fixe la manière dont les lignes sont triées dv.Sort = "phone ASC"; DisplayData(dv); } //les 2 méthodes permettant d'afficher dans la console //le contenu de la dataview et la datatable public static void DisplayData(DataView dv) { Console.WriteLine("Affichage de la DataView"); for (int i = 0; i < dv.Count; i++) { for(int j = 0; j < dv.Table.Columns.Count; j++) Console.Write("{0} -", dv[i][j].ToString()); } Console.WriteLine("\n Fini"); } public static void DisplayData(DataTable dt) { Console.WriteLine("Affichage de la nouvelle DataTable"); foreach (DataRow row in dt.Rows) { foreach( DataColumn col in dt.Columns ) { Console.Write("{0}-", row[col]); } Console.Write("\n"); } Console.WriteLine("\n Fini"); } } }